[josm] 01/06: Imported Upstream version 0.0.svn11514+dfsg

Bas Couwenberg sebastic at debian.org
Tue Jan 31 07:11:49 UTC 2017


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

sebastic pushed a commit to branch master
in repository josm.

commit aa8882abdfc93e354fac1c305ef67f63ab070938
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Jan 31 07:39:26 2017 +0100

    Imported Upstream version 0.0.svn11514+dfsg
---
 .classpath                                         |   12 +-
 Dockerfile                                         |   13 +
 README                                             |    4 +-
 REVISION                                           |    8 +-
 build.xml                                          |    9 +-
 data/boundaries.osm                                |  566 +++----
 data/defaultpresets.xml                            |    2 +
 data/gpx/brown2green.txt                           |   15 +
 data/gpx/inferno.txt                               |  267 ++++
 data/gpx/red2blue.txt                              |   18 +
 data/gpx/viridis.txt                               |  267 ++++
 data/validator/combinations.mapcss                 |   14 +-
 data/validator/deprecated.mapcss                   |    6 +
 data/validator/geometry.mapcss                     |   12 +-
 data/validator/highway.mapcss                      |    7 -
 data/validator/ignoretags.cfg                      |    9 +
 data/validator/territories.mapcss                  |   10 +
 data/validator/unnecessary.mapcss                  |    8 +
 data_nodist/trans/ast.lang                         |  Bin 8864 -> 8866 bytes
 data_nodist/trans/be.lang                          |  Bin 18451 -> 18529 bytes
 data_nodist/trans/bg.lang                          |  Bin 2427 -> 2429 bytes
 data_nodist/trans/ca-valencia.lang                 |  Bin 7807 -> 7809 bytes
 data_nodist/trans/ca.lang                          |  Bin 10526 -> 10528 bytes
 data_nodist/trans/cs.lang                          |  Bin 11260 -> 11298 bytes
 data_nodist/trans/da.lang                          |  Bin 10550 -> 10603 bytes
 data_nodist/trans/de.lang                          |  Bin 11879 -> 11937 bytes
 data_nodist/trans/el.lang                          |  Bin 1429 -> 1431 bytes
 data_nodist/trans/en.lang                          |  Bin 9694 -> 9743 bytes
 data_nodist/trans/en_AU.lang                       |  Bin 1514 -> 1516 bytes
 data_nodist/trans/en_GB.lang                       |  Bin 2106 -> 2108 bytes
 data_nodist/trans/es.lang                          |  Bin 12549 -> 12551 bytes
 data_nodist/trans/et.lang                          |  Bin 1406 -> 1408 bytes
 data_nodist/trans/fi.lang                          |  Bin 3027 -> 3029 bytes
 data_nodist/trans/fr.lang                          |  Bin 11393 -> 11395 bytes
 data_nodist/trans/gl.lang                          |  Bin 2977 -> 2979 bytes
 data_nodist/trans/hu.lang                          |  Bin 12588 -> 12590 bytes
 data_nodist/trans/id.lang                          |  Bin 6717 -> 6719 bytes
 data_nodist/trans/it.lang                          |  Bin 10416 -> 10418 bytes
 data_nodist/trans/ja.lang                          |  Bin 11732 -> 11734 bytes
 data_nodist/trans/km.lang                          |  Bin 16887 -> 16889 bytes
 data_nodist/trans/lt.lang                          |  Bin 2035 -> 2037 bytes
 data_nodist/trans/nb.lang                          |  Bin 1705 -> 1707 bytes
 data_nodist/trans/nl.lang                          |  Bin 12338 -> 12447 bytes
 data_nodist/trans/pl.lang                          |  Bin 2861 -> 2856 bytes
 data_nodist/trans/pt.lang                          |  Bin 13586 -> 13588 bytes
 data_nodist/trans/pt_BR.lang                       |  Bin 10176 -> 10175 bytes
 data_nodist/trans/ru.lang                          |  Bin 18495 -> 18583 bytes
 data_nodist/trans/sk.lang                          |  Bin 10522 -> 10557 bytes
 data_nodist/trans/sv.lang                          |  Bin 1328 -> 1330 bytes
 data_nodist/trans/uk.lang                          |  Bin 18831 -> 18940 bytes
 data_nodist/trans/vi.lang                          |  Bin 10753 -> 10755 bytes
 data_nodist/trans/zh_CN.lang                       |  Bin 7586 -> 7588 bytes
 data_nodist/trans/zh_TW.lang                       |  Bin 4822 -> 4839 bytes
 docker-test.bat                                    |    6 +
 docker-test.sh                                     |    5 +
 i18n/po/af.po                                      |   76 +-
 i18n/po/am.po                                      |   76 +-
 i18n/po/ar.po                                      |   78 +-
 i18n/po/ast.po                                     |   92 +-
 i18n/po/az.po                                      |   76 +-
 i18n/po/be.po                                      |  187 ++-
 i18n/po/bg.po                                      |   82 +-
 i18n/po/bn.po                                      |   76 +-
 i18n/po/br.po                                      |   76 +-
 i18n/po/bs.po                                      |   76 +-
 i18n/po/ca.po                                      |   93 +-
 i18n/po/ca at valencia.po                             |   84 +-
 i18n/po/cs.po                                      |  144 +-
 i18n/po/cy.po                                      |   76 +-
 i18n/po/da.po                                      |  130 +-
 i18n/po/de.po                                      |  189 ++-
 i18n/po/de_DE.po                                   |   76 +-
 i18n/po/el.po                                      |   78 +-
 i18n/po/en_AU.po                                   |   91 +-
 i18n/po/en_CA.po                                   |   76 +-
 i18n/po/en_GB.po                                   |   93 +-
 i18n/po/eo.po                                      |   76 +-
 i18n/po/es.po                                      |  161 +-
 i18n/po/et.po                                      |   86 +-
 i18n/po/eu.po                                      |   78 +-
 i18n/po/fa.po                                      |   76 +-
 i18n/po/fi.po                                      |   88 +-
 i18n/po/fil.po                                     |   76 +-
 i18n/po/fo.po                                      |   76 +-
 i18n/po/fr.po                                      |  126 +-
 i18n/po/ga.po                                      |   76 +-
 i18n/po/gl.po                                      |   80 +-
 i18n/po/he.po                                      |   78 +-
 i18n/po/hi.po                                      |   76 +-
 i18n/po/hr.po                                      |   76 +-
 i18n/po/ht.po                                      |   76 +-
 i18n/po/hu.po                                      |   90 +-
 i18n/po/hy.po                                      |   76 +-
 i18n/po/ia.po                                      |   76 +-
 i18n/po/id.po                                      |   84 +-
 i18n/po/is.po                                      |   78 +-
 i18n/po/it.po                                      |  145 +-
 i18n/po/ja.po                                      |  100 +-
 i18n/po/ka.po                                      |   76 +-
 i18n/po/km.po                                      |   90 +-
 i18n/po/ko.po                                      |   76 +-
 i18n/po/ky.po                                      |   76 +-
 i18n/po/lb.po                                      |   76 +-
 i18n/po/lo.po                                      |   76 +-
 i18n/po/lt.po                                      |   92 +-
 i18n/po/lv.po                                      |   76 +-
 i18n/po/mk.po                                      |   76 +-
 i18n/po/mr.po                                      |   76 +-
 i18n/po/ms.po                                      |   76 +-
 i18n/po/nb.po                                      |   80 +-
 i18n/po/nds.po                                     |   78 +-
 i18n/po/nl.po                                      |  183 ++-
 i18n/po/nn.po                                      |   76 +-
 i18n/po/oc.po                                      |   76 +-
 i18n/po/pa.po                                      |   76 +-
 i18n/po/pl.po                                      |  267 ++--
 i18n/po/pt.po                                      |   94 +-
 i18n/po/pt_BR.po                                   |  118 +-
 i18n/po/rm.po                                      |   76 +-
 i18n/po/ro.po                                      |   76 +-
 i18n/po/ru.po                                      |  128 +-
 i18n/po/sk.po                                      |  137 +-
 i18n/po/sl.po                                      |   76 +-
 i18n/po/sq.po                                      |   76 +-
 i18n/po/sr.po                                      |   76 +-
 i18n/po/sv.po                                      |   80 +-
 i18n/po/ta.po                                      |   76 +-
 i18n/po/te.po                                      |   76 +-
 i18n/po/th.po                                      |   76 +-
 i18n/po/tr.po                                      |   78 +-
 i18n/po/ug.po                                      |   76 +-
 i18n/po/uk.po                                      |   99 +-
 i18n/po/ur.po                                      |   76 +-
 i18n/po/vi.po                                      |   94 +-
 i18n/po/wae.po                                     |   76 +-
 i18n/po/zh_CN.po                                   |   94 +-
 i18n/po/zh_TW.po                                   |   84 +-
 netbeans/nbproject/project.properties              |   20 +-
 .../remote/AbstractRemoteAuxiliaryCache.java       |   16 +-
 .../jcs/engine/AbstractCacheEventQueue.java        |   81 +-
 .../apache/commons/jcs/engine/CacheEventQueue.java |  232 +--
 .../commons/jcs/engine/ElementAttributes.java      |    4 +-
 .../commons/jcs/engine/PooledCacheEventQueue.java  |   45 +-
 .../commons/jcs/engine/control/CompositeCache.java |    2 +-
 .../engine/control/event/ElementEventQueue.java    |   18 +-
 .../AbstractDoubleLinkedListMemoryCache.java       |  222 +--
 .../jcs/engine/memory/AbstractMemoryCache.java     |  254 ++-
 .../jcs/engine/memory/lru/LHMLRUMemoryCache.java   |  127 +-
 .../memory/soft/SoftReferenceMemoryCache.java      |  157 +-
 .../util/DefaultMemoryElementDescriptor.java       |   16 +-
 .../memory/util/MemoryElementDescriptor.java       |   12 +-
 .../util/SoftReferenceElementDescriptor.java       |    2 +-
 .../jcs/utils/discovery/UDPDiscoveryReceiver.java  |   16 +-
 .../jcs/utils/threadpool/PoolConfiguration.java    |   41 +-
 .../jcs/utils/threadpool/ThreadPoolManager.java    |  299 ++--
 src/org/openstreetmap/josm/Main.java               |    4 +-
 .../josm/actions/JoinAreasAction.java              |    2 +-
 .../josm/actions/MergeNodesAction.java             |   10 +-
 .../josm/actions/ShowStatusReportAction.java       |    3 +
 .../josm/actions/SimplifyWayAction.java            |   15 +-
 .../openstreetmap/josm/actions/SplitWayAction.java |    2 +-
 .../josm/actions/audio/AudioPlayPauseAction.java   |    2 +-
 .../josm/actions/mapmode/DrawAction.java           |  505 +-----
 .../josm/actions/mapmode/DrawSnapHelper.java       |  563 +++++++
 .../josm/actions/mapmode/ExtrudeAction.java        |    4 +-
 .../josm/actions/mapmode/SelectAction.java         |    6 +-
 .../josm/actions/search/SearchAction.java          |    9 +-
 .../josm/actions/search/SearchCompiler.java        |  119 +-
 .../conflict/CoordinateConflictResolveCommand.java |    3 +-
 .../DeletedStateConflictResolveCommand.java        |    3 +-
 src/org/openstreetmap/josm/data/Preferences.java   |   17 +-
 .../josm/data/SystemOfMeasurement.java             |    2 +-
 .../josm/data/cache/HostLimitQueue.java            |   70 +-
 .../josm/data/coor/CoordinateFormat.java           |    5 +-
 .../CachedAttributionBingAerialTileSource.java     |   12 +
 .../data/imagery/GetCapabilitiesParseHelper.java   |    4 +-
 .../josm/data/imagery/TMSCachedTileLoader.java     |   15 +-
 .../josm/data/imagery/TMSCachedTileLoaderJob.java  |    2 +-
 .../josm/data/imagery/WMSCachedTileLoader.java     |   10 +-
 .../josm/data/imagery/WMTSTileSource.java          |   15 -
 .../josm/data/oauth/SignpostAdapters.java          |    6 +-
 .../josm/data/osm/AbstractPrimitive.java           |    6 +-
 src/org/openstreetmap/josm/data/osm/BBox.java      |    2 +-
 src/org/openstreetmap/josm/data/osm/DataSet.java   |    2 +-
 .../openstreetmap/josm/data/osm/OsmPrimitive.java  |   27 +-
 .../openstreetmap/josm/data/osm/QuadBuckets.java   |    2 +-
 .../josm/data/osm/RelationMemberData.java          |    4 +-
 .../osm/visitor/MergeSourceBuildingVisitor.java    |    2 +-
 .../data/osm/visitor/paint/StyledMapRenderer.java  |    2 +-
 .../osm/visitor/paint/WireframeMapRenderer.java    |    2 +-
 .../josm/data/preferences/AbstractProperty.java    |   10 +-
 .../josm/data/preferences/MapListSetting.java      |    4 +-
 .../josm/data/preferences/PreferencesReader.java   |    7 +-
 .../data/validation/routines/UrlValidator.java     |    2 +-
 .../data/validation/tests/DuplicateRelation.java   |    2 +-
 .../data/validation/tests/MapCSSTagChecker.java    |   12 +-
 .../josm/data/validation/tests/PowerLines.java     |   31 +-
 .../data/validation/tests/RelationChecker.java     |   21 +-
 .../data/validation/tests/SelfIntersectingWay.java |   30 +-
 .../data/validation/tests/UnconnectedWays.java     |    2 +-
 .../data/validation/tests/WayConnectedToArea.java  |    5 +-
 .../openstreetmap/josm/gui/MainApplication.java    |   17 +-
 src/org/openstreetmap/josm/gui/MapViewState.java   |   16 +
 src/org/openstreetmap/josm/gui/MenuScroller.java   |   36 +-
 .../josm/gui/NavigatableComponent.java             |    4 +-
 .../josm/gui/bbox/SlippyMapControler.java          |    4 +-
 .../josm/gui/conflict/pair/ComparePairType.java    |    2 +-
 .../tags/RelationMemberConflictDecision.java       |    8 +-
 .../tags/RelationMemberConflictResolverModel.java  |    7 +-
 .../josm/gui/datatransfer/ClipboardUtils.java      |    4 +-
 .../josm/gui/dialogs/DialogsPanel.java             |    4 +-
 .../josm/gui/dialogs/FilterTableModel.java         |    2 +-
 .../josm/gui/dialogs/InspectPrimitiveDialog.java   |    2 +-
 .../josm/gui/dialogs/MenuItemSearchDialog.java     |    3 -
 .../josm/gui/dialogs/MinimapDialog.java            |    2 +-
 .../josm/gui/dialogs/layer/DuplicateAction.java    |    2 +-
 .../dialogs/layer/LayerListTransferHandler.java    |    2 +-
 .../gui/dialogs/layer/LayerVisibilityAction.java   |    3 +-
 .../gui/dialogs/properties/PropertiesDialog.java   |    2 +-
 .../dialogs/relation/GenericRelationEditor.java    |   28 +-
 .../dialogs/relation/RelationDialogManager.java    |    3 +-
 .../relation/sort/WayConnectionTypeCalculator.java |    4 +-
 .../gui/history/HistoryBrowserDialogManager.java   |    4 +-
 .../josm/gui/history/VersionInfoPanel.java         |    2 +-
 .../josm/gui/io/SaveLayersDialog.java              |    2 +-
 .../openstreetmap/josm/gui/io/UploadDialog.java    |    4 +-
 .../openstreetmap/josm/gui/io/UploadStrategy.java  |    2 +-
 .../josm/gui/layer/AbstractTileSourceLayer.java    |    2 +-
 .../gui/layer/geoimage/CorrelateGpxWithImages.java |    6 +-
 .../josm/gui/layer/geoimage/GeoImageLayer.java     |  269 ++--
 .../josm/gui/layer/geoimage/ImageViewerDialog.java |    2 +-
 .../gui/layer/geoimage/ShowThumbnailAction.java    |    4 +-
 .../gui/layer/gpx/ChooseTrackVisibilityAction.java |    2 +-
 .../gui/layer/gpx/ConvertToDataLayerAction.java    |   24 +-
 .../josm/gui/layer/gpx/GpxDrawHelper.java          |  681 ++++++++-
 .../josm/gui/layer/gpx/ImportAudioAction.java      |    8 +-
 .../josm/gui/mappaint/ElemStyles.java              |    9 +
 .../josm/gui/mappaint/MapPaintStyles.java          |   21 +-
 .../josm/gui/mappaint/mapcss/ConditionFactory.java |    2 +-
 .../josm/gui/mappaint/mapcss/MapCSSParser.jj       |    2 +-
 .../gui/mappaint/styleelement/BoxTextElement.java  |   10 +-
 .../gui/mappaint/styleelement/LineElement.java     |   14 +-
 .../mappaint/styleelement/RepeatImageElement.java  |   10 +-
 .../gui/mappaint/styleelement/StyleElement.java    |    8 +-
 .../josm/gui/preferences/SourceEditor.java         |    2 +-
 .../gui/preferences/display/GPXSettingsPanel.java  |   69 +-
 .../gui/preferences/imagery/WMSSettingsPanel.java  |    8 +-
 .../gui/preferences/map/MapPaintPreference.java    |    2 +-
 .../plugin/PluginUpdatePolicyPanel.java            |    3 +-
 .../preferences/server/ProxyPreferencesPanel.java  |    3 +-
 .../josm/gui/tagging/ac/AutoCompletionManager.java |    6 +-
 .../josm/gui/tagging/presets/items/Check.java      |    2 +-
 .../josm/gui/tagging/presets/items/Combo.java      |    2 +-
 .../tagging/presets/items/ComboMultiSelect.java    |    2 +-
 .../josm/gui/tagging/presets/items/Text.java       |    2 +-
 .../josm/gui/widgets/JMultilineLabel.java          |   10 +-
 .../gui/widgets/VerticallyScrollablePanel.java     |    2 +-
 .../openstreetmap/josm/io/CacheCustomContent.java  |    8 +-
 src/org/openstreetmap/josm/io/CachedFile.java      |    4 +-
 src/org/openstreetmap/josm/io/Capabilities.java    |    4 +-
 src/org/openstreetmap/josm/io/NameFinder.java      |    8 +-
 src/org/openstreetmap/josm/io/NoteExporter.java    |    9 +-
 src/org/openstreetmap/josm/io/NoteReader.java      |    6 +-
 src/org/openstreetmap/josm/io/OsmReader.java       |    6 +
 src/org/openstreetmap/josm/io/OsmServerWriter.java |    6 +-
 .../josm/io/imagery/ImageryReader.java             |    2 +-
 .../josm/io/remotecontrol/AddTagsDialog.java       |    2 +-
 src/org/openstreetmap/josm/tools/AudioPlayer.java  |   16 +-
 src/org/openstreetmap/josm/tools/ExifReader.java   |   17 +-
 .../josm/tools/RightAndLefthandTraffic.java        |    2 +-
 src/org/openstreetmap/josm/tools/Shortcut.java     |    2 +-
 src/org/openstreetmap/josm/tools/Utils.java        |   30 +-
 test/data/regress/12627/overlapping.osm            |   27 +
 test/data/regress/14199/emptytag.osm               |   16 +
 test/data/regress/14209/0MbEfj1S--.1.jpg           |  Bin 0 -> 36113 bytes
 test/data/regress/14209/7VWFOryj--.1.jpg           |  Bin 0 -> 1633543 bytes
 test/data/regress/14217/filter.txt                 |    1 +
 test/data/regress/14275/1485101437.8189685.gpx     | 1615 ++++++++++++++++++++
 test/data/regress/14287/example.osm                |   33 +
 test/data/regress/14289/example2.osm               |   42 +
 test/data/regress/4539/josm_error_#4539.osm.zip    |  Bin 0 -> 140329 bytes
 test/data/renderer/README                          |    1 +
 test/data/renderer/node-shapes/data.osm            |   82 +
 test/data/renderer/node-shapes/reference.png       |  Bin 0 -> 3765 bytes
 test/data/renderer/node-shapes/style.mapcss        |   99 ++
 test/data/renderer/way-width/data.osm              |   88 ++
 test/data/renderer/way-width/reference.png         |  Bin 0 -> 2714 bytes
 test/data/renderer/way-width/style.mapcss          |   28 +
 .../josm/actions/search/SearchCompilerTest.java    |   18 +-
 .../corrector/ReverseWayNoTagCorrectorTest.java    |    2 +-
 .../josm/data/cache/HostLimitQueueTest.java        |  164 ++
 .../data/cache/JCSCachedTileLoaderJobTest.java     |   35 +-
 .../openstreetmap/josm/data/osm/DataSetTest.java   |   36 +-
 .../validation/tests/MapCSSTagCheckerTest.java     |   88 +-
 .../data/validation/tests/RelationCheckerTest.java |   19 +-
 .../validation/tests/SelfIntersectingWayTest.java  |  136 +-
 .../gui/dialogs/layer/DuplicateActionTest.java     |   58 +
 .../layer/gpx/ConvertToDataLayerActionTest.java    |   14 +
 .../josm/gui/mappaint/MapCSSRendererTest.java      |  199 +++
 .../org/openstreetmap/josm/io/OsmReaderTest.java   |   33 +
 .../openstreetmap/josm/tools/ExifReaderTest.java   |   29 +-
 .../org/openstreetmap/josm/tools/UtilsTest.java    |   74 +-
 .../josm/tools/date/DateUtilsTest.java             |    2 +-
 303 files changed, 11690 insertions(+), 4655 deletions(-)

diff --git a/.classpath b/.classpath
index 858a778..94eebfa 100644
--- a/.classpath
+++ b/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry excluding="org/apache/commons/compress/compressors/CompressorException.java|org/apache/commons/compress/compressors/CompressorStreamFactory.java|org/apache/commons/compress/compressors/FileNameUtil.java|org/apache/commons/compress/compressors/bzip2/BZip2Utils.java|org/apache/commons/compress/compressors/deflate/|org/apache/commons/compress/compressors/gzip/|org/apache/commons/compress/compressors/lzma/|org/apache/commons/compress/compressors/lzw/|org/apache/commons/compr [...]
+	<classpathentry excluding="org/apache/commons/compress/compressors/CompressorException.java|org/apache/commons/compress/compressors/CompressorStreamFactory.java|org/apache/commons/compress/compressors/FileNameUtil.java|org/apache/commons/compress/compressors/bzip2/BZip2Utils.java|org/apache/commons/compress/compressors/deflate/|org/apache/commons/compress/compressors/gzip/|org/apache/commons/compress/compressors/lzma/|org/apache/commons/compress/compressors/lzw/|org/apache/commons/compr [...]
 	<classpathentry including="data/|images/|resources/|styles/" kind="src" path=""/>
 	<classpathentry kind="src" path="test/unit"/>
 	<classpathentry kind="src" path="test/functional"/>
@@ -14,18 +14,18 @@
 	<classpathentry kind="lib" path="test/lib/fest/jcip-annotations-1.0.jar"/>
 	<classpathentry kind="lib" path="test/lib/fest/MRJToolkitStubs-1.0.jar"/>
 	<classpathentry kind="lib" path="test/lib/jfcunit.jar"/>
-	<classpathentry kind="lib" path="test/lib/equalsverifier-2.1.8.jar"/>
+	<classpathentry kind="lib" path="test/lib/equalsverifier-2.2.1.jar"/>
 	<classpathentry kind="lib" path="test/lib/reflections/reflections-0.9.10.jar"/>
-	<classpathentry kind="lib" path="test/lib/reflections/guava-19.0.jar"/>
-	<classpathentry kind="lib" path="test/lib/reflections/javassist-3.20.0-GA.jar"/>
-	<classpathentry kind="lib" path="test/lib/system-rules-1.16.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/reflections/guava-21.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/reflections/javassist-3.21.0-GA.jar"/>
+	<classpathentry kind="lib" path="test/lib/system-rules-1.16.1.jar"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/unitils-core-3.4.6.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/commons-collections-3.2.2.jar"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/commons-lang-2.6.jar"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/commons-logging-1.1.3.jar"/>
 	<classpathentry kind="lib" path="test/lib/unitils-core/ognl-2.6.9.jar"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/unitils-core-3.4.3.jar"/>
 	<classpathentry kind="lib" path="test/lib/fest/debug-1.0.jar"/>
 	<classpathentry exported="true" kind="con" path="GROOVY_DSL_SUPPORT"/>
 	<classpathentry kind="lib" path="tools/findbugs/annotations.jar"/>
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..020049b
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,13 @@
+FROM openjdk:8-jdk-alpine
+
+RUN apk update && \
+    apk add apache-ant && \
+    apk add ttf-dejavu && \
+    rm /var/cache/apk/*
+
+COPY . /josm
+
+RUN mkdir -p /josm/test/report
+
+CMD cd /josm && \
+    ant test-html
diff --git a/README b/README
index bc57819..ccf1514 100644
--- a/README
+++ b/README
@@ -121,11 +121,11 @@ This is an overview of the files and directories in the JOSM code repository:
     - checkstyle/           libs and config files for checkstyle (automatically detects code style
                             problems in source code); can be launched as an ant target in build.xml
     - commons-cli-1.3.1.jar dependency of Groovy Ant task
-    - error_prone_ant-2.0.14.jar
+    - error_prone_ant-2.0.15.jar
                             used to detect code errors during compilation
     - findbugs/             libs and config files for findbugs (automatically detects common bugs and potential
                             problems in source code); can be launched as an ant target in build.xml
-    - groovy-all-2.4.7.jar  used for some unit tests and various scripts
+    - groovy-all-2.4.8.jar  used for some unit tests and various scripts
     - jacocoant.jar         used to include coverage data into JUnit test reports
     - japicc/               used to generate a compatibility report between optimized jar and normal one
     - javacc.jar            used in the build process to generate some .java files from a javacc source file
diff --git a/REVISION b/REVISION
index 890604f..64a9cff 100644
--- a/REVISION
+++ b/REVISION
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <info>
 <entry
+   kind="dir"
    path="trunk"
-   revision="11427"
-   kind="dir">
+   revision="11514">
 <url>https://josm.openstreetmap.de/svn/trunk</url>
 <relative-url>^/trunk</relative-url>
 <repository>
@@ -11,9 +11,9 @@
 <uuid>0c6e7542-c601-0410-84e7-c038aed88b3b</uuid>
 </repository>
 <commit
-   revision="11427">
+   revision="11514">
 <author>Don-vip</author>
-<date>2017-01-01T23:53:29.375771Z</date>
+<date>2017-01-30T22:21:38.631070Z</date>
 </commit>
 </entry>
 </info>
diff --git a/build.xml b/build.xml
index b4a953d..928040b 100644
--- a/build.xml
+++ b/build.xml
@@ -24,8 +24,8 @@
         <property name="mapcss.dir" location="${src.dir}/org/openstreetmap/josm/gui/mappaint/mapcss"/>
         <property name="proj-build.dir" location="${base.dir}/build2"/>
         <property name="epsg.output" location="${base.dir}/data/projection/custom-epsg"/>
-        <property name="groovy.jar" location="${base.dir}/tools/groovy-all-2.4.7.jar"/>
-        <property name="error_prone_ant.jar" location="${base.dir}/tools/error_prone_ant-2.0.14.jar"/>
+        <property name="groovy.jar" location="${base.dir}/tools/groovy-all-2.4.8.jar"/>
+        <property name="error_prone_ant.jar" location="${base.dir}/tools/error_prone_ant-2.0.15.jar"/>
         <property name="javac.compiler" value="com.google.errorprone.ErrorProneAntCompilerAdapter" />
         <!-- build parameter: compression level (ant -Dclevel=N)
                  N ranges from 0 (no compression) to 9 (maximum compression)
@@ -234,6 +234,8 @@ Build-Date: ${build.tstamp}
             <exclude name="org/apache/commons/compress/compressors/FileNameUtil.java"/>
             <exclude name="org/apache/commons/compress/compressors/deflate/**"/>
             <exclude name="org/apache/commons/compress/compressors/gzip/**"/>
+            <exclude name="org/apache/commons/compress/compressors/lz4/**"/>
+            <exclude name="org/apache/commons/compress/compressors/lz77support/**"/>
             <exclude name="org/apache/commons/compress/compressors/lzw/**"/>
             <exclude name="org/apache/commons/compress/compressors/pack200/**"/>
             <exclude name="org/apache/commons/compress/compressors/snappy/**"/>
@@ -308,6 +310,7 @@ Build-Date: ${build.tstamp}
             <!-- Undocumented argument to ignore "Sun internal proprietary API" warning, see http://stackoverflow.com/a/13862308/2257172 -->
             <compilerarg value="-XDignore.symbol.file"/>
             <compilerarg value="-Xep:ReferenceEquality:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
+            <compilerarg value="-Xep:ImmutableEnumChecker:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
             <compilerarg line="-Xmaxwarns 1000"/>
         </javac>
 
@@ -716,7 +719,7 @@ Build-Date: ${build.tstamp}
 
     <target name="checkstyle" depends="init-properties">
         <taskdef resource="com/puppycrawl/tools/checkstyle/ant/checkstyle-ant-task.properties"
-             classpath="tools/checkstyle/checkstyle-7.3-all.jar"/>
+             classpath="tools/checkstyle/checkstyle-7.4-all.jar"/>
         <checkstyle config="tools/checkstyle/josm_checks.xml">
             <fileset dir="${base.dir}/src/org/openstreetmap/josm" includes="**/*.java"
                 excludes="gui/mappaint/mapcss/parsergen/*.java"/>
diff --git a/data/boundaries.osm b/data/boundaries.osm
index f81bb9f..5ff325e 100644
--- a/data/boundaries.osm
+++ b/data/boundaries.osm
@@ -3192,10 +3192,10 @@
   <node id='-36895' lat='17.9187' lon='-61.45764' />
   <node id='-36897' lat='17.9235' lon='-62.12601' />
   <node id='-36899' lat='38.25641' lon='71.37803' />
-  <node id='-36901' visible='true' lat='37.77904' lon='71.53778' />
-  <node id='-36903' visible='true' lat='37.26158' lon='73.8564' />
+  <node id='-36901' lat='37.77904' lon='71.53778' />
+  <node id='-36903' lat='37.26158' lon='73.8564' />
   <node id='-36905' lat='37.34208' lon='74.20308' />
-  <node id='-36907' visible='true' lat='36.96224' lon='74.53739' />
+  <node id='-36907' lat='36.96224' lon='74.53739' />
   <node id='-36909' lat='36.91421' lon='73.82685' />
   <node id='-36911' lat='36.71838' lon='72.18135' />
   <node id='-36913' lat='34.36769' lon='71.17662' />
@@ -3208,7 +3208,7 @@
   <node id='-36927' lat='29.53957' lon='65.04005' />
   <node id='-36929' lat='29.39157' lon='64.12966' />
   <node id='-36931' lat='29.50456' lon='63.5876' />
-  <node id='-36933' visible='true' lat='29.40782' lon='62.47751' />
+  <node id='-36933' lat='29.40782' lon='62.47751' />
   <node id='-36935' lat='29.86514' lon='60.87231' />
   <node id='-36937' lat='31.38447' lon='61.71753' />
   <node id='-36939' lat='31.49561' lon='60.84541' />
@@ -3229,10 +3229,10 @@
   <node id='-36969' lat='-11.24911' lon='22.25951' />
   <node id='-36971' lat='-10.89356' lon='24.00027' />
   <node id='-36973' lat='-12.99091' lon='24.03339' />
-  <node id='-36975' visible='true' lat='-13.00148' lon='21.97988' />
+  <node id='-36975' lat='-13.00148' lon='21.97988' />
   <node id='-36977' lat='-18.02787' lon='21.42741' />
-  <node id='-36979' visible='true' lat='-17.38927' lon='18.39229' />
-  <node id='-36981' visible='true' lat='-17.38814' lon='14.28743' />
+  <node id='-36979' lat='-17.38927' lon='18.39229' />
+  <node id='-36981' lat='-17.38814' lon='14.28743' />
   <node id='-36983' lat='-17.25284' lon='10.5065' />
   <node id='-36985' lat='-5.74353' lon='12.52318' />
   <node id='-36987' lat='-5.74031' lon='12.26557' />
@@ -3270,38 +3270,38 @@
   <node id='-37051' lat='24.12041' lon='51.59617' />
   <node id='-37053' lat='26.18798' lon='55.81777' />
   <node id='-37055' lat='26.05004' lon='56.08836' />
-  <node id='-37057' visible='true' lat='25.33108' lon='56.26062' />
-  <node id='-37059' visible='true' lat='25.31253' lon='56.23362' />
+  <node id='-37057' lat='25.33108' lon='56.26062' />
+  <node id='-37059' lat='25.31253' lon='56.23362' />
   <node id='-37061' lat='25.28843' lon='56.25008' />
   <node id='-37063' lat='25.27505' lon='56.24465' />
   <node id='-37065' lat='25.25668' lon='56.20838' />
   <node id='-37067' lat='25.24104' lon='56.20872' />
   <node id='-37069' lat='25.22867' lon='56.24341' />
   <node id='-37071' lat='25.23404' lon='56.27628' />
-  <node id='-37073' visible='true' lat='25.26653' lon='56.34438' />
+  <node id='-37073' lat='25.26653' lon='56.34438' />
   <node id='-37075' lat='25.30681' lon='56.35172' />
   <node id='-37077' lat='25.30107' lon='56.3111' />
   <node id='-37079' lat='25.31815' lon='56.3005' />
   <node id='-37081' lat='-22.00576' lon='-62.81108' />
-  <node id='-37083' visible='true' lat='-24.00701' lon='-60.03367' />
-  <node id='-37085' visible='true' lat='-25.65383' lon='-54.5985' />
+  <node id='-37083' lat='-24.00701' lon='-60.03367' />
+  <node id='-37085' lat='-25.65383' lon='-54.5985' />
   <node id='-37087' lat='-25.55513' lon='-53.90831' />
   <node id='-37089' lat='-27.09844' lon='-53.80144' />
-  <node id='-37091' visible='true' lat='-27.94661' lon='-55.33303' />
+  <node id='-37091' lat='-27.94661' lon='-55.33303' />
   <node id='-37093' lat='-32.98842' lon='-58.1224' />
   <node id='-37095' lat='-35.78518' lon='-55.71154' />
   <node id='-37097' lat='-50.58411' lon='-72.31343' />
-  <node id='-37099' visible='true' lat='-46.55385' lon='-71.68577' />
+  <node id='-37099' lat='-46.55385' lon='-71.68577' />
   <node id='-37101' lat='-38.6923' lon='-70.89532' />
   <node id='-37103' lat='-22.99839' lon='-66.99632' />
   <node id='-37105' lat='-22.81525' lon='-67.18382' />
   <node id='-37107' lat='40.58424' lon='45.50279' />
-  <node id='-37109' visible='true' lat='40.65023' lon='45.47927' />
-  <node id='-37111' visible='true' lat='40.64765' lon='45.56071' />
+  <node id='-37109' lat='40.65023' lon='45.47927' />
+  <node id='-37111' lat='40.64765' lon='45.56071' />
   <node id='-37113' lat='41.29747' lon='45.0133' />
   <node id='-37115' lat='41.2464' lon='45.05497' />
-  <node id='-37117' visible='true' lat='41.2101' lon='45.02932' />
-  <node id='-37119' visible='true' lat='41.19211' lon='45.05201' />
+  <node id='-37117' lat='41.2101' lon='45.02932' />
+  <node id='-37119' lat='41.19211' lon='45.05201' />
   <node id='-37121' lat='41.19967' lon='45.11811' />
   <node id='-37123' lat='41.168' lon='45.1969' />
   <node id='-37125' lat='41.13299' lon='45.19942' />
@@ -3344,11 +3344,11 @@
   <node id='-37199' lat='48.60371' lon='16.93955' />
   <node id='-37201' lat='48.00636' lon='17.16001' />
   <node id='-37203' lat='47.76171' lon='16.61183' />
-  <node id='-37205' visible='true' lat='47.50155' lon='16.64821' />
+  <node id='-37205' lat='47.50155' lon='16.64821' />
   <node id='-37207' lat='47.46139' lon='16.6718' />
   <node id='-37209' lat='47.39416' lon='16.49908' />
   <node id='-37211' lat='47.21127' lon='16.43663' />
-  <node id='-37213' visible='true' lat='47.00558' lon='16.28855' />
+  <node id='-37213' lat='47.00558' lon='16.28855' />
   <node id='-37215' lat='46.867' lon='16.10983' />
   <node id='-37217' lat='46.85698' lon='10.47197' />
   <node id='-37219' lat='46.84296' lon='10.10715' />
@@ -3459,13 +3459,13 @@
   <node id='-37429' lat='50.75529' lon='5.69469' />
   <node id='-37431' lat='50.76398' lon='5.72216' />
   <node id='-37433' lat='50.75674' lon='5.73904' />
-  <node id='-37435' visible='true' lat='50.7691' lon='5.74356' />
+  <node id='-37435' lat='50.7691' lon='5.74356' />
   <node id='-37437' lat='50.78159' lon='5.76533' />
   <node id='-37439' lat='50.78308' lon='5.77513' />
   <node id='-37441' lat='50.7558' lon='5.80673' />
   <node id='-37443' lat='50.77092' lon='5.88734' />
-  <node id='-37445' visible='true' lat='50.75125' lon='5.89129' />
-  <node id='-37447' visible='true' lat='50.75124' lon='5.89132' />
+  <node id='-37445' lat='50.75125' lon='5.89129' />
+  <node id='-37447' lat='50.75124' lon='5.89132' />
   <node id='-37449' lat='50.75441' lon='5.97545' />
   <node id='-37451' lat='50.75398' lon='6.01976' />
   <node id='-37453' lat='50.74618' lon='6.03889' />
@@ -3486,7 +3486,7 @@
   <node id='-37483' lat='50.48833' lon='6.3465' />
   <node id='-37485' lat='50.46083' lon='6.34005' />
   <node id='-37487' lat='50.45397' lon='6.37219' />
-  <node id='-37489' visible='true' lat='50.30887' lon='6.29949' />
+  <node id='-37489' lat='50.30887' lon='6.29949' />
   <node id='-37491' lat='50.27458' lon='6.28797' />
   <node id='-37493' lat='50.25179' lon='6.208' />
   <node id='-37495' lat='50.2234' lon='6.16853' />
@@ -3535,7 +3535,7 @@
   <node id='-37581' lat='51.35738' lon='4.34086' />
   <node id='-37583' lat='51.35547' lon='4.39292' />
   <node id='-37585' lat='51.37482' lon='4.43383' />
-  <node id='-37587' visible='true' lat='51.41965' lon='4.38064' />
+  <node id='-37587' lat='51.41965' lon='4.38064' />
   <node id='-37589' lat='51.43316' lon='4.39747' />
   <node id='-37591' lat='51.4778' lon='4.47736' />
   <node id='-37593' lat='51.48184' lon='4.5388' />
@@ -3567,7 +3567,7 @@
   <node id='-37645' lat='13.1588' lon='-3.4313' />
   <node id='-37647' lat='13.27272' lon='-3.43507' />
   <node id='-37649' lat='13.29035' lon='-3.23599' />
-  <node id='-37651' visible='true' lat='13.5422' lon='-3.28396' />
+  <node id='-37651' lat='13.5422' lon='-3.28396' />
   <node id='-37653' lat='13.70699' lon='-3.26407' />
   <node id='-37655' lat='14.29671' lon='-2.47587' />
   <node id='-37657' lat='14.14878' lon='-2.10223' />
@@ -3636,7 +3636,7 @@
   <node id='-37783' lat='44.69612' lon='19.29753' />
   <node id='-37785' lat='43.98764' lon='19.23465' />
   <node id='-37787' lat='43.79668' lon='19.3986' />
-  <node id='-37789' visible='true' lat='42.55921' lon='18.43735' />
+  <node id='-37789' lat='42.55921' lon='18.43735' />
   <node id='-37791' lat='42.97223' lon='17.70879' />
   <node id='-37793' lat='43.08595' lon='17.64268' />
   <node id='-37795' lat='43.16559' lon='17.46986' />
@@ -3645,7 +3645,7 @@
   <node id='-37801' lat='44.27012' lon='16.18688' />
   <node id='-37803' lat='44.82334' lon='15.72584' />
   <node id='-37805' lat='44.8455' lon='15.79472' />
-  <node id='-37807' visible='true' lat='45.09616' lon='16.12153' />
+  <node id='-37807' lat='45.09616' lon='16.12153' />
   <node id='-37809' lat='56.16964' lon='28.15217' />
   <node id='-37811' lat='55.98971' lon='29.21717' />
   <node id='-37813' lat='55.8358' lon='30.12136' />
@@ -3659,10 +3659,10 @@
   <node id='-37829' lat='51.5664' lon='28.64429' />
   <node id='-37831' lat='51.66713' lon='27.20948' />
   <node id='-37833' lat='51.87315' lon='26.39367' />
-  <node id='-37835' visible='true' lat='51.66979' lon='24.13075' />
+  <node id='-37835' lat='51.66979' lon='24.13075' />
   <node id='-37837' lat='52.11264' lon='23.61' />
   <node id='-37839' lat='52.22848' lon='23.20071' />
-  <node id='-37841' visible='true' lat='52.6149' lon='23.73615' />
+  <node id='-37841' lat='52.6149' lon='23.73615' />
   <node id='-37843' lat='52.71332' lon='23.93763' />
   <node id='-37845' lat='53.24131' lon='23.81995' />
   <node id='-37847' lat='55.67968' lon='26.63231' />
@@ -3671,16 +3671,16 @@
   <node id='-37853' lat='18.41778' lon='-88.03238' />
   <node id='-37855' lat='18.16657' lon='-88.03165' />
   <node id='-37857' lat='-15.09515' lon='-60.23968' />
-  <node id='-37859' visible='true' lat='-15.50267' lon='-60.23797' />
-  <node id='-37861' visible='true' lat='-17.8431' lon='-57.69877' />
+  <node id='-37859' lat='-15.50267' lon='-60.23797' />
+  <node id='-37861' lat='-17.8431' lon='-57.69877' />
   <node id='-37863' lat='-19.76276' lon='-58.14215' />
   <node id='-37865' lat='-19.98346' lon='-57.8496' />
   <node id='-37867' lat='-19.80058' lon='-58.23216' />
-  <node id='-37869' visible='true' lat='-19.29148' lon='-59.06965' />
-  <node id='-37871' visible='true' lat='-19.2981' lon='-60.00638' />
-  <node id='-37873' visible='true' lat='-19.63958' lon='-61.73723' />
-  <node id='-37875' visible='true' lat='-20.55311' lon='-62.26883' />
-  <node id='-37877' visible='true' lat='-21.06657' lon='-62.2757' />
+  <node id='-37869' lat='-19.29148' lon='-59.06965' />
+  <node id='-37871' lat='-19.2981' lon='-60.00638' />
+  <node id='-37873' lat='-19.63958' lon='-61.73723' />
+  <node id='-37875' lat='-20.55311' lon='-62.26883' />
+  <node id='-37877' lat='-21.06657' lon='-62.2757' />
   <node id='-37879' lat='-22.25788' lon='-62.64225' />
   <node id='-37881' lat='-22.08446' lon='-64.97873' />
   <node id='-37883' lat='-19.72118' lon='-68.66761' />
@@ -3688,30 +3688,30 @@
   <node id='-37887' lat='-16.16668' lon='-69.20291' />
   <node id='-37889' lat='-13.68546' lon='-69.05265' />
   <node id='-37891' lat='-10.9448' lon='-69.57302' />
-  <node id='-37893' visible='true' lat='-10.35141' lon='-65.37923' />
-  <node id='-37895' visible='true' lat='4.34069' lon='-59.69361' />
+  <node id='-37893' lat='-10.35141' lon='-65.37923' />
+  <node id='-37895' lat='4.34069' lon='-59.69361' />
   <node id='-37897' lat='1.95135' lon='-56.47045' />
   <node id='-37899' lat='1.83137' lon='-55.99278' />
-  <node id='-37901' visible='true' lat='2.37298' lon='-52.6906' />
+  <node id='-37901' lat='2.37298' lon='-52.6906' />
   <node id='-37903' lat='-33.86894' lon='-53.18243' />
   <node id='-37905' lat='-30.17568' lon='-57.63279' />
   <node id='-37907' lat='-20.16193' lon='-58.16225' />
-  <node id='-37909' visible='true' lat='-16.26479' lon='-60.16069' />
-  <node id='-37911' visible='true' lat='-15.09887' lon='-60.58224' />
-  <node id='-37913' visible='true' lat='-12.52544' lon='-63.90248' />
+  <node id='-37909' lat='-16.26479' lon='-60.16069' />
+  <node id='-37911' lat='-15.09887' lon='-60.58224' />
+  <node id='-37913' lat='-12.52544' lon='-63.90248' />
   <node id='-37915' lat='-9.90446' lon='-66.63041' />
   <node id='-37917' lat='-11.00524' lon='-68.80891' />
-  <node id='-37919' visible='true' lat='-11.0108' lon='-70.64134' />
+  <node id='-37919' lat='-11.0108' lon='-70.64134' />
   <node id='-37921' lat='-9.9668' lon='-71.23394' />
-  <node id='-37923' visible='true' lat='-9.40904' lon='-73.21498' />
-  <node id='-37925' visible='true' lat='-7.58465' lon='-73.96938' />
+  <node id='-37923' lat='-9.40904' lon='-73.21498' />
+  <node id='-37925' lat='-7.58465' lon='-73.96938' />
   <node id='-37927' lat='-5.14765' lon='-72.83973' />
   <node id='-37929' lat='-4.36915' lon='-70.96814' />
   <node id='-37931' lat='-4.23758' lon='-69.94413' />
-  <node id='-37933' visible='true' lat='-1.42219' lon='-69.43395' />
+  <node id='-37933' lat='-1.42219' lon='-69.43395' />
   <node id='-37935' lat='1.22998' lon='-66.85795' />
-  <node id='-37937' visible='true' lat='0.74585' lon='-66.28507' />
-  <node id='-37939' visible='true' lat='2.79797' lon='-64.02908' />
+  <node id='-37937' lat='0.74585' lon='-66.28507' />
+  <node id='-37939' lat='2.79797' lon='-64.02908' />
   <node id='-37941' lat='5.20931' lon='-60.73204' />
   <node id='-37943' lat='12.80638' lon='-59.14146' />
   <node id='-37945' lat='12.77667' lon='-59.88892' />
@@ -3719,11 +3719,11 @@
   <node id='-37949' lat='13.60976' lon='-59.17509' />
   <node id='-37951' lat='5.01011' lon='115.16236' />
   <node id='-37953' lat='4.87604' lon='115.15092' />
-  <node id='-37955' visible='true' lat='4.8256' lon='115.20737' />
-  <node id='-37957' visible='true' lat='4.39123' lon='115.09978' />
+  <node id='-37955' lat='4.8256' lon='115.20737' />
+  <node id='-37957' lat='4.39123' lon='115.09978' />
   <node id='-37959' lat='4.53418' lon='115.07737' />
   <node id='-37961' lat='4.63706' lon='115.04064' />
-  <node id='-37963' visible='true' lat='4.74137' lon='115.02278' />
+  <node id='-37963' lat='4.74137' lon='115.02278' />
   <node id='-37965' lat='4.81146' lon='114.96982' />
   <node id='-37967' lat='4.42387' lon='114.83189' />
   <node id='-37969' lat='4.4257' lon='114.88039' />
@@ -3742,7 +3742,7 @@
   <node id='-37995' lat='-18.31743' lon='20.99904' />
   <node id='-37997' lat='-18.31795' lon='21.45556' />
   <node id='-37999' lat='-18.00075' lon='23.0996' />
-  <node id='-38001' visible='true' lat='-17.89591' lon='24.72534' />
+  <node id='-38001' lat='-17.89591' lon='24.72534' />
   <node id='-38003' lat='10.91915' lon='22.87758' />
   <node id='-38005' lat='9.67566' lon='23.69155' />
   <node id='-38007' lat='4.01805' lon='15.07686' />
@@ -3821,7 +3821,7 @@
   <node id='-38153' lat='43.63099' lon='-76.79706' />
   <node id='-38155' lat='43.54052' lon='-79.25796' />
   <node id='-38157' lat='43.26183' lon='-79.06921' />
-  <node id='-38159' visible='true' lat='42.93022' lon='-78.90905' />
+  <node id='-38159' lat='42.93022' lon='-78.90905' />
   <node id='-38161' lat='42.89733' lon='-78.90712' />
   <node id='-38163' lat='42.82887' lon='-78.93684' />
   <node id='-38165' lat='41.67681' lon='-82.39605' />
@@ -3837,7 +3837,7 @@
   <node id='-38185' lat='42.37355' lon='-82.82964' />
   <node id='-38187' lat='42.55594' lon='-82.64242' />
   <node id='-38189' lat='42.54984' lon='-82.58873' />
-  <node id='-38191' visible='true' lat='42.5718' lon='-82.57583' />
+  <node id='-38191' lat='42.5718' lon='-82.57583' />
   <node id='-38193' lat='42.611' lon='-82.51858' />
   <node id='-38195' lat='42.66025' lon='-82.51063' />
   <node id='-38197' lat='42.76615' lon='-82.46613' />
@@ -3860,7 +3860,7 @@
   <node id='-38231' lat='46.23987' lon='-84.1096' />
   <node id='-38233' lat='46.25512' lon='-84.09756' />
   <node id='-38235' lat='46.2681' lon='-84.11615' />
-  <node id='-38237' visible='true' lat='46.31423' lon='-84.1191' />
+  <node id='-38237' lat='46.31423' lon='-84.1191' />
   <node id='-38239' lat='46.32248' lon='-84.10732' />
   <node id='-38241' lat='46.3462' lon='-84.12439' />
   <node id='-38243' lat='46.3731' lon='-84.13853' />
@@ -3874,7 +3874,7 @@
   <node id='-38259' lat='46.49127' lon='-84.29893' />
   <node id='-38261' lat='46.50683' lon='-84.34174' />
   <node id='-38263' lat='46.49853' lon='-84.42101' />
-  <node id='-38265' visible='true' lat='46.48972' lon='-84.4481' />
+  <node id='-38265' lat='46.48972' lon='-84.4481' />
   <node id='-38267' lat='46.45225' lon='-84.47607' />
   <node id='-38269' lat='46.45974' lon='-84.55635' />
   <node id='-38271' lat='46.63458' lon='-84.7644' />
@@ -3902,12 +3902,12 @@
   <node id='-38315' lat='48.35958' lon='-92.05339' />
   <node id='-38317' lat='48.35252' lon='-92.202' />
   <node id='-38319' lat='48.25046' lon='-92.27167' />
-  <node id='-38321' visible='true' lat='48.22259' lon='-92.37185' />
+  <node id='-38321' lat='48.22259' lon='-92.37185' />
   <node id='-38323' lat='48.36609' lon='-92.48147' />
   <node id='-38325' lat='48.40624' lon='-92.45588' />
   <node id='-38327' lat='48.44921' lon='-92.50712' />
   <node id='-38329' lat='48.43471' lon='-92.65606' />
-  <node id='-38331' visible='true' lat='48.50278' lon='-92.62747' />
+  <node id='-38331' lat='48.50278' lon='-92.62747' />
   <node id='-38333' lat='48.54133' lon='-92.6342' />
   <node id='-38335' lat='48.54005' lon='-92.7287' />
   <node id='-38337' lat='48.60866' lon='-92.94973' />
@@ -3920,8 +3920,8 @@
   <node id='-38351' lat='48.52439' lon='-93.80939' />
   <node id='-38353' lat='48.62745' lon='-93.83288' />
   <node id='-38355' lat='48.63284' lon='-93.85769' />
-  <node id='-38357' visible='true' lat='48.65202' lon='-94.23215' />
-  <node id='-38359' visible='true' lat='48.65729' lon='-94.25104' />
+  <node id='-38357' lat='48.65202' lon='-94.23215' />
+  <node id='-38359' lat='48.65729' lon='-94.25104' />
   <node id='-38361' lat='48.69223' lon='-94.44258' />
   <node id='-38363' lat='48.70216' lon='-94.53826' />
   <node id='-38365' lat='48.71803' lon='-94.58903' />
@@ -3957,20 +3957,20 @@
   <node id='-38425' lat='42.84753' lon='130.66524' />
   <node id='-38427' lat='42.9027' lon='130.26095' />
   <node id='-38429' lat='42.96494' lon='129.85261' />
-  <node id='-38431' visible='true' lat='42.07524' lon='128.95485' />
-  <node id='-38433' visible='true' lat='42.03537' lon='128.94007' />
+  <node id='-38431' lat='42.07524' lon='128.95485' />
+  <node id='-38433' lat='42.03537' lon='128.94007' />
   <node id='-38435' lat='42.01769' lon='128.04487' />
   <node id='-38437' lat='41.60322' lon='128.30716' />
   <node id='-38439' lat='41.38165' lon='128.16422' />
   <node id='-38441' lat='41.79111' lon='126.91622' />
-  <node id='-38443' visible='true' lat='40.11047' lon='124.38556' />
-  <node id='-38445' visible='true' lat='40.09829' lon='124.36997' />
+  <node id='-38443' lat='40.11047' lon='124.38556' />
+  <node id='-38445' lat='40.09829' lon='124.36997' />
   <node id='-38447' lat='24.49266' lon='118.56434' />
   <node id='-38449' lat='24.51645' lon='118.35291' />
   <node id='-38451' lat='24.51231' lon='118.28244' />
   <node id='-38453' lat='24.38193' lon='118.09488' />
   <node id='-38455' lat='24.06775' lon='118.41371' />
-  <node id='-38457' visible='true' lat='21.53604' lon='108.0569' />
+  <node id='-38457' lat='21.53604' lon='108.0569' />
   <node id='-38459' lat='21.77659' lon='101.11744' />
   <node id='-38461' lat='21.67396' lon='100.87265' />
   <node id='-38463' lat='22.15874' lon='99.1552' />
@@ -3992,7 +3992,7 @@
   <node id='-38495' lat='29.20797' lon='95.72086' />
   <node id='-38497' lat='29.31739' lon='94.69318' />
   <node id='-38499' lat='28.68821' lon='93.72797' />
-  <node id='-38501' visible='true' lat='28.67189' lon='93.44621' />
+  <node id='-38501' lat='28.67189' lon='93.44621' />
   <node id='-38503' lat='28.15018' lon='92.67486' />
   <node id='-38505' lat='27.95417' lon='88.1278' />
   <node id='-38507' lat='31.60631' lon='78.84516' />
@@ -4022,10 +4022,10 @@
   <node id='-38555' lat='40.13191' lon='74.25533' />
   <node id='-38557' lat='40.34668' lon='74.69875' />
   <node id='-38559' lat='42.21166' lon='80.17807' />
-  <node id='-38561' visible='true' lat='42.23797' lon='80.26841' />
-  <node id='-38563' visible='true' lat='42.66037' lon='80.15245' />
+  <node id='-38561' lat='42.23797' lon='80.26841' />
+  <node id='-38563' lat='42.66037' lon='80.15245' />
   <node id='-38565' lat='42.8366' lon='80.26886' />
-  <node id='-38567' visible='true' lat='42.83142' lon='80.38169' />
+  <node id='-38567' lat='42.83142' lon='80.38169' />
   <node id='-38569' lat='42.9011' lon='80.58999' />
   <node id='-38571' lat='43.141' lon='80.62913' />
   <node id='-38573' lat='43.14235' lon='80.78817' />
@@ -4036,13 +4036,13 @@
   <node id='-38583' lat='49.11626' lon='87.28386' />
   <node id='-38585' lat='48.89582' lon='87.73822' />
   <node id='-38587' lat='46.99399' lon='90.76108' />
-  <node id='-38589' visible='true' lat='45.49314' lon='90.65114' />
+  <node id='-38589' lat='45.49314' lon='90.65114' />
   <node id='-38591' lat='44.25274' lon='95.01191' />
-  <node id='-38593' visible='true' lat='44.2805' lon='95.39772' />
+  <node id='-38593' lat='44.2805' lon='95.39772' />
   <node id='-38595' lat='43.99353' lon='95.52594' />
   <node id='-38597' lat='43.2528' lon='95.89543' />
   <node id='-38599' lat='42.90363' lon='96.35658' />
-  <node id='-38601' visible='true' lat='42.72055' lon='96.37926' />
+  <node id='-38601' lat='42.72055' lon='96.37926' />
   <node id='-38603' lat='42.50074' lon='101.80515' />
   <node id='-38605' lat='41.66113' lon='104.51667' />
   <node id='-38607' lat='41.58382' lon='105.01119' />
@@ -4056,7 +4056,7 @@
   <node id='-38623' lat='45.68603' lon='116.16989' />
   <node id='-38625' lat='45.78637' lon='116.27366' />
   <node id='-38627' lat='45.8778' lon='116.24012' />
-  <node id='-38629' visible='true' lat='46.38637' lon='116.83166' />
+  <node id='-38629' lat='46.38637' lon='116.83166' />
   <node id='-38631' lat='46.36335' lon='117.36609' />
   <node id='-38633' lat='46.63783' lon='119.42827' />
   <node id='-38635' lat='47.42617' lon='119.31964' />
@@ -4067,7 +4067,7 @@
   <node id='-38645' lat='47.67741' lon='115.94296' />
   <node id='-38647' lat='48.15367' lon='115.52082' />
   <node id='-38649' lat='48.81716' lon='116.06565' />
-  <node id='-38651' visible='true' lat='48.87014' lon='116.03781' />
+  <node id='-38651' lat='48.87014' lon='116.03781' />
   <node id='-38653' lat='49.68482' lon='117.07142' />
   <node id='-38655' lat='49.62544' lon='117.27597' />
   <node id='-38657' lat='49.62324' lon='117.48208' />
@@ -4107,7 +4107,7 @@
   <node id='-38725' lat='47.66676' lon='8.41346' />
   <node id='-38727' lat='47.77215' lon='8.48868' />
   <node id='-38729' lat='47.78001' lon='8.56814' />
-  <node id='-38731' visible='true' lat='-54.92205' lon='-67.46182' />
+  <node id='-38731' lat='-54.92205' lon='-67.46182' />
   <node id='-38733' lat='-19.40499' lon='-68.41218' />
   <node id='-38735' lat='-22.87076' lon='-67.85114' />
   <node id='-38737' lat='-18.35072' lon='-70.59118' />
@@ -4120,7 +4120,7 @@
   <node id='-38751' lat='6.50612' lon='-8.59456' />
   <node id='-38753' lat='7.55676' lon='-8.47114' />
   <node id='-38755' lat='12.62963' lon='14.83314' />
-  <node id='-38757' visible='true' lat='12.3269' lon='14.90827' />
+  <node id='-38757' lat='12.3269' lon='14.90827' />
   <node id='-38759' lat='11.79313' lon='15.11579' />
   <node id='-38761' lat='10.80921' lon='15.06737' />
   <node id='-38763' lat='9.99344' lon='15.68761' />
@@ -4134,8 +4134,8 @@
   <node id='-38779' lat='7.7696' lon='15.59272' />
   <node id='-38781' lat='7.58936' lon='15.56964' />
   <node id='-38783' lat='2.21537' lon='16.19357' />
-  <node id='-38785' visible='true' lat='2.16106' lon='13.29457' />
-  <node id='-38787' visible='true' lat='2.16561' lon='9.991' />
+  <node id='-38785' lat='2.16106' lon='13.29457' />
+  <node id='-38787' lat='2.16561' lon='9.991' />
   <node id='-38789' lat='2.33797' lon='9.81162' />
   <node id='-38791' lat='4.06346' lon='8.6479' />
   <node id='-38793' lat='4.30689' lon='8.34397' />
@@ -4144,10 +4144,10 @@
   <node id='-38799' lat='35.70297' lon='32.82353' />
   <node id='-38801' lat='5.02033' lon='27.44419' />
   <node id='-38803' lat='-2.7416' lon='29.04081' />
-  <node id='-38805' visible='true' lat='-6.2731' lon='29.52552' />
+  <node id='-38805' lat='-6.2731' lon='29.52552' />
   <node id='-38807' lat='-8.27382' lon='30.79243' />
-  <node id='-38809' visible='true' lat='-8.4831' lon='28.88917' />
-  <node id='-38811' visible='true' lat='-9.92942' lon='28.62795' />
+  <node id='-38809' lat='-8.4831' lon='28.88917' />
+  <node id='-38811' lat='-9.92942' lon='28.62795' />
   <node id='-38813' lat='-13.44683' lon='29.81551' />
   <node id='-38815' lat='3.47564' lon='18.62755' />
   <node id='-38817' lat='-4.63739' lon='13.09648' />
@@ -4165,20 +4165,20 @@
   <node id='-38841' lat='-0.2287' lon='13.90632' />
   <node id='-38843' lat='0.57255' lon='14.26066' />
   <node id='-38845' lat='12.65801' lon='-71.19849' />
-  <node id='-38847' visible='true' lat='11.85' lon='-71.3275' />
+  <node id='-38847' lat='11.85' lon='-71.3275' />
   <node id='-38849' lat='6.1072' lon='-69.41843' />
-  <node id='-38851' visible='true' lat='3.38393' lon='-67.30945' />
+  <node id='-38851' lat='3.38393' lon='-67.30945' />
   <node id='-38853' lat='2.35778' lon='-67.21967' />
   <node id='-38855' lat='-3.7921' lon='-70.71396' />
   <node id='-38857' lat='-2.73906' lon='-70.04609' />
-  <node id='-38859' visible='true' lat='-0.97229' lon='-74.26675' />
+  <node id='-38859' lat='-0.97229' lon='-74.26675' />
   <node id='-38861' lat='1.46862' lon='-78.86967' />
   <node id='-38863' lat='7.07793' lon='-78.06168' />
   <node id='-38865' lat='8.81247' lon='-77.32389' />
   <node id='-38867' lat='9.65379' lon='-82.51044' />
   <node id='-38869' lat='9.57279' lon='-82.56507' />
-  <node id='-38871' visible='true' lat='8.10219' lon='-82.88641' />
-  <node id='-38873' visible='true' lat='8.05755' lon='-82.89137' />
+  <node id='-38871' lat='8.10219' lon='-82.88641' />
+  <node id='-38873' lat='8.05755' lon='-82.89137' />
   <node id='-38875' lat='7.93865' lon='-82.94503' />
   <node id='-38877' lat='11.09059' lon='-86.14524' />
   <node id='-38879' lat='35.04253' lon='33.76106' />
@@ -4270,11 +4270,11 @@
   <node id='-39051' lat='47.71635' lon='7.53722' />
   <node id='-39053' lat='47.72912' lon='7.54761' />
   <node id='-39055' lat='47.77747' lon='7.52921' />
-  <node id='-39057' visible='true' lat='48.54758' lon='7.80167' />
-  <node id='-39059' visible='true' lat='48.58236' lon='7.80178' />
+  <node id='-39057' lat='48.54758' lon='7.80167' />
+  <node id='-39059' lat='48.58236' lon='7.80178' />
   <node id='-39061' lat='48.87985' lon='8.12813' />
-  <node id='-39063' visible='true' lat='48.95825' lon='8.19989' />
-  <node id='-39065' visible='true' lat='48.95856' lon='8.20031' />
+  <node id='-39063' lat='48.95825' lon='8.19989' />
+  <node id='-39065' lat='48.95856' lon='8.20031' />
   <node id='-39067' lat='48.97946' lon='8.14241' />
   <node id='-39069' lat='49.03161' lon='7.97783' />
   <node id='-39071' lat='49.05567' lon='7.93916' />
@@ -4284,9 +4284,9 @@
   <node id='-39079' lat='49.17' lon='7.49473' />
   <node id='-39081' lat='49.17308' lon='7.3662' />
   <node id='-39083' lat='49.28065' lon='6.66583' />
-  <node id='-39085' visible='true' lat='49.46546' lon='6.40274' />
-  <node id='-39087' visible='true' lat='49.4667' lon='6.39168' />
-  <node id='-39089' visible='true' lat='49.46463' lon='6.38352' />
+  <node id='-39085' lat='49.46546' lon='6.40274' />
+  <node id='-39087' lat='49.4667' lon='6.39168' />
+  <node id='-39089' lat='49.46463' lon='6.38352' />
   <node id='-39091' lat='49.48931' lon='6.36907' />
   <node id='-39093' lat='49.55171' lon='6.38072' />
   <node id='-39095' lat='49.57053' lon='6.35825' />
@@ -4320,7 +4320,7 @@
   <node id='-39151' lat='50.92066' lon='6.09297' />
   <node id='-39153' lat='50.93367' lon='6.01615' />
   <node id='-39155' lat='50.9852' lon='6.02577' />
-  <node id='-39157' visible='true' lat='51.07469' lon='5.98292' />
+  <node id='-39157' lat='51.07469' lon='5.98292' />
   <node id='-39159' lat='51.54096' lon='6.18017' />
   <node id='-39161' lat='51.60564' lon='6.09055' />
   <node id='-39163' lat='51.85883' lon='6.47437' />
@@ -4351,27 +4351,27 @@
   <node id='-39213' lat='17.83927' lon='-68.20301' />
   <node id='-39215' lat='17.20162' lon='-71.87936' />
   <node id='-39217' lat='18.03686' lon='-71.75355' />
-  <node id='-39219' visible='true' lat='18.78423' lon='-71.71885' />
+  <node id='-39219' lat='18.78423' lon='-71.71885' />
   <node id='-39221' lat='20.08703' lon='-72.17094' />
   <node id='-39223' lat='35.73669' lon='8.26472' />
   <node id='-39225' lat='35.29884' lon='8.30329' />
   <node id='-39227' lat='34.57575' lon='8.20482' />
   <node id='-39229' lat='34.06493' lon='7.52851' />
   <node id='-39231' lat='32.83483' lon='8.31895' />
-  <node id='-39233' visible='true' lat='32.50101' lon='8.35999' />
+  <node id='-39233' lat='32.50101' lon='8.35999' />
   <node id='-39235' lat='30.16738' lon='9.3876' />
-  <node id='-39237' visible='true' lat='23.51735' lon='11.96886' />
-  <node id='-39239' visible='true' lat='20.87258' lon='7.48273' />
-  <node id='-39241' visible='true' lat='20.79165' lon='7.38361' />
+  <node id='-39237' lat='23.51735' lon='11.96886' />
+  <node id='-39239' lat='20.87258' lon='7.48273' />
+  <node id='-39241' lat='20.79165' lon='7.38361' />
   <node id='-39243' lat='19.45101' lon='5.8153' />
   <node id='-39245' lat='19.14224' lon='4.26651' />
   <node id='-39247' lat='21.12843' lon='1.15698' />
   <node id='-39249' lat='24.99935' lon='-4.83423' />
   <node id='-39251' lat='27.6666' lon='-8.66879' />
   <node id='-39253' lat='28.71194' lon='-8.6715' />
-  <node id='-39255' visible='true' lat='29.50924' lon='-6.95824' />
-  <node id='-39257' visible='true' lat='29.51623' lon='-6.69965' />
-  <node id='-39259' visible='true' lat='29.61407' lon='-5.75616' />
+  <node id='-39255' lat='29.50924' lon='-6.95824' />
+  <node id='-39257' lat='29.51623' lon='-6.69965' />
+  <node id='-39259' lat='29.61407' lon='-5.75616' />
   <node id='-39261' lat='29.48103' lon='-5.58831' />
   <node id='-39263' lat='30.67539' lon='-3.64735' />
   <node id='-39265' lat='30.85566' lon='-3.65418' />
@@ -4388,7 +4388,7 @@
   <node id='-39287' lat='-1.55961' lon='-75.57429' />
   <node id='-39289' lat='-2.12179' lon='-76.05203' />
   <node id='-39291' lat='-2.58397' lon='-76.6324' />
-  <node id='-39293' visible='true' lat='-3.05454' lon='-77.94147' />
+  <node id='-39293' lat='-3.05454' lon='-77.94147' />
   <node id='-39295' lat='-5.01481' lon='-79.01659' />
   <node id='-39297' lat='-3.43246' lon='-80.22627' />
   <node id='-39299' lat='-3.39149' lon='-80.30602' />
@@ -4396,7 +4396,7 @@
   <node id='-39303' lat='31.32363' lon='34.21853' />
   <node id='-39305' lat='31.29214' lon='34.23985' />
   <node id='-39307' lat='29.24574' lon='24.99968' />
-  <node id='-39309' visible='true' lat='31.57937' lon='25.06041' />
+  <node id='-39309' lat='31.57937' lon='25.06041' />
   <node id='-39311' lat='31.67534' lon='25.14001' />
   <node id='-39313' lat='16.19728' lon='41.37609' />
   <node id='-39315' lat='15.565' lon='41.29956' />
@@ -4443,8 +4443,8 @@
   <node id='-39397' lat='42.82713' lon='-0.50863' />
   <node id='-39399' lat='42.80132' lon='-0.38833' />
   <node id='-39401' lat='42.84788' lon='-0.3122' />
-  <node id='-39403' visible='true' lat='42.78974' lon='-0.17939' />
-  <node id='-39405' visible='true' lat='42.79535' lon='-0.16141' />
+  <node id='-39403' lat='42.78974' lon='-0.17939' />
+  <node id='-39405' lat='42.79535' lon='-0.16141' />
   <node id='-39407' lat='42.68513' lon='-0.02468' />
   <node id='-39409' lat='42.73424' lon='0.17569' />
   <node id='-39411' lat='42.7174' lon='0.25336' />
@@ -4503,7 +4503,7 @@
   <node id='-39517' lat='35.92591' lon='-5.38491' />
   <node id='-39519' lat='35.93752' lon='-5.64962' />
   <node id='-39521' lat='36.96896' lon='-7.37282' />
-  <node id='-39523' visible='true' lat='37.81193' lon='-7.33441' />
+  <node id='-39523' lat='37.81193' lon='-7.33441' />
   <node id='-39525' lat='38.01914' lon='-7.00375' />
   <node id='-39527' lat='39.66717' lon='-7.54121' />
   <node id='-39529' lat='39.66877' lon='-7.01613' />
@@ -4523,7 +4523,7 @@
   <node id='-39557' lat='57.87471' lon='24.3579' />
   <node id='-39559' lat='57.91787' lon='24.26221' />
   <node id='-39561' lat='10.98533' lon='42.95776' />
-  <node id='-39563' visible='true' lat='8.93028' lon='44.19222' />
+  <node id='-39563' lat='8.93028' lon='44.19222' />
   <node id='-39565' lat='7.9989' lon='46.99339' />
   <node id='-39567' lat='4.91821' lon='44.98104' />
   <node id='-39569' lat='4.9451' lon='44.02436' />
@@ -4537,7 +4537,7 @@
   <node id='-39585' lat='68.06655' lon='29.34179' />
   <node id='-39587' lat='67.67523' lon='30.02041' />
   <node id='-39589' lat='65.39731' lon='24.14112' />
-  <node id='-39591' visible='true' lat='65.84079' lon='24.16341' />
+  <node id='-39591' lat='65.84079' lon='24.16341' />
   <node id='-39593' lat='69.06069' lon='20.55258' />
   <node id='-39595' lat='69.11874' lon='20.72171' />
   <node id='-39597' lat='69.0356' lon='21.05775' />
@@ -4546,7 +4546,7 @@
   <node id='-39603' lat='69.31281' lon='21.27827' />
   <node id='-39605' lat='-17.28904' lon='162.93363' />
   <node id='-39607' lat='-22.54607' lon='173.07304' />
-  <node id='-39609' visible='true' lat='5.26909' lon='-54.26916' />
+  <node id='-39609' lat='5.26909' lon='-54.26916' />
   <node id='-39611' lat='14.96709' lon='-61.51867' />
   <node id='-39613' lat='15.22234' lon='-60.69955' />
   <node id='-39615' lat='15.70997' lon='-60.95725' />
@@ -4566,7 +4566,7 @@
   <node id='-39643' lat='49.46351' lon='6.09845' />
   <node id='-39645' lat='49.49365' lon='6.12814' />
   <node id='-39647' lat='49.51408' lon='6.2409' />
-  <node id='-39649' visible='true' lat='47.43824' lon='7.40635' />
+  <node id='-39649' lat='47.43824' lon='7.40635' />
   <node id='-39651' lat='47.49455' lon='7.19583' />
   <node id='-39653' lat='47.0494' lon='6.71531' />
   <node id='-39655' lat='46.92703' lon='6.43341' />
@@ -4620,7 +4620,7 @@
   <node id='-39751' lat='36.05935' lon='-5.32837' />
   <node id='-39753' lat='36.06205' lon='-5.36503' />
   <node id='-39755' lat='36.14942' lon='-5.27801' />
-  <node id='-39757' visible='true' lat='55.06933' lon='-7.2471' />
+  <node id='-39757' lat='55.06933' lon='-7.2471' />
   <node id='-39759' lat='49.31141' lon='-2.9511' />
   <node id='-39761' lat='49.7273' lon='-6.81839' />
   <node id='-39763' lat='55.54107' lon='-6.79943' />
@@ -4663,13 +4663,13 @@
   <node id='-39837' lat='11.60713' lon='-14.31513' />
   <node id='-39839' lat='11.49708' lon='-14.51173' />
   <node id='-39841' lat='11.51188' lon='-14.66677' />
-  <node id='-39843' visible='true' lat='12.34803' lon='-16.70562' />
+  <node id='-39843' lat='12.34803' lon='-16.70562' />
   <node id='-39845' lat='12.6847' lon='-15.17582' />
   <node id='-39847' lat='12.68013' lon='-13.70523' />
   <node id='-39849' lat='2.44901' lon='9.6225' />
   <node id='-39851' lat='2.32428' lon='9.83754' />
-  <node id='-39853' visible='true' lat='2.20457' lon='9.89012' />
-  <node id='-39855' visible='true' lat='2.20049' lon='9.90749' />
+  <node id='-39853' lat='2.20457' lon='9.89012' />
+  <node id='-39855' lat='2.20049' lon='9.90749' />
   <node id='-39857' lat='41.70996' lon='26.36799' />
   <node id='-39859' lat='39.6504' lon='19.98042' />
   <node id='-39861' lat='41.34104' lon='22.93334' />
@@ -4682,21 +4682,21 @@
   <node id='-39875' lat='4.89394' lon='-57.8699' />
   <node id='-39877' lat='3.32121' lon='-57.35891' />
   <node id='-39879' lat='5.95304' lon='-61.4041' />
-  <node id='-39881' visible='true' lat='6.8631' lon='-60.54873' />
-  <node id='-39883' visible='true' lat='6.94847' lon='-60.39419' />
-  <node id='-39885' visible='true' lat='8.35213' lon='-59.85562' />
+  <node id='-39881' lat='6.8631' lon='-60.54873' />
+  <node id='-39883' lat='6.94847' lon='-60.39419' />
+  <node id='-39885' lat='8.35213' lon='-59.85562' />
   <node id='-39887' lat='8.53046' lon='-59.98508' />
   <node id='-39889' lat='17.73736' lon='-83.86109' />
   <node id='-39891' lat='15.03256' lon='-83.04763' />
   <node id='-39893' lat='15.00002' lon='-83.13724' />
-  <node id='-39895' visible='true' lat='14.11304' lon='-85.45762' />
+  <node id='-39895' lat='14.11304' lon='-85.45762' />
   <node id='-39897' lat='12.98646' lon='-87.37107' />
   <node id='-39899' lat='13.25228' lon='-87.69751' />
   <node id='-39901' lat='13.32715' lon='-87.73714' />
-  <node id='-39903' visible='true' lat='13.44169' lon='-87.73841' />
-  <node id='-39905' visible='true' lat='13.46083' lon='-87.72115' />
+  <node id='-39903' lat='13.44169' lon='-87.73841' />
+  <node id='-39905' lat='13.46083' lon='-87.72115' />
   <node id='-39907' lat='14.43013' lon='-89.34776' />
-  <node id='-39909' visible='true' lat='15.14039' lon='-88.97343' />
+  <node id='-39909' lat='15.14039' lon='-88.97343' />
   <node id='-39911' lat='15.72294' lon='-88.22552' />
   <node id='-39913' lat='46.28122' lon='16.8903' />
   <node id='-39915' lat='45.909' lon='18.81394' />
@@ -4706,14 +4706,14 @@
   <node id='-39923' lat='42.92787' lon='17.5392' />
   <node id='-39925' lat='42.88641' lon='17.6444' />
   <node id='-39927' lat='45.4895' lon='13.56979' />
-  <node id='-39929' visible='true' lat='45.45898' lon='13.62902' />
+  <node id='-39929' lat='45.45898' lon='13.62902' />
   <node id='-39931' lat='46.37837' lon='16.30233' />
   <node id='-39933' lat='48.34628' lon='21.72525' />
   <node id='-39935' lat='48.4005' lon='22.14689' />
   <node id='-39937' lat='47.95851' lon='22.89849' />
   <node id='-39939' lat='46.50693' lon='21.25586' />
   <node id='-39941' lat='46.14405' lon='20.45377' />
-  <node id='-39943' visible='true' lat='46.1438' lon='20.28324' />
+  <node id='-39943' lat='46.1438' lon='20.28324' />
   <node id='-39945' lat='46.12332' lon='20.26068' />
   <node id='-39947' lat='46.04015' lon='19.10388' />
   <node id='-39949' lat='45.84207' lon='17.66545' />
@@ -4729,12 +4729,12 @@
   <node id='-39969' lat='-8.85617' lon='124.94011' />
   <node id='-39971' lat='-9.08128' lon='124.97742' />
   <node id='-39973' lat='0.68547' lon='141.00167' />
-  <node id='-39975' visible='true' lat='1.94859' lon='109.57443' />
-  <node id='-39977' visible='true' lat='1.91771' lon='109.53794' />
+  <node id='-39975' lat='1.94859' lon='109.57443' />
+  <node id='-39977' lat='1.91771' lon='109.53794' />
   <node id='-39979' lat='26.36205' lon='88.01271' />
   <node id='-39981' lat='27.62149' lon='96.90112' />
   <node id='-39983' lat='27.45752' lon='96.91431' />
-  <node id='-39985' visible='true' lat='27.29818' lon='96.40779' />
+  <node id='-39985' lat='27.29818' lon='96.40779' />
   <node id='-39987' lat='26.65372' lon='95.30339' />
   <node id='-39989' lat='26.07338' lon='95.18556' />
   <node id='-39991' lat='25.93214' lon='95.02858' />
@@ -4747,45 +4747,45 @@
   <node id='-40005' lat='23.35356' lon='93.3633' />
   <node id='-40007' lat='21.77397' lon='89.03553' />
   <node id='-40009' lat='21.42955' lon='89.13606' />
-  <node id='-40011' visible='true' lat='9.159' lon='79.45362' />
+  <node id='-40011' lat='9.159' lon='79.45362' />
   <node id='-40013' lat='7.85769' lon='77.66782' />
-  <node id='-40015' visible='true' lat='23.13052' lon='68.69125' />
-  <node id='-40017' visible='true' lat='23.15424' lon='68.66066' />
-  <node id='-40019' visible='true' lat='23.15778' lon='68.65406' />
-  <node id='-40021' visible='true' lat='23.16205' lon='68.65065' />
-  <node id='-40023' visible='true' lat='23.17145' lon='68.65113' />
-  <node id='-40025' visible='true' lat='23.18085' lon='68.64967' />
-  <node id='-40027' visible='true' lat='23.19156' lon='68.62257' />
-  <node id='-40029' visible='true' lat='23.20677' lon='68.60914' />
-  <node id='-40031' visible='true' lat='23.22504' lon='68.59995' />
-  <node id='-40033' visible='true' lat='23.24038' lon='68.59571' />
-  <node id='-40035' visible='true' lat='23.23697' lon='68.59832' />
-  <node id='-40037' visible='true' lat='23.22671' lon='68.60939' />
-  <node id='-40039' visible='true' lat='23.24543' lon='68.62013' />
-  <node id='-40041' visible='true' lat='23.25617' lon='68.62322' />
-  <node id='-40043' visible='true' lat='23.26765' lon='68.62306' />
-  <node id='-40045' visible='true' lat='23.25959' lon='68.60532' />
-  <node id='-40047' visible='true' lat='23.25528' lon='68.57781' />
-  <node id='-40049' visible='true' lat='23.25971' lon='68.55226' />
-  <node id='-40051' visible='true' lat='23.27823' lon='68.54103' />
-  <node id='-40053' visible='true' lat='23.31611' lon='68.56105' />
-  <node id='-40055' visible='true' lat='23.31843' lon='68.56853' />
-  <node id='-40057' visible='true' lat='23.32225' lon='68.59913' />
-  <node id='-40059' visible='true' lat='23.32559' lon='68.60694' />
-  <node id='-40061' visible='true' lat='23.33283' lon='68.60304' />
-  <node id='-40063' visible='true' lat='23.34007' lon='68.59205' />
-  <node id='-40065' visible='true' lat='23.34341' lon='68.57838' />
-  <node id='-40067' visible='true' lat='23.34638' lon='68.57106' />
-  <node id='-40069' visible='true' lat='23.35297' lon='68.56666' />
-  <node id='-40071' visible='true' lat='23.35993' lon='68.56373' />
-  <node id='-40073' visible='true' lat='23.36392' lon='68.56105' />
-  <node id='-40075' visible='true' lat='23.36396' lon='68.55519' />
-  <node id='-40077' visible='true' lat='23.36152' lon='68.54851' />
-  <node id='-40079' visible='true' lat='23.35859' lon='68.54314' />
-  <node id='-40081' visible='true' lat='23.357' lon='68.54103' />
-  <node id='-40083' visible='true' lat='23.3631' lon='68.52947' />
-  <node id='-40085' visible='true' lat='23.36921' lon='68.52068' />
-  <node id='-40087' visible='true' lat='23.37702' lon='68.51515' />
+  <node id='-40015' lat='23.13052' lon='68.69125' />
+  <node id='-40017' lat='23.15424' lon='68.66066' />
+  <node id='-40019' lat='23.15778' lon='68.65406' />
+  <node id='-40021' lat='23.16205' lon='68.65065' />
+  <node id='-40023' lat='23.17145' lon='68.65113' />
+  <node id='-40025' lat='23.18085' lon='68.64967' />
+  <node id='-40027' lat='23.19156' lon='68.62257' />
+  <node id='-40029' lat='23.20677' lon='68.60914' />
+  <node id='-40031' lat='23.22504' lon='68.59995' />
+  <node id='-40033' lat='23.24038' lon='68.59571' />
+  <node id='-40035' lat='23.23697' lon='68.59832' />
+  <node id='-40037' lat='23.22671' lon='68.60939' />
+  <node id='-40039' lat='23.24543' lon='68.62013' />
+  <node id='-40041' lat='23.25617' lon='68.62322' />
+  <node id='-40043' lat='23.26765' lon='68.62306' />
+  <node id='-40045' lat='23.25959' lon='68.60532' />
+  <node id='-40047' lat='23.25528' lon='68.57781' />
+  <node id='-40049' lat='23.25971' lon='68.55226' />
+  <node id='-40051' lat='23.27823' lon='68.54103' />
+  <node id='-40053' lat='23.31611' lon='68.56105' />
+  <node id='-40055' lat='23.31843' lon='68.56853' />
+  <node id='-40057' lat='23.32225' lon='68.59913' />
+  <node id='-40059' lat='23.32559' lon='68.60694' />
+  <node id='-40061' lat='23.33283' lon='68.60304' />
+  <node id='-40063' lat='23.34007' lon='68.59205' />
+  <node id='-40065' lat='23.34341' lon='68.57838' />
+  <node id='-40067' lat='23.34638' lon='68.57106' />
+  <node id='-40069' lat='23.35297' lon='68.56666' />
+  <node id='-40071' lat='23.35993' lon='68.56373' />
+  <node id='-40073' lat='23.36392' lon='68.56105' />
+  <node id='-40075' lat='23.36396' lon='68.55519' />
+  <node id='-40077' lat='23.36152' lon='68.54851' />
+  <node id='-40079' lat='23.35859' lon='68.54314' />
+  <node id='-40081' lat='23.357' lon='68.54103' />
+  <node id='-40083' lat='23.3631' lon='68.52947' />
+  <node id='-40085' lat='23.36921' lon='68.52068' />
+  <node id='-40087' lat='23.37702' lon='68.51515' />
   <node id='-40089' lat='23.53945' lon='68.11329' />
   <node id='-40091' lat='23.85849' lon='68.20763' />
   <node id='-40093' lat='23.94592' lon='68.37871' />
@@ -4821,7 +4821,7 @@
   <node id='-40153' lat='30.19829' lon='73.97225' />
   <node id='-40155' lat='30.36305' lon='73.88993' />
   <node id='-40157' lat='31.04153' lon='74.5616' />
-  <node id='-40159' visible='true' lat='31.30321' lon='74.53223' />
+  <node id='-40159' lat='31.30321' lon='74.53223' />
   <node id='-40161' lat='31.45605' lon='74.64713' />
   <node id='-40163' lat='31.72227' lon='74.47771' />
   <node id='-40165' lat='32.26836' lon='75.38046' />
@@ -4879,7 +4879,7 @@
   <node id='-40269' lat='39.19842' lon='44.1043' />
   <node id='-40271' lat='39.68788' lon='44.47298' />
   <node id='-40273' lat='37.38615' lon='42.78887' />
-  <node id='-40275' visible='true' lat='37.32015' lon='42.93705' />
+  <node id='-40275' lat='37.32015' lon='42.93705' />
   <node id='-40277' lat='29.66815' lon='48.59531' />
   <node id='-40279' lat='30.02906' lon='48.06782' />
   <node id='-40281' lat='29.98906' lon='48.01114' />
@@ -4903,10 +4903,10 @@
   <node id='-40317' lat='36.52502' lon='41.40058' />
   <node id='-40319' lat='36.58782' lon='41.81736' />
   <node id='-40321' lat='37.0627' lon='42.36697' />
-  <node id='-40323' visible='true' lat='37.10998' lon='42.35724' />
+  <node id='-40323' lat='37.10998' lon='42.35724' />
   <node id='-40325' lat='37.14878' lon='42.56725' />
   <node id='-40327' lat='33.1031' lon='35.84802' />
-  <node id='-40329' visible='true' lat='31.76535' lon='35.55941' />
+  <node id='-40329' lat='31.76535' lon='35.55941' />
   <node id='-40331' lat='31.82938' lon='33.62659' />
   <node id='-40333' lat='33.09318' lon='35.10645' />
   <node id='-40335' lat='33.3172' lon='35.813' />
@@ -4918,7 +4918,7 @@
   <node id='-40347' lat='45.5825' lon='13.78445' />
   <node id='-40349' lat='45.92435' lon='7.04151' />
   <node id='-40351' lat='45.99867' lon='7.98881' />
-  <node id='-40353' visible='true' lat='46.35071' lon='9.73086' />
+  <node id='-40353' lat='46.35071' lon='9.73086' />
   <node id='-40355' lat='46.44479' lon='10.03715' />
   <node id='-40357' lat='46.53164' lon='10.46136' />
   <node id='-40359' lat='17.08879' lon='-75.50728' />
@@ -4931,7 +4931,7 @@
   <node id='-40373' lat='29.49696' lon='36.50005' />
   <node id='-40375' lat='29.37455' lon='34.88293' />
   <node id='-40377' lat='29.45305' lon='34.92298' />
-  <node id='-40379' visible='true' lat='32.74428' lon='35.75743' />
+  <node id='-40379' lat='32.74428' lon='35.75743' />
   <node id='-40381' lat='32.31293' lon='36.83946' />
   <node id='-40383' lat='33.37328' lon='38.79171' />
   <node id='-40385' lat='32.50304' lon='39.08202' />
@@ -4950,69 +4950,69 @@
   <node id='-40411' lat='41.03019' lon='68.62221' />
   <node id='-40413' lat='42.85481' lon='65.85194' />
   <node id='-40415' lat='45.58671' lon='58.59711' />
-  <node id='-40417' visible='true' lat='44.99622' lon='55.97842' />
-  <node id='-40419' visible='true' lat='44.99622' lon='55.97832' />
-  <node id='-40421' visible='true' lat='44.99617' lon='55.97822' />
-  <node id='-40423' visible='true' lat='44.99617' lon='55.97811' />
-  <node id='-40425' visible='true' lat='44.99612' lon='55.97801' />
-  <node id='-40427' visible='true' lat='44.99607' lon='55.97801' />
-  <node id='-40429' visible='true' lat='44.99607' lon='55.97791' />
-  <node id='-40431' visible='true' lat='44.99607' lon='55.9778' />
-  <node id='-40433' visible='true' lat='44.99601' lon='55.9777' />
-  <node id='-40435' visible='true' lat='44.99596' lon='55.9777' />
-  <node id='-40437' visible='true' lat='44.99591' lon='55.9776' />
-  <node id='-40439' visible='true' lat='44.99591' lon='55.97749' />
-  <node id='-40441' visible='true' lat='44.99591' lon='55.97739' />
-  <node id='-40443' visible='true' lat='44.99586' lon='55.97739' />
-  <node id='-40445' visible='true' lat='44.99586' lon='55.97729' />
-  <node id='-40447' visible='true' lat='44.99581' lon='55.97718' />
-  <node id='-40449' visible='true' lat='44.99576' lon='55.97708' />
-  <node id='-40451' visible='true' lat='44.9957' lon='55.97698' />
-  <node id='-40453' visible='true' lat='44.99565' lon='55.97698' />
-  <node id='-40455' visible='true' lat='44.9956' lon='55.97687' />
-  <node id='-40457' visible='true' lat='44.9956' lon='55.97677' />
-  <node id='-40459' visible='true' lat='44.99555' lon='55.97677' />
-  <node id='-40461' visible='true' lat='44.9955' lon='55.97677' />
-  <node id='-40463' visible='true' lat='44.99545' lon='55.97667' />
-  <node id='-40465' visible='true' lat='44.99539' lon='55.97656' />
-  <node id='-40467' visible='true' lat='44.99534' lon='55.97646' />
-  <node id='-40469' visible='true' lat='44.99529' lon='55.97646' />
-  <node id='-40471' visible='true' lat='44.99524' lon='55.97636' />
-  <node id='-40473' visible='true' lat='44.99519' lon='55.97636' />
-  <node id='-40475' visible='true' lat='44.99514' lon='55.97625' />
-  <node id='-40477' visible='true' lat='44.99508' lon='55.97615' />
-  <node id='-40479' visible='true' lat='44.99503' lon='55.97615' />
-  <node id='-40481' visible='true' lat='44.99498' lon='55.97615' />
-  <node id='-40483' visible='true' lat='44.99493' lon='55.97615' />
-  <node id='-40485' visible='true' lat='44.99483' lon='55.97615' />
-  <node id='-40487' visible='true' lat='44.99477' lon='55.97615' />
-  <node id='-40489' visible='true' lat='44.99477' lon='55.97605' />
-  <node id='-40491' visible='true' lat='44.99467' lon='55.97605' />
-  <node id='-40493' visible='true' lat='44.99462' lon='55.97605' />
-  <node id='-40495' visible='true' lat='44.99457' lon='55.97605' />
-  <node id='-40497' visible='true' lat='44.99452' lon='55.97605' />
-  <node id='-40499' visible='true' lat='44.99446' lon='55.97594' />
-  <node id='-40501' visible='true' lat='44.99441' lon='55.97584' />
-  <node id='-40503' visible='true' lat='44.99436' lon='55.97584' />
-  <node id='-40505' visible='true' lat='44.99431' lon='55.97584' />
-  <node id='-40507' visible='true' lat='44.99426' lon='55.97584' />
-  <node id='-40509' visible='true' lat='44.99421' lon='55.97584' />
-  <node id='-40511' visible='true' lat='44.99415' lon='55.97584' />
-  <node id='-40513' visible='true' lat='44.99405' lon='55.97584' />
-  <node id='-40515' visible='true' lat='44.994' lon='55.97584' />
-  <node id='-40517' visible='true' lat='44.9939' lon='55.97584' />
-  <node id='-40519' visible='true' lat='44.99384' lon='55.97584' />
-  <node id='-40521' visible='true' lat='44.99374' lon='55.97584' />
-  <node id='-40523' visible='true' lat='44.99369' lon='55.97584' />
-  <node id='-40525' visible='true' lat='44.99359' lon='55.97584' />
-  <node id='-40527' visible='true' lat='44.99353' lon='55.97584' />
-  <node id='-40529' visible='true' lat='44.99348' lon='55.97584' />
-  <node id='-40531' visible='true' lat='44.99343' lon='55.97584' />
-  <node id='-40533' visible='true' lat='44.99338' lon='55.97584' />
-  <node id='-40535' visible='true' lat='44.99328' lon='55.97584' />
-  <node id='-40537' visible='true' lat='44.99322' lon='55.97584' />
+  <node id='-40417' lat='44.99622' lon='55.97842' />
+  <node id='-40419' lat='44.99622' lon='55.97832' />
+  <node id='-40421' lat='44.99617' lon='55.97822' />
+  <node id='-40423' lat='44.99617' lon='55.97811' />
+  <node id='-40425' lat='44.99612' lon='55.97801' />
+  <node id='-40427' lat='44.99607' lon='55.97801' />
+  <node id='-40429' lat='44.99607' lon='55.97791' />
+  <node id='-40431' lat='44.99607' lon='55.9778' />
+  <node id='-40433' lat='44.99601' lon='55.9777' />
+  <node id='-40435' lat='44.99596' lon='55.9777' />
+  <node id='-40437' lat='44.99591' lon='55.9776' />
+  <node id='-40439' lat='44.99591' lon='55.97749' />
+  <node id='-40441' lat='44.99591' lon='55.97739' />
+  <node id='-40443' lat='44.99586' lon='55.97739' />
+  <node id='-40445' lat='44.99586' lon='55.97729' />
+  <node id='-40447' lat='44.99581' lon='55.97718' />
+  <node id='-40449' lat='44.99576' lon='55.97708' />
+  <node id='-40451' lat='44.9957' lon='55.97698' />
+  <node id='-40453' lat='44.99565' lon='55.97698' />
+  <node id='-40455' lat='44.9956' lon='55.97687' />
+  <node id='-40457' lat='44.9956' lon='55.97677' />
+  <node id='-40459' lat='44.99555' lon='55.97677' />
+  <node id='-40461' lat='44.9955' lon='55.97677' />
+  <node id='-40463' lat='44.99545' lon='55.97667' />
+  <node id='-40465' lat='44.99539' lon='55.97656' />
+  <node id='-40467' lat='44.99534' lon='55.97646' />
+  <node id='-40469' lat='44.99529' lon='55.97646' />
+  <node id='-40471' lat='44.99524' lon='55.97636' />
+  <node id='-40473' lat='44.99519' lon='55.97636' />
+  <node id='-40475' lat='44.99514' lon='55.97625' />
+  <node id='-40477' lat='44.99508' lon='55.97615' />
+  <node id='-40479' lat='44.99503' lon='55.97615' />
+  <node id='-40481' lat='44.99498' lon='55.97615' />
+  <node id='-40483' lat='44.99493' lon='55.97615' />
+  <node id='-40485' lat='44.99483' lon='55.97615' />
+  <node id='-40487' lat='44.99477' lon='55.97615' />
+  <node id='-40489' lat='44.99477' lon='55.97605' />
+  <node id='-40491' lat='44.99467' lon='55.97605' />
+  <node id='-40493' lat='44.99462' lon='55.97605' />
+  <node id='-40495' lat='44.99457' lon='55.97605' />
+  <node id='-40497' lat='44.99452' lon='55.97605' />
+  <node id='-40499' lat='44.99446' lon='55.97594' />
+  <node id='-40501' lat='44.99441' lon='55.97584' />
+  <node id='-40503' lat='44.99436' lon='55.97584' />
+  <node id='-40505' lat='44.99431' lon='55.97584' />
+  <node id='-40507' lat='44.99426' lon='55.97584' />
+  <node id='-40509' lat='44.99421' lon='55.97584' />
+  <node id='-40511' lat='44.99415' lon='55.97584' />
+  <node id='-40513' lat='44.99405' lon='55.97584' />
+  <node id='-40515' lat='44.994' lon='55.97584' />
+  <node id='-40517' lat='44.9939' lon='55.97584' />
+  <node id='-40519' lat='44.99384' lon='55.97584' />
+  <node id='-40521' lat='44.99374' lon='55.97584' />
+  <node id='-40523' lat='44.99369' lon='55.97584' />
+  <node id='-40525' lat='44.99359' lon='55.97584' />
+  <node id='-40527' lat='44.99353' lon='55.97584' />
+  <node id='-40529' lat='44.99348' lon='55.97584' />
+  <node id='-40531' lat='44.99343' lon='55.97584' />
+  <node id='-40533' lat='44.99338' lon='55.97584' />
+  <node id='-40535' lat='44.99328' lon='55.97584' />
+  <node id='-40537' lat='44.99322' lon='55.97584' />
   <node id='-40539' lat='41.32584' lon='56.00314' />
-  <node id='-40541' visible='true' lat='41.78034' lon='52.47884' />
+  <node id='-40541' lat='41.78034' lon='52.47884' />
   <node id='-40543' lat='41.69249' lon='52.26048' />
   <node id='-40545' lat='46.04554' lon='49.88945' />
   <node id='-40547' lat='46.26944' lon='49.32259' />
@@ -5071,7 +5071,7 @@
   <node id='-40653' lat='40.79122' lon='73.13412' />
   <node id='-40655' lat='41.5455' lon='70.17682' />
   <node id='-40657' lat='42.28356' lon='71.13263' />
-  <node id='-40659' visible='true' lat='42.97583' lon='74.86285' />
+  <node id='-40659' lat='42.97583' lon='74.86285' />
   <node id='-40661' lat='39.89808' lon='71.04979' />
   <node id='-40663' lat='40.1771' lon='71.06305' />
   <node id='-40665' lat='39.98598' lon='71.86463' />
@@ -5090,7 +5090,7 @@
   <node id='-40691' lat='37.70512' lon='126.13074' />
   <node id='-40693' lat='37.80873' lon='126.46818' />
   <node id='-40695' lat='37.92576' lon='126.68191' />
-  <node id='-40697' visible='true' lat='38.30722' lon='127.15749' />
+  <node id='-40697' lat='38.30722' lon='127.15749' />
   <node id='-40699' lat='38.33227' lon='127.38727' />
   <node id='-40701' lat='38.30647' lon='127.49672' />
   <node id='-40703' lat='38.32257' lon='127.55013' />
@@ -5130,12 +5130,12 @@
   <node id='-40771' lat='14.23076' lon='-60.5958' />
   <node id='-40773' lat='13.41452' lon='-60.70539' />
   <node id='-40775' lat='14.25664' lon='-61.26561' />
-  <node id='-40777' visible='true' lat='-29.45598' lon='29.33204' />
+  <node id='-40777' lat='-29.45598' lon='29.33204' />
   <node id='-40779' lat='-30.68072' lon='28.12073' />
   <node id='-40781' lat='-29.65439' lon='27.01016' />
   <node id='-40783' lat='53.95052' lon='23.51284' />
   <node id='-40785' lat='55.18507' lon='21.51095' />
-  <node id='-40787' visible='true' lat='55.21115' lon='21.46766' />
+  <node id='-40787' lat='55.21115' lon='21.46766' />
   <node id='-40789' lat='55.29348' lon='21.38446' />
   <node id='-40791' lat='55.28427' lon='21.35465' />
   <node id='-40793' lat='55.24456' lon='21.26425' />
@@ -5186,13 +5186,13 @@
   <node id='-40883' lat='50.17259' lon='5.96453' />
   <node id='-40885' lat='50.16362' lon='6.03093' />
   <node id='-40887' lat='56.44959' lon='24.89623' />
-  <node id='-40889' visible='true' lat='56.07818' lon='21.15016' />
+  <node id='-40889' lat='56.07818' lon='21.15016' />
   <node id='-40891' lat='56.04073' lon='20.68447' />
   <node id='-40893' lat='57.06466' lon='19.64795' />
   <node id='-40895' lat='57.56697' lon='23.20055' />
   <node id='-40897' lat='35.88794' lon='-5.27056' />
   <node id='-40899' lat='35.21494' lon='-3.90602' />
-  <node id='-40901' visible='true' lat='35.20841' lon='-3.88926' />
+  <node id='-40901' lat='35.20841' lon='-3.88926' />
   <node id='-40903' lat='35.35051' lon='-2.27707' />
   <node id='-40905' lat='35.08532' lon='-2.21248' />
   <node id='-40907' lat='34.74226' lon='-1.73707' />
@@ -5200,11 +5200,11 @@
   <node id='-40911' lat='33.27084' lon='-1.67067' />
   <node id='-40913' lat='32.07832' lon='-1.22829' />
   <node id='-40915' lat='32.06557' lon='-2.93873' />
-  <node id='-40917' visible='true' lat='31.79459' lon='-2.82784' />
+  <node id='-40917' lat='31.79459' lon='-2.82784' />
   <node id='-40919' lat='30.28343' lon='-4.6058' />
   <node id='-40921' lat='29.95253' lon='-5.21671' />
-  <node id='-40923' visible='true' lat='29.52322' lon='-5.72121' />
-  <node id='-40925' visible='true' lat='29.44634' lon='-6.78351' />
+  <node id='-40923' lat='29.52322' lon='-5.72121' />
+  <node id='-40925' lat='29.44634' lon='-6.78351' />
   <node id='-40927' lat='26.9898' lon='-8.71787' />
   <node id='-40929' lat='26.90042' lon='-9.56957' />
   <node id='-40931' lat='26.71379' lon='-9.81998' />
@@ -5243,7 +5243,7 @@
   <node id='-40997' lat='-12.74579' lon='51.94557' />
   <node id='-40999' lat='-26.33102' lon='47.18248' />
   <node id='-41001' lat='-25.64228' lon='42.93867' />
-  <node id='-41003' visible='true' lat='31.33364' lon='-111.06712' />
+  <node id='-41003' lat='31.33364' lon='-111.06712' />
   <node id='-41005' lat='31.33316' lon='-108.20979' />
   <node id='-41007' lat='31.78534' lon='-108.20899' />
   <node id='-41009' lat='31.784' lon='-106.529' />
@@ -5264,7 +5264,7 @@
   <node id='-41039' lat='31.39181' lon='-106.00363' />
   <node id='-41041' lat='28.93865' lon='-103.15787' />
   <node id='-41043' lat='29.7744' lon='-101.47277' />
-  <node id='-41045' visible='true' lat='25.96583' lon='-97.13927' />
+  <node id='-41045' lat='25.96583' lon='-97.13927' />
   <node id='-41047' lat='17.80373' lon='-87.24084' />
   <node id='-41049' lat='18.18511' lon='-87.84815' />
   <node id='-41051' lat='18.18266' lon='-87.85693' />
@@ -5273,7 +5273,7 @@
   <node id='-41057' lat='18.15213' lon='-87.90671' />
   <node id='-41059' lat='18.47617' lon='-88.26593' />
   <node id='-41061' lat='17.81655' lon='-90.98678' />
-  <node id='-41063' visible='true' lat='17.25192' lon='-90.99199' />
+  <node id='-41063' lat='17.25192' lon='-90.99199' />
   <node id='-41065' lat='17.25373' lon='-91.43809' />
   <node id='-41067' lat='16.70697' lon='-90.69064' />
   <node id='-41069' lat='16.49832' lon='-90.61212' />
@@ -5281,7 +5281,7 @@
   <node id='-41073' lat='15.07406' lon='-92.0621' />
   <node id='-41075' lat='14.53423' lon='-92.2261' />
   <node id='-41077' lat='14.39277' lon='-92.37213' />
-  <node id='-41079' visible='true' lat='32.53167' lon='-117.12512' />
+  <node id='-41079' lat='32.53167' lon='-117.12512' />
   <node id='-41081' lat='32.71894' lon='-114.71871' />
   <node id='-41083' lat='32.49742' lon='-114.82044' />
   <node id='-41085' lat='42.25915' lon='21.58992' />
@@ -5330,11 +5330,11 @@
   <node id='-41171' lat='12.84799' lon='99.18905' />
   <node id='-41173' lat='12.60603' lon='99.409' />
   <node id='-41175' lat='11.62434' lon='99.47598' />
-  <node id='-41177' visible='true' lat='11.32081' lon='99.31573' />
+  <node id='-41177' lat='11.32081' lon='99.31573' />
   <node id='-41179' lat='10.92962' lon='98.99701' />
   <node id='-41181' lat='42.21682' lon='18.45131' />
   <node id='-41183' lat='50.4648' lon='105.32528' />
-  <node id='-41185' visible='true' lat='49.97612' lon='107.36407' />
+  <node id='-41185' lat='49.97612' lon='107.36407' />
   <node id='-41187' lat='49.93191' lon='107.96116' />
   <node id='-41189' lat='49.60772' lon='113.02647' />
   <node id='-41191' lat='49.83356' lon='113.20216' />
@@ -5342,7 +5342,7 @@
   <node id='-41195' lat='48.51781' lon='115.78876' />
   <node id='-41197' lat='48.25699' lon='115.811' />
   <node id='-41199' lat='47.91988' lon='115.57128' />
-  <node id='-41201' visible='true' lat='47.80693' lon='116.08431' />
+  <node id='-41201' lat='47.80693' lon='116.08431' />
   <node id='-41203' lat='47.83662' lon='116.4465' />
   <node id='-41205' lat='47.88836' lon='116.87527' />
   <node id='-41207' lat='47.82242' lon='117.08918' />
@@ -5373,12 +5373,12 @@
   <node id='-41257' lat='50.69585' lon='92.07173' />
   <node id='-41259' lat='50.57498' lon='94.30823' />
   <node id='-41261' lat='51.46579' lon='98.22053' />
-  <node id='-41263' visible='true' lat='51.71832' lon='98.33222' />
+  <node id='-41263' lat='51.71832' lon='98.33222' />
   <node id='-41265' lat='-26.92273' lon='33.10054' />
-  <node id='-41267' visible='true' lat='-26.86027' lon='32.35222' />
-  <node id='-41269' visible='true' lat='-26.852' lon='32.29584' />
-  <node id='-41271' visible='true' lat='-26.84136' lon='32.22302' />
-  <node id='-41273' visible='true' lat='-26.84032' lon='32.19409' />
+  <node id='-41267' lat='-26.86027' lon='32.35222' />
+  <node id='-41269' lat='-26.852' lon='32.29584' />
+  <node id='-41271' lat='-26.84136' lon='32.22302' />
+  <node id='-41273' lat='-26.84032' lon='32.19409' />
   <node id='-41275' lat='-26.84345' lon='32.13315' />
   <node id='-41277' lat='-26.00978' lon='32.08599' />
   <node id='-41279' lat='-25.95387' lon='31.974' />
@@ -5411,7 +5411,7 @@
   <node id='-41333' lat='15.7044' lon='-9.33314' />
   <node id='-41335' lat='15.60553' lon='-9.44673' />
   <node id='-41337' lat='15.11001' lon='-10.90932' />
-  <node id='-41339' visible='true' lat='15.62339' lon='-11.43483' />
+  <node id='-41339' lat='15.62339' lon='-11.43483' />
   <node id='-41341' lat='14.76324' lon='-12.23936' />
   <node id='-41343' lat='15.52116' lon='-13.11029' />
   <node id='-41345' lat='16.61495' lon='-14.32144' />
@@ -5420,13 +5420,13 @@
   <node id='-41351' lat='20.76408' lon='-17.0471' />
   <node id='-41353' lat='20.92697' lon='-17.06781' />
   <node id='-41355' lat='20.9961' lon='-17.0396' />
-  <node id='-41357' visible='true' lat='21.33343' lon='-13.01525' />
+  <node id='-41357' lat='21.33343' lon='-13.01525' />
   <node id='-41359' lat='22.53866' lon='-13.08438' />
   <node id='-41361' lat='22.89493' lon='-13.10753' />
   <node id='-41363' lat='23.02297' lon='-13.00412' />
   <node id='-41365' lat='23.3187' lon='-12.36213' />
   <node id='-41367' lat='25.99918' lon='-8.66721' />
-  <node id='-41369' visible='true' lat='-9.62442' lon='33.48052' />
+  <node id='-41369' lat='-9.62442' lon='33.48052' />
   <node id='-41371' lat='-10.12279' lon='34.51911' />
   <node id='-41373' lat='-11.01611' lon='34.61161' />
   <node id='-41375' lat='-11.57354' lon='34.96296' />
@@ -5434,7 +5434,7 @@
   <node id='-41379' lat='-13.47292' lon='32.86113' />
   <node id='-41381' lat='-9.36712' lon='32.99397' />
   <node id='-41383' lat='5.61613' lon='101.14062' />
-  <node id='-41385' visible='true' lat='6.20475' lon='102.06666' />
+  <node id='-41385' lat='6.20475' lon='102.06666' />
   <node id='-41387' lat='1.33529' lon='104.34728' />
   <node id='-41389' lat='1.43322' lon='104.07348' />
   <node id='-41391' lat='1.44691' lon='104.04622' />
@@ -5448,7 +5448,7 @@
   <node id='-41407' lat='4.59798' lon='118.75416' />
   <node id='-41409' lat='4.15511' lon='118.07935' />
   <node id='-41411' lat='2.08014' lon='109.64506' />
-  <node id='-41413' visible='true' lat='4.82087' lon='115.02955' />
+  <node id='-41413' lat='4.82087' lon='115.02955' />
   <node id='-41415' lat='5.35005' lon='115.02521' />
   <node id='-41417' lat='-17.49501' lon='24.70864' />
   <node id='-41419' lat='-17.79571' lon='25.26433' />
@@ -5505,13 +5505,13 @@
   <node id='-41521' lat='69.04774' lon='28.91738' />
   <node id='-41523' lat='69.04469' lon='20.0695' />
   <node id='-41525' lat='67.96537' lon='17.90787' />
-  <node id='-41527' visible='true' lat='64.58402' lon='13.64276' />
+  <node id='-41527' lat='64.58402' lon='13.64276' />
   <node id='-41529' lat='64.46674' lon='14.11117' />
-  <node id='-41531' visible='true' lat='64.18725' lon='14.16051' />
+  <node id='-41531' lat='64.18725' lon='14.16051' />
   <node id='-41533' lat='64.00953' lon='13.98222' />
-  <node id='-41535' visible='true' lat='64.09087' lon='13.23411' />
+  <node id='-41535' lat='64.09087' lon='13.23411' />
   <node id='-41537' lat='61.7147' lon='12.14746' />
-  <node id='-41539' visible='true' lat='58.89604' lon='11.45199' />
+  <node id='-41539' lat='58.89604' lon='11.45199' />
   <node id='-41541' lat='58.99022' lon='11.4601' />
   <node id='-41543' lat='27.88015' lon='88.13378' />
   <node id='-41545' lat='28.83087' lon='80.07129' />
@@ -5549,7 +5549,7 @@
   <node id='-41609' lat='-9.23534' lon='142.0953' />
   <node id='-41611' lat='-9.56571' lon='142.0601' />
   <node id='-41613' lat='-9.34945' lon='140.88922' />
-  <node id='-41615' visible='true' lat='-9.1242' lon='141.00782' />
+  <node id='-41615' lat='-9.1242' lon='141.00782' />
   <node id='-41617' lat='55.25302' lon='18.57853' />
   <node id='-41619' lat='54.36264' lon='22.79705' />
   <node id='-41621' lat='49.83607' lon='22.97476' />
@@ -5576,7 +5576,7 @@
   <node id='-41663' lat='-23.9657' lon='-55.41784' />
   <node id='-41665' lat='-24.04274' lon='-54.29191' />
   <node id='-41667' lat='-27.30427' lon='-55.97778' />
-  <node id='-41669' visible='true' lat='-27.31296' lon='-58.60017' />
+  <node id='-41669' lat='-27.31296' lon='-58.60017' />
   <node id='-41671' lat='-25.13863' lon='-57.80821' />
   <node id='-41673' lat='24.74049' lon='50.8133' />
   <node id='-41675' lat='25.57887' lon='50.57069' />
@@ -5662,7 +5662,7 @@
   <node id='-41835' lat='29.86903' lon='36.75083' />
   <node id='-41837' lat='29.99949' lon='37.4971' />
   <node id='-41839' lat='30.33245' lon='37.66395' />
-  <node id='-41841' visible='true' lat='31.50081' lon='36.99791' />
+  <node id='-41841' lat='31.50081' lon='36.99791' />
   <node id='-41843' lat='31.99721' lon='38.99233' />
   <node id='-41845' lat='22.00903' lon='37.8565' />
   <node id='-41847' lat='15.69575' lon='23.99997' />
@@ -5722,9 +5722,9 @@
   <node id='-41955' lat='42.74888' lon='21.39045' />
   <node id='-41957' lat='42.8335' lon='20.35692' />
   <node id='-41959' lat='43.5264' lon='19.22807' />
-  <node id='-41961' visible='true' lat='2.67798' lon='-54.28534' />
+  <node id='-41961' lat='2.67798' lon='-54.28534' />
   <node id='-41963' lat='2.32856' lon='-54.6084' />
-  <node id='-41965' visible='true' lat='2.02964' lon='-56.70519' />
+  <node id='-41965' lat='2.02964' lon='-56.70519' />
   <node id='-41967' lat='5.0208' lon='-57.37442' />
   <node id='-41969' lat='6.2264' lon='-53.7094' />
   <node id='-41971' lat='48.92857' lon='22.42934' />
@@ -5746,7 +5746,7 @@
   <node id='-42003' lat='-27.31675' lon='31.97592' />
   <node id='-42005' lat='-27.31549' lon='31.49834' />
   <node id='-42007' lat='-25.71886' lon='31.4175' />
-  <node id='-42009' visible='true' lat='37.2863' lon='42.23683' />
+  <node id='-42009' lat='37.2863' lon='42.23683' />
   <node id='-42011' lat='33.40479' lon='35.82577' />
   <node id='-42013' lat='33.47886' lon='35.94816' />
   <node id='-42015' lat='34.64977' lon='35.98718' />
@@ -5762,7 +5762,7 @@
   <node id='-42035' lat='36.63243' lon='37.47253' />
   <node id='-42037' lat='36.66904' lon='37.49103' />
   <node id='-42039' lat='36.75065' lon='37.68048' />
-  <node id='-42041' visible='true' lat='36.76055' lon='37.81974' />
+  <node id='-42041' lat='36.76055' lon='37.81974' />
   <node id='-42043' lat='36.91842' lon='38.21064' />
   <node id='-42045' lat='36.90064' lon='38.38859' />
   <node id='-42047' lat='36.84429' lon='38.55908' />
@@ -5776,10 +5776,10 @@
   <node id='-42063' lat='37.08084' lon='41.515' />
   <node id='-42065' lat='37.17209' lon='42.00894' />
   <node id='-42067' lat='37.28569' lon='42.18225' />
-  <node id='-42069' visible='true' lat='37.31323' lon='42.19301' />
-  <node id='-42071' visible='true' lat='37.32491' lon='42.2112' />
-  <node id='-42073' visible='true' lat='37.31395' lon='42.22257' />
-  <node id='-42075' visible='true' lat='37.30238' lon='42.22381' />
+  <node id='-42069' lat='37.31323' lon='42.19301' />
+  <node id='-42071' lat='37.32491' lon='42.2112' />
+  <node id='-42073' lat='37.31395' lon='42.22257' />
+  <node id='-42075' lat='37.30238' lon='42.22381' />
   <node id='-42077' lat='37.28715' lon='42.20454' />
   <node id='-42079' lat='37.28026' lon='42.21548' />
   <node id='-42081' lat='7.22462' lon='102.46318' />
@@ -5793,7 +5793,7 @@
   <node id='-42097' lat='41.00642' lon='70.56077' />
   <node id='-42099' lat='40.72825' lon='70.80009' />
   <node id='-42101' lat='40.45174' lon='70.32626' />
-  <node id='-42103' visible='true' lat='40.26421' lon='70.56394' />
+  <node id='-42103' lat='40.26421' lon='70.56394' />
   <node id='-42105' lat='40.17396' lon='70.62342' />
   <node id='-42107' lat='40.217' lon='70.8607' />
   <node id='-42109' lat='40.12797' lon='70.7928' />
@@ -5805,7 +5805,7 @@
   <node id='-42121' lat='39.52516' lon='69.3594' />
   <node id='-42123' lat='39.58792' lon='70.64087' />
   <node id='-42125' lat='39.35116' lon='72.85934' />
-  <node id='-42127' visible='true' lat='37.46495' lon='73.29633' />
+  <node id='-42127' lat='37.46495' lon='73.29633' />
   <node id='-42129' lat='37.02014' lon='72.66381' />
   <node id='-42131' lat='36.68084' lon='71.83229' />
   <node id='-42133' lat='37.06007' lon='71.42975' />
@@ -5861,9 +5861,9 @@
   <node id='-42233' lat='25.98197' lon='122.26612' />
   <node id='-42235' lat='-0.99911' lon='30.80408' />
   <node id='-42237' lat='-10.25691' lon='40.74206' />
-  <node id='-42239' visible='true' lat='-4.44681' lon='29.63827' />
+  <node id='-42239' lat='-4.44681' lon='29.63827' />
   <node id='-42241' lat='-2.41404' lon='30.54501' />
-  <node id='-42243' visible='true' lat='-1.91477' lon='30.80802' />
+  <node id='-42243' lat='-1.91477' lon='30.80802' />
   <node id='-42245' lat='3.48867' lon='30.85153' />
   <node id='-42247' lat='3.89296' lon='33.02852' />
   <node id='-42249' lat='4.23316' lon='33.9873' />
@@ -5897,7 +5897,7 @@
   <node id='-42305' lat='65.98512' lon='-168.95635' />
   <node id='-42307' lat='40.01404' lon='71.78838' />
   <node id='-42309' lat='39.95026' lon='71.1427' />
-  <node id='-42311' visible='true' lat='39.88423' lon='71.16101' />
+  <node id='-42311' lat='39.88423' lon='71.16101' />
   <node id='-42313' lat='40.05481' lon='71.01035' />
   <node id='-42315' lat='40.18154' lon='71.00236' />
   <node id='-42317' lat='40.86947' lon='72.59136' />
@@ -5928,7 +5928,7 @@
   <node id='-42367' lat='-28.42622' lon='19.99882' />
   <node id='-42369' lat='-24.81004' lon='20.03678' />
   <node id='-42371' lat='-22.19581' lon='29.37703' />
-  <node id='-42373' visible='true' lat='-28.7293' lon='28.1317' />
+  <node id='-42373' lat='-28.7293' lon='28.1317' />
   <node id='-42375' lat='-9.40138' lon='32.95389' />
   <node id='-42377' lat='-13.80755' lon='32.79015' />
   <node id='-42379' lat='-15.93805' lon='29.01298' />
@@ -5936,7 +5936,7 @@
   <node id='-42383' lat='-17.24365' lon='27.62795' />
   <node id='-42385' lat='-17.34378' lon='27.61377' />
   <node id='-42387' lat='-18.07411' lon='26.68403' />
-  <node id='-42389' visible='true' lat='-17.86232' lon='25.51646' />
+  <node id='-42389' lat='-17.86232' lon='25.51646' />
   <node id='-42391' lat='-17.62877' lon='23.47474' />
   <node id='-42393' lat='-16.18028' lon='22.00323' />
   <node id='-42395' lat='-12.14898' lon='29.8139' />
@@ -15362,7 +15362,7 @@
     <nd ref='-37179' />
     <nd ref='-37165' />
   </way>
-  <way id='-57493' visible='true'>
+  <way id='-57493'>
     <nd ref='-37181' />
     <nd ref='-37183' />
     <nd ref='-37185' />
diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index f8feaba..df54325 100644
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -3475,6 +3475,7 @@
             <key key="aeroway" value="runway" />
             <optional>
                 <text key="ref" text="Reference" />
+                <reference ref="surface" />
             </optional>
         </item> <!-- Runway -->
         <item name="Taxiway" icon="presets/transport/airport/taxiway.svg" type="way,closedway" preset_name_label="true">
@@ -9773,6 +9774,7 @@
                 <combo key="addr:country" text="Country code" values_from="java.util.Locale#getISOCountries" use_last_as_default="force" match="key" />
             </optional>
             <optional text="Optional values for specific countries">
+                <text key="addr:unit" text="Unit/Suite" match="key" />
                 <text key="addr:housename" text="House name" match="key" alternative_autocomplete_keys="name" />
                 <text key="addr:hamlet" text="Hamlet" match="key" />
                 <text key="addr:suburb" text="Suburb" use_last_as_default="force" match="key" />
diff --git a/data/gpx/brown2green.txt b/data/gpx/brown2green.txt
new file mode 100644
index 0000000..0844778
--- /dev/null
+++ b/data/gpx/brown2green.txt
@@ -0,0 +1,15 @@
+# License: GPL. For details,see LICENSE file.
+#
+# diverging brown to green, designed by http://colorbrewer2.org/
+#
+# color map must start at first line without comment 
+#
+0,0,0
+1,102,9
+53,151,143
+128,205,193
+199,234,229
+246,232,195
+223,194,125
+191,129,45
+140,81,10
diff --git a/data/gpx/inferno.txt b/data/gpx/inferno.txt
new file mode 100644
index 0000000..c39c392
--- /dev/null
+++ b/data/gpx/inferno.txt
@@ -0,0 +1,267 @@
+# License: GPL. For details,see LICENSE file.
+#
+# based on color map aka inferno with adjustment to more brighter values
+# Used to reconstruct the colormap in viscm (http://bids.github.io/colormap/)
+# parameters = {'xp': [-2.059155383623448,55.527989656842408,34.409268195655187,4.76708575112832,-9.505963894261754},
+#               'yp': [-25.66489361702122,-20.376712328767127,26.997716894977174,20.56737588652487,32.047872340425585},
+#               'min_Jp': 33.3692722372,
+#                max_Jp': 95}
+#
+# color map must start at first line without comment 
+#
+0.21520753,0.27038249,0.57012105
+0.22312459,0.27103303,0.57166455
+0.23080347,0.27168503,0.57324007
+0.23833063,0.27231877,0.57483869
+0.24568074,0.27294692,0.57646522
+0.25289476,0.2735611,0.57811579
+0.25997831,0.27416334,0.57979067
+0.2669379,0.27475519,0.58148978
+0.27380298,0.27532947,0.58321
+0.28055428,0.27589622,0.58495399
+0.287239,0.2764405,0.58671621
+0.29381911,0.27697939,0.58850116
+0.30035424,0.27749166,0.59030167
+0.3067935,0.27799996,0.59212335
+0.31320428,0.2784783,0.59395808
+0.31952836,0.27895311,0.59581191
+0.32583529,0.27939586,0.59767646
+0.3320659,0.27983431,0.59955752
+0.33828602,0.28023999,0.60144712
+0.34443919,0.2806404,0.60335045
+0.35058925,0.28100652,0.60525968
+0.35668082,0.28136625,0.60717967
+0.36277287,0.28169157,0.60910303
+0.3688165,0.28200806,0.61103375
+0.37486069,0.28229156,0.61296536
+0.38086771,0.28256263,0.61490057
+0.38687304,0.28280326,0.61683417
+0.39285321,0.28302691,0.61876728
+0.39882725,0.28322388,0.6206963
+0.40478897,0.28339829,0.62262037
+0.41073803,0.28355108,0.62453795
+0.41668846,0.28367469,0.62644568
+0.42261777,0.28378305,0.62834468
+0.42856299,0.28385455,0.63022847
+0.43448626,0.28391267,0.63210021
+0.44042184,0.28393692,0.63395343
+0.44634815,0.28394123,0.63578925
+0.45227252,0.28392157,0.63760476
+0.45820558,0.28387152,0.63939628
+0.46412436,0.28380662,0.6411656
+0.47006356,0.28370439,0.64290476
+0.47599406,0.28358471,0.64461676
+0.48192565,0.28344156,0.64629781
+0.48786962,0.28326756,0.64794343
+0.49380435,0.28307827,0.64955593
+0.49975251,0.28285825,0.65112821
+0.50570289,0.28261587,0.65266041
+0.51164619,0.2823585,0.65415271
+0.51760901,0.28206718,0.65559589
+0.52356861,0.28175913,0.65699349
+0.52952249,0.28143693,0.65834417
+0.5354961,0.28108192,0.65963775
+0.54146547,0.28071283,0.66087903
+0.54742976,0.28033111,0.66206616
+0.55340844,0.27992224,0.66318972
+0.55938599,0.27949898,0.66425255
+0.56535835,0.27906539,0.66525388
+0.57133473,0.2786149,0.66618743
+0.57731677,0.27814689,0.66704956
+0.58329279,0.27767173,0.66784277
+0.58926275,0.27719044,0.66856469
+0.59523878,0.27669389,0.66920646
+0.601212,0.27619042,0.66976956
+0.60717734,0.27568537,0.67025404
+0.61313444,0.27518023,0.67065755
+0.6190896,0.27467077,0.67097344
+0.62504118,0.27415958,0.67119949
+0.63098171,0.27365438,0.67133763
+0.63691049,0.27315721,0.67138563
+0.64282668,0.27267021,0.67134132
+0.64873334,0.2721922,0.67119941
+0.65463011,0.27172501,0.67095685
+0.66051031,0.27127617,0.67061602
+0.66637279,0.27084839,0.67017505
+0.67221629,0.27044454,0.66963216
+0.67803951,0.27006762,0.66898569
+0.68384101,0.26972075,0.66823411
+0.68962043,0.2694062,0.66737478
+0.69537788,0.26912584,0.66640432
+0.70110815,0.26888634,0.66532544
+0.70680955,0.26869125,0.66413723
+0.71248034,0.26854423,0.66283897
+0.71811869,0.26844898,0.66143017
+0.72372274,0.26840929,0.6599105
+0.72929057,0.26842895,0.65827991
+0.7348202,0.26851179,0.65653854
+0.74030966,0.26866163,0.65468679
+0.74575692,0.26888225,0.65272532
+0.75115994,0.26917738,0.65065505
+0.75651668,0.26955067,0.64847715
+0.76182512,0.27000568,0.64619309
+0.76708321,0.27054582,0.64380458
+0.77228898,0.27117434,0.64131363
+0.77744045,0.27189431,0.63872252
+0.78253571,0.27270861,0.63603377
+0.7875729,0.27361986,0.63325018
+0.79255022,0.27463045,0.6303748
+0.79746596,0.27574247,0.62741092
+0.80231908,0.27695738,0.62436032
+0.80710794,0.27827681,0.62122676
+0.81183046,0.27970239,0.6180159
+0.8164853,0.28123501,0.61473188
+0.82107123,0.28287522,0.611379
+0.82558714,0.28462328,0.60796168
+0.83003205,0.28647909,0.60448445
+0.8344051,0.28844227,0.60095193
+0.83870608,0.29051198,0.59736649
+0.84293394,0.29268742,0.59373445
+0.84708799,0.29496738,0.59006162
+0.8511679,0.29735032,0.58635274
+0.85517346,0.29983446,0.58261253
+0.85910459,0.30241779,0.57884566
+0.86296154,0.30509821,0.57505503
+0.8667442,0.30787334,0.57124668
+0.87045278,0.31074062,0.56742555
+0.87408763,0.3136974,0.5635959
+0.87764922,0.31674094,0.55976186
+0.88113814,0.31986844,0.55592693
+0.88455499,0.32307701,0.55209513
+0.88790044,0.32636363,0.54827073
+0.89117526,0.32972536,0.54445721
+0.89438031,0.33315921,0.54065783
+0.89751647,0.33666226,0.53687571
+0.90058468,0.34023153,0.53311396
+0.90358593,0.34386414,0.52937539
+0.90652122,0.34755725,0.52566255
+0.90939159,0.35130809,0.5219778
+0.91219812,0.35511391,0.51832354
+0.91494189,0.35897199,0.51470218
+0.91762398,0.36287988,0.51111515
+0.92024546,0.36683514,0.50756411
+0.92280743,0.3708354,0.50405059
+0.92531095,0.37487835,0.5005761
+0.92775723,0.37896156,0.49714278
+0.93014721,0.38308319,0.4937508
+0.93248195,0.38724127,0.49040111
+0.93476246,0.3914339,0.48709457
+0.93698975,0.39565929,0.48383192
+0.93916494,0.39991543,0.48061464
+0.94128894,0.40420083,0.47744286
+0.94336261,0.40851411,0.47431661
+0.94538686,0.4128538,0.47123623
+0.94736256,0.41721856,0.468202
+0.94929056,0.42160708,0.46521414
+0.95117192,0.42601776,0.46227381
+0.95300724,0.4304498,0.45938022
+0.95479724,0.43490219,0.4565332
+0.95654264,0.43937392,0.45373274
+0.95824414,0.44386407,0.45097877
+0.95990241,0.44837175,0.44827118
+0.96151825,0.45289592,0.44561039
+0.96309223,0.45743586,0.44299605
+0.9646248,0.46199106,0.44042751
+0.96611649,0.46656086,0.43790454
+0.96756782,0.47114466,0.43542688
+0.96897927,0.47574187,0.43299428
+0.9703513,0.48035197,0.43060645
+0.97168455,0.48497424,0.42826362
+0.9729793,0.48960837,0.42596514
+0.97423583,0.49425407,0.42371048
+0.97545448,0.49891094,0.42149932
+0.97663559,0.50357865,0.41933134
+0.97777945,0.50825686,0.41720624
+0.97888633,0.51294528,0.41512369
+0.97995654,0.5176436,0.41308347
+0.98099046,0.52235141,0.41108558
+0.98198808,0.5270687,0.40912927
+0.98294961,0.53179527,0.40721424
+0.98387521,0.53653092,0.40534022
+0.98476504,0.54127549,0.40350692
+0.98561924,0.54602881,0.40171405
+0.98643793,0.55079072,0.39996136
+0.98722122,0.55556111,0.3982486
+0.98796936,0.5603397,0.39657571
+0.98868226,0.56512655,0.39494219
+0.98936,0.56992153,0.3933478
+0.99000264,0.57472455,0.39179229
+0.99061026,0.57953551,0.39027544
+0.99118291,0.5843543,0.38879701
+0.99172063,0.58918085,0.38735678
+0.99222348,0.59401505,0.38595451
+0.99269152,0.59885681,0.38458997
+0.99312476,0.60370607,0.38326287
+0.99352325,0.60856274,0.38197295
+0.99388704,0.61342672,0.38071994
+0.9942162,0.61829793,0.37950355
+0.9945108,0.62317625,0.37832349
+0.99477091,0.62806159,0.37717942
+0.99499662,0.63295383,0.376071
+0.99518804,0.63785286,0.37499782
+0.99534511,0.64275869,0.37395927
+0.99546806,0.64767111,0.372955
+0.99555705,0.65258996,0.37198453
+0.99561226,0.65751512,0.37104728
+0.99563387,0.66244643,0.37014263
+0.99562207,0.66738375,0.36926988
+0.99557709,0.6723269,0.36842829
+0.99549919,0.67727574,0.367617
+0.99538832,0.68223028,0.3668348
+0.99524486,0.6871903,0.36608079
+0.99506928,0.69215551,0.36535402
+0.99486193,0.69712571,0.36465327
+0.99462316,0.70210071,0.36397724
+0.99435337,0.70708033,0.36332451
+0.99405297,0.71206436,0.36269354
+0.99372226,0.7170527,0.36208252
+0.99336115,0.72204548,0.36148919
+0.99297075,0.72704212,0.36091215
+0.99255157,0.73204239,0.36034933
+0.99210417,0.7370461,0.35979848
+0.9916291,0.74205305,0.35925722
+0.99112697,0.74706302,0.35872299
+0.99059766,0.75207625,0.35819249
+0.99004191,0.75709248,0.3576629
+0.98946091,0.76211118,0.35713157
+0.98885534,0.76713218,0.35659523
+0.98822592,0.77215526,0.3560504
+0.98757341,0.77718026,0.35549344
+0.98689724,0.78220771,0.35491939
+0.98619894,0.78723702,0.35432474
+0.98547981,0.79226775,0.35370552
+0.98474069,0.79729971,0.35305716
+0.98398247,0.80233272,0.35237485
+0.98320475,0.80736733,0.3516524
+0.98240874,0.81240322,0.35088461
+0.9815964,0.81743967,0.35006665
+0.9807688,0.8224765,0.34919255
+0.97992705,0.82751352,0.34825605
+0.97906945,0.83255201,0.34724796
+0.97819995,0.83759034,0.34616365
+0.97731989,0.84262826,0.34499577
+0.97643067,0.84766553,0.34373656
+0.97553084,0.85270337,0.34237486
+0.9746244,0.85774026,0.34090421
+0.97371347,0.86277567,0.3393158
+0.97279937,0.8678095,0.33759927
+0.97188135,0.87284272,0.33574113
+0.97096472,0.87787333,0.33373367
+0.97005177,0.88290083,0.33156512
+0.96914211,0.88792612,0.3292193
+0.9682402,0.89294775,0.32668465
+0.96735004,0.89796453,0.32394813
+0.96647255,0.90297683,0.32099108
+0.96561166,0.9079836,0.31779718
+0.96477281,0.91298312,0.31435094
+0.96395774,0.91797553,0.31062911
+0.96317157,0.92295935,0.30661145
+0.96242046,0.92793272,0.30227735
+0.96170672,0.93289563,0.29759626
+0.96103783,0.93784572,0.29254395
+0.96041973,0.94278138,0.2870899
+0.95985661,0.94770189,0.28119495
+0.95935719,0.95260448,0.27482525
+0.95892721,0.9574878,0.26793369
+0.95857402,0.9623498,0.2604697
+0.9583055,0.96718821,0.25237504
diff --git a/data/gpx/red2blue.txt b/data/gpx/red2blue.txt
new file mode 100644
index 0000000..0b5c638
--- /dev/null
+++ b/data/gpx/red2blue.txt
@@ -0,0 +1,18 @@
+# License: GPL. For details, see LICENSE file.
+#
+# diverging red to blue, designed by http://colorbrewer2.org/
+#
+# color map must start at first line without comment 
+#
+0,0,0
+49,54,149
+69,117,180
+116,173,209
+171,217,233
+224,243,248
+254,224,144
+253,174,97
+244,109,67
+215,48,39
+165,0,38
+
diff --git a/data/gpx/viridis.txt b/data/gpx/viridis.txt
new file mode 100644
index 0000000..48fe86f
--- /dev/null
+++ b/data/gpx/viridis.txt
@@ -0,0 +1,267 @@
+# License: GPL. For details,see LICENSE file.
+#
+# Used to reconstruct the colormap in viscm (http://bids.github.io/colormap/)
+# {'xp': [-8.9697272381347659,-14.962877923066287,-32.371553722153038,-30.373836827175865,-6.9720103431575922,-8.684339110280888
+# 'yp': [-25.513698630136986,15.296803652968038,-30.650684931506845,20.719178082191775,25.570776255707756,32.990867579908667
+# 'min_Jp': 33.3692722372,
+# 'max_Jp': 95}
+#
+# color map must start at first line without comment 
+#
+0.0331179,0.29975688,0.57579112
+0.04256739,0.3028265,0.57286799
+0.0512467,0.30584793,0.57009011
+0.05914659,0.30882508,0.5674503
+0.06654831,0.3117815,0.5647918
+0.07345228,0.31469781,0.56227052
+0.07995739,0.31757925,0.55986398
+0.08619278,0.32044241,0.55745447
+0.09212195,0.32327213,0.55517502
+0.09780928,0.32607626,0.55297584
+0.10331033,0.32886259,0.55080222
+0.10859491,0.33162106,0.54875221
+0.11372563,0.33436292,0.54673886
+0.11870231,0.33708616,0.54479015
+0.12351267,0.33978626,0.54295921
+0.12822783,0.3424784,0.541114
+0.13279867,0.34515022,0.53938101
+0.13725748,0.34780851,0.53770555
+0.14161799,0.35045603,0.53606914
+0.14585622,0.3530865,0.53454415
+0.15002582,0.35571293,0.5330082
+0.15408488,0.35832466,0.5315781
+0.15806357,0.36092928,0.53018482
+0.16195691,0.36352554,0.52884943
+0.16576237,0.36611275,0.52758751
+0.16949979,0.36869662,0.52634711
+0.1731454,0.37127046,0.52520656
+0.17673382,0.37384485,0.52406183
+0.18023309,0.37641026,0.52302135
+0.18367353,0.37897678,0.5219859
+0.18703181,0.38153698,0.52104134
+0.19032855,0.38409867,0.52011314
+0.19354787,0.38665632,0.5192658
+0.19670438,0.38921652,0.51843878
+0.19978526,0.39177424,0.51769017
+0.20280277,0.39433623,0.51695934
+0.20574448,0.39689659,0.51631112
+0.20862219,0.39946359,0.51567252
+0.21142395,0.40203013,0.51511745
+0.21415805,0.40460435,0.51457709
+0.21681705,0.40718098,0.51410601
+0.21940294,0.40976427,0.5136727
+0.22191346,0.4123542,0.51328427
+0.22434688,0.41494912,0.51295975
+0.22670152,0.4175556,0.51265342
+0.22897578,0.42016834,0.51241261
+0.23116721,0.42279102,0.51221511
+0.23327224,0.42542553,0.5120539
+0.23529113,0.42806929,0.51195199
+0.23721876,0.4307259,0.51189091
+0.23905088,0.43339672,0.51186833
+0.24078829,0.43607984,0.51190068
+0.24242777,0.43877648,0.5119848
+0.24395722,0.44149191,0.51209793
+0.24538089,0.44422266,0.51226326
+0.24669486,0.44696981,0.512479
+0.24789484,0.44973443,0.51274365
+0.24897073,0.45251957,0.51304809
+0.24992008,0.45532509,0.51339708
+0.25074106,0.45815079,0.51379462
+0.25142853,0.46099761,0.51423996
+0.2519772,0.46386643,0.51473252
+0.25238166,0.46675805,0.51527187
+0.25263645,0.46967322,0.51585774
+0.25273608,0.47261257,0.51648993
+0.25267511,0.47557666,0.51716828
+0.25244821,0.47856593,0.51789267
+0.25205017,0.4815807,0.51866293
+0.25147595,0.48462119,0.51947882
+0.25072074,0.48768749,0.52034
+0.24977992,0.49077954,0.52124597
+0.24864914,0.49389721,0.52219605
+0.24732429,0.4970402,0.52318934
+0.2458015,0.50020813,0.5242247
+0.24407712,0.50340048,0.52530069
+0.24213937,0.50661827,0.52641341
+0.23998809,0.50986008,0.52756205
+0.2376243,0.51312431,0.5287454
+0.23504515,0.51641008,0.52996075
+0.23223599,0.51971846,0.53120267
+0.22919943,0.52304738,0.53246911
+0.22593842,0.52639479,0.53375736
+0.22243635,0.52976175,0.53506084
+0.21869708,0.53314592,0.53637622
+0.21472177,0.53654544,0.53769908
+0.21049097,0.53996144,0.53902151
+0.20602332,0.5433894,0.54034076
+0.20129189,0.54683133,0.54164703
+0.19632014,0.5502822,0.54293704
+0.1910817,0.5537437,0.54420016
+0.1856016,0.55721085,0.54543206
+0.17986279,0.56068409,0.5466222
+0.17388472,0.56415953,0.54776421
+0.16767592,0.56763485,0.54884959
+0.16124118,0.57110836,0.54986858
+0.15461572,0.57457555,0.55081476
+0.14782653,0.57803342,0.55167986
+0.14090518,0.58147916,0.55245531
+0.13391472,0.5849079,0.5531362
+0.12692017,0.58831582,0.55371706
+0.12000191,0.59169907,0.55419371
+0.11326013,0.59505365,0.55456398
+0.10681409,0.59837568,0.55482785
+0.10079543,0.60166197,0.55498638
+0.09534887,0.60490977,0.55504241
+0.09063347,0.60811639,0.55500215
+0.08679049,0.61128079,0.55487004
+0.08394854,0.6144023,0.55465197
+0.08221537,0.61748019,0.55435753
+0.08164325,0.6205151,0.55399342
+0.08223013,0.62350855,0.55356369
+0.08394439,0.62646065,0.55308231
+0.08668611,0.6293742,0.55254872
+0.09034668,0.63225032,0.55197376
+0.09479378,0.63509139,0.55135952
+0.09989897,0.63789906,0.55071423
+0.10553908,0.64067585,0.55003665
+0.11160448,0.64342303,0.54933941
+0.11800283,0.64614329,0.54861541
+0.12465323,0.64883798,0.54787462
+0.13149053,0.65150897,0.54711829
+0.13846531,0.65415809,0.5463437
+0.1455335,0.65678673,0.54555555
+0.15265709,0.65939627,0.54476003
+0.15981518,0.66198821,0.54395146
+0.16698676,0.66456378,0.54313117
+0.17415531,0.66712409,0.54230031
+0.18130458,0.66967023,0.54146307
+0.18842545,0.67220323,0.54061925
+0.19551341,0.67472397,0.53976647
+0.2025629,0.67723331,0.53890516
+0.20956984,0.67973202,0.53803564
+0.2165314,0.68222082,0.53715809
+0.22344573,0.68470038,0.53627262
+0.23031175,0.6871713,0.53537923
+0.23712903,0.68963415,0.53447784
+0.24389765,0.69208946,0.53356833
+0.25061808,0.6945377,0.53265048
+0.25729111,0.69697932,0.53172407
+0.26391778,0.6994147,0.53078879
+0.27049933,0.70184423,0.52984433
+0.27703712,0.70426823,0.52889033
+0.28353264,0.70668701,0.52792642
+0.28998746,0.70910086,0.52695218
+0.29640321,0.71151001,0.52596722
+0.30278152,0.71391471,0.5249711
+0.30912407,0.71631516,0.52396339
+0.31543254,0.71871153,0.52294366
+0.3217086,0.72110401,0.52191145
+0.3279539,0.72349274,0.52086633
+0.33417008,0.72587784,0.51980786
+0.34035875,0.72825944,0.5187356
+0.34652147,0.73063763,0.51764911
+0.35265864,0.73301261,0.51654918
+0.35877137,0.73538448,0.51543583
+0.3648628,0.73775319,0.51430692
+0.37093438,0.74011877,0.51316203
+0.37698751,0.74248126,0.51200075
+0.38302357,0.7448407,0.51082267
+0.38904388,0.7471971,0.5096274
+0.39504973,0.74955049,0.50841457
+0.40104082,0.75190103,0.5071855
+0.40701899,0.75424866,0.50593917
+0.41298655,0.75659325,0.50467398
+0.41894464,0.75893479,0.50338958
+0.42489434,0.76127325,0.50208564
+0.43083671,0.76360862,0.50076184
+0.43677259,0.76594088,0.4994181
+0.44270136,0.7682702,0.49805594
+0.44862605,0.77059628,0.49667271
+0.45454756,0.77291909,0.49526814
+0.46046679,0.77523857,0.49384196
+0.46638456,0.77755469,0.4923939
+0.47230148,0.7798674,0.49092398
+0.47821759,0.78217677,0.48943283
+0.48413494,0.78448256,0.48791871
+0.49005423,0.78678471,0.48638138
+0.49597616,0.78908317,0.48482063
+0.50190137,0.79137786,0.48323626
+0.5078303,0.79366877,0.48162833
+0.5137638,0.79595578,0.47999631
+0.51970278,0.79823879,0.47833963
+0.52564777,0.80051774,0.47665809
+0.53159931,0.80279254,0.47495153
+0.53755788,0.80506315,0.47321975
+0.54352447,0.80732942,0.47146196
+0.54949945,0.80959129,0.46967805
+0.55548322,0.81184871,0.4678679
+0.56147617,0.8141016,0.46603131
+0.5674787,0.81634992,0.46416812
+0.57349149,0.81859354,0.46227771
+0.57951582,0.82083223,0.46035867
+0.58555114,0.82306609,0.45841193
+0.59159777,0.82529507,0.45643726
+0.59765599,0.82751909,0.45443444
+0.60372607,0.82973812,0.45240324
+0.60980907,0.83195194,0.45034236
+0.61590608,0.83416034,0.44825035
+0.62201604,0.83636352,0.44612867
+0.62813915,0.83856142,0.443977
+0.6342756,0.84075401,0.44179501
+0.64042559,0.84294124,0.43958235
+0.64658927,0.84512308,0.43733862
+0.65276961,0.84729891,0.43505957
+0.65896438,0.84946917,0.43274795
+0.66517356,0.85163387,0.43040351
+0.67139725,0.85379299,0.4280257
+0.67763555,0.85594651,0.42561396
+0.68388856,0.8580944,0.42316766
+0.69015635,0.86023667,0.42068611
+0.69643989,0.86237309,0.41816731
+0.70274062,0.86450334,0.41560843
+0.70905639,0.86662792,0.41301167
+0.71538721,0.86874683,0.41037609
+0.72173308,0.87086011,0.40770069
+0.72809396,0.87296778,0.40498434
+0.7344698,0.87506988,0.40222583
+0.74086053,0.87716647,0.39942384
+0.74726606,0.8792576,0.39657691
+0.75368625,0.88134336,0.39368347
+0.76012096,0.88342383,0.39074178
+0.76656999,0.88549913,0.38774996
+0.77303308,0.8875694,0.38470595
+0.77950995,0.88963477,0.38160749
+0.78600023,0.89169545,0.37845211
+0.79250349,0.89375165,0.37523713
+0.79901921,0.89580363,0.37195957
+0.80554676,0.8978517,0.36861621
+0.8120854,0.89989622,0.3652035
+0.81863422,0.90193761,0.36171754
+0.82519216,0.90397637,0.35815405
+0.83175795,0.9060131,0.35450833
+0.83833008,0.90804849,0.3507752
+0.84490673,0.91008337,0.34694895
+0.85148576,0.91211872,0.34302325
+0.85806684,0.91415505,0.33898699
+0.86465276,0.91619201,0.3348209
+0.87123317,0.91823316,0.33052851
+0.87780375,0.9202804,0.32609988
+0.88435971,0.92233593,0.32152327
+0.89091043,0.92439784,0.31675269
+0.89743393,0.9264737,0.31180336
+0.9039243,0.92856651,0.3066523
+0.91038551,0.93067656,0.30124469
+0.91678774,0.93281453,0.29559791
+0.92313653,0.9349809,0.28963085
+0.92939556,0.93718902,0.28335908
+0.93555967,0.93944353,0.2766966
+0.94159054,0.94175935,0.26963707
+0.94745672,0.94414992,0.26213946
+0.95312442,0.94662987,0.25415069
+0.9585465,0.94921781,0.24566287
+0.96367764,0.95193147,0.23667632
+0.96847776,0.95478608,0.22720755
+0.97291733,0.95779215,0.21729217
+0.97698301,0.96095356,0.20697158
+
diff --git a/data/validator/combinations.mapcss b/data/validator/combinations.mapcss
index 6ac7d9a..ea1d54d 100644
--- a/data/validator/combinations.mapcss
+++ b/data/validator/combinations.mapcss
@@ -135,6 +135,7 @@ relation[route=ski][!piste:type][type=route],
 }
 
 /* {0.tag} without {1.key} (info level) */
+way[highway=track              ][!tracktype],
 way[power=cable                ][!location],
 node[power=transformer         ][!voltage],
 way[power=line                 ][!voltage],
@@ -159,12 +160,6 @@ way[power=cable                ][!voltage],
   assertNoMatch: "way power=generator generator:output:electricity=yes voltage=1";
 }
 
-/* {0.key} without {1.key} or {2.key} */
-way[oneway][!highway][!railway] {
-  throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
-  group: tr("missing tag");
-}
-
 /* {0.key} without {1.key} or {2.tag} */
 *[smoothness                   ][!highway][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking)$/],
 *[segregated                   ][!highway][railway!=crossing] {
@@ -193,6 +188,7 @@ way[highway=motorway_link][!oneway][junction!=roundabout] {
 }
 
 /* {0.key} without {1.key}, {2.key} or {3.key} */
+way[oneway][!highway][!railway][!aerialway],
 *[snowplowing                  ][!highway][!amenity][!leisure] {
   throwWarning: tr("{0} without {1}, {2} or {3}", "{0.key}", "{1.key}", "{2.key}", "{3.key}");
   group: tr("missing tag");
@@ -305,7 +301,7 @@ way[highway=footway][cycleway=lane] {
 *[tunnel  ][!highway][!railway][!waterway][public_transport != platform][man_made != pipeline],
 *[bridge  ][!highway][!railway][!waterway][!piste:type][public_transport != platform][man_made !~ /^(bridge|pipeline)$/][building != bridge],
 *[psv     ][!highway][!railway][!waterway][amenity !~ /^parking.*/],
-*[width   ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance],
+*[width   ][!highway][!railway][!waterway][!aeroway][!cycleway][!footway][!barrier][!man_made][!entrance][natural!=stone],
 *[maxspeed][!highway][!railway][traffic_sign !~ /^((.*;)?maxspeed(;.*)?|[A-Z][A-Z]:.+)$/][type != enforcement][waterway !~ /^(river|canal|lock)$/][!traffic_calming] {
   throwWarning: tr("{0} on suspicious object", "{0.key}");
   group: tr("suspicious tag combination");
@@ -321,7 +317,7 @@ node[amenity][amenity =~ /^(restaurant|cafe|fast_food)$/][!name][noname!=yes] {
 
 way[highway][barrier],
 *[highway][waterway][waterway!=dam][waterway!=weir],
-way[highway][natural],
+way[highway][natural][natural!=ridge],
 *[landuse][building] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
   group: tr("suspicious tag combination");
@@ -336,7 +332,7 @@ way[highway][natural],
 }
 
 /* #9593, #11183, #12418, #12761 */
-*[sport][sport!=skiing][!building][!club][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground|ice_rink|horse_riding)$/][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports] {
+*[sport][sport!=skiing][!building][!club][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground|ice_rink|horse_riding|fitness_station)$/][natural !~ /^(beach|bare_rock|cliff|peak|water)$/][amenity !~ /^(pub|restaurant|swimming_pool)$/][landuse !~ /^(recreation_ground|piste|farm|farmland)$/][barrier !~ /^(wall|retaining_wall)$/][!"piste:type"][shop!=sports] {
     throwWarning: tr("sport without physical feature");
     group: tr("missing tag");
     assertMatch: "node sport=tennis";
diff --git a/data/validator/deprecated.mapcss b/data/validator/deprecated.mapcss
index 49532b5..3d5a176 100644
--- a/data/validator/deprecated.mapcss
+++ b/data/validator/deprecated.mapcss
@@ -1118,6 +1118,12 @@ way[tracktype][tracktype!~/^(1|2|3|4|5|grade1|grade2|grade3|grade4|grade5)$/] {
   suggestAlternative: "tracktype=grade5";
 }
 
+area[area][area!=yes][area!=no] {
+  throwError: tr("wrong value: {0}", "{0.tag}");
+  suggestAlternative: "area=yes";
+  suggestAlternative: "area=no";
+}
+
 /* #13953 */
 *[amenity=hunting_stand][lock=yes],
 *[amenity=hunting_stand][lock=no] {
diff --git a/data/validator/geometry.mapcss b/data/validator/geometry.mapcss
index 10b3250..0d554a8 100644
--- a/data/validator/geometry.mapcss
+++ b/data/validator/geometry.mapcss
@@ -1,4 +1,5 @@
 /* {0} on a node, should be a way */
+node[area=no],
 node[oneway],
 node[bridge],
 node[sidewalk],
@@ -47,6 +48,7 @@ node[natural=tree_row] {
 }
 
 /* {0} on a node, should be an area; see ticket #10679 */
+node[area=yes],
 node[landuse],
 node[natural=scree],
 node[natural=scrub],
@@ -72,10 +74,11 @@ node[source:outline] {
   throwWarning: tr("{0} on a node. Should be drawn as an area.", "{0.tag}");
 }
 
-/* {0} on a node, should be a relation; Error level; see #10252, #10769 */
+/* {0} on a node, should be a relation; Error level; see #10252, #10769, #14288 */
+node[type=multipolygon],
 node[route],
 node[restriction] {
-  throwError: tr("{0}=* on a node. Should be used in a relation", "{0.key}"); 
+  throwError: tr("{0} on a node. Should be used in a relation", "{0.tag}"); 
 }
 
 /* {0} on a way, should be a node */
@@ -94,9 +97,10 @@ way[natural=tree] {
   throwWarning: tr("{0} on a way. Should be used on a node.", "{0.tag}"); 
 }
 
-/* {0} on a way, should be a relation; see #10252 */
+/* {0} on a way, should be a relation; see #10252, #14288 */
+way[type=multipolygon],
 way[route=bus] {
-  throwWarning: tr("{0} on a way. Should be used in a relation", "{0.tag}"); 
+  throwError: tr("{0} on a way. Should be used in a relation", "{0.tag}"); 
 }
 
 /* #12502 */
diff --git a/data/validator/highway.mapcss b/data/validator/highway.mapcss
index 235689b..557433b 100644
--- a/data/validator/highway.mapcss
+++ b/data/validator/highway.mapcss
@@ -84,13 +84,6 @@ way[highway=cycleway][cycleway=lane] {
   assertNoMatch: "way highway=footway";
 }
 
-*[name =~ /(?i).*Strasse.*/] {
-  throwOther: tr("street name contains ss");
-  assertMatch: "way name=Foobarstrasse";
-  assertMatch: "way name=Foobar-Strassenweg";
-  assertNoMatch: "way name=Foobarstraße";
-}
-
 /* footway, see #10851, #10976 */
 way[footway=left][/footway:/],
 way[footway=right][/footway:/],
diff --git a/data/validator/ignoretags.cfg b/data/validator/ignoretags.cfg
index 7751a5e..9015bed 100644
--- a/data/validator/ignoretags.cfg
+++ b/data/validator/ignoretags.cfg
@@ -63,6 +63,7 @@ E:place_name
 E:cycleway
 E:abutters
 E:survey_date
+E:survey:date
 E:right:state
 E:left:state
 E:height
@@ -157,11 +158,19 @@ K:building=static_caravan
 K:leisure=recreation_ground
 K:old_railway_operator=PRR
 K:maintenance=gritting
+K:glacier:edge=calving_line
+K:glacier:edge=grounding_line
+K:glacier:type=shelf
+K:glacier:type=rock
+K:glacier:type=mountain
+K:glacier:type=ice_tongue
+K:glacier:type=icecap
 ;
 ; Highway Key/Value Pairs
 ;
 K:highway=proposed
 E:proposed
+E:tracktype
 K:living_street=yes
 K:priority_road=designated
 K:priority_road=yes_unposted
diff --git a/data/validator/territories.mapcss b/data/validator/territories.mapcss
index 903d881..d5510cb 100644
--- a/data/validator/territories.mapcss
+++ b/data/validator/territories.mapcss
@@ -5,3 +5,13 @@
   group: tr("deprecated tagging");
   fixAdd: "operator=Enedis";
 }
+
+/* #13932 */
+*[addr:street =~ /(?i).*Strasse.*/][inside("DE,AT")],
+*[name =~ /(?i).*Strasse.*/][inside("DE,AT")] {
+  throwError: tr("street name contains ss");
+}
+*[addr:street =~ /(?i).*Straße.*/][inside("LI,CH")],
+*[name =~ /(?i).*Straße.*/][inside("LI,CH")] {
+  throwError: tr("street name contains ß");
+}
\ No newline at end of file
diff --git a/data/validator/unnecessary.mapcss b/data/validator/unnecessary.mapcss
index f8881fe..b9df507 100644
--- a/data/validator/unnecessary.mapcss
+++ b/data/validator/unnecessary.mapcss
@@ -24,6 +24,14 @@ area:closed[shop    ][area?] {
   fixRemove: "{2.key}";
 }
 
+/* #14256 */
+area:closed[aeroway=aerodrome][area?],
+area:closed[aeroway=helipad][area?] {
+  throwWarning: tr("{0} is unnecessary for {1}", "{2.key}", "{1.tag}");
+  group: tr("unnecessary tag");
+  fixRemove: "{2.key}";
+}
+
 *[emergency=permissive] {
   /* see #9458 - emergency=permissive makes no sense */
   throwWarning: tr("{0} makes no sense", "{0.tag");
diff --git a/data_nodist/trans/ast.lang b/data_nodist/trans/ast.lang
index 6596cb8..a0a03b0 100644
Binary files a/data_nodist/trans/ast.lang and b/data_nodist/trans/ast.lang differ
diff --git a/data_nodist/trans/be.lang b/data_nodist/trans/be.lang
index 23338bb..c142238 100644
Binary files a/data_nodist/trans/be.lang and b/data_nodist/trans/be.lang differ
diff --git a/data_nodist/trans/bg.lang b/data_nodist/trans/bg.lang
index 94636e5..1778ec9 100644
Binary files a/data_nodist/trans/bg.lang and b/data_nodist/trans/bg.lang differ
diff --git a/data_nodist/trans/ca-valencia.lang b/data_nodist/trans/ca-valencia.lang
index 65f5d4d..25e2883 100644
Binary files a/data_nodist/trans/ca-valencia.lang and b/data_nodist/trans/ca-valencia.lang differ
diff --git a/data_nodist/trans/ca.lang b/data_nodist/trans/ca.lang
index 397c44b..780dad0 100644
Binary files a/data_nodist/trans/ca.lang and b/data_nodist/trans/ca.lang differ
diff --git a/data_nodist/trans/cs.lang b/data_nodist/trans/cs.lang
index c9d5b2e..cd19587 100644
Binary files a/data_nodist/trans/cs.lang and b/data_nodist/trans/cs.lang differ
diff --git a/data_nodist/trans/da.lang b/data_nodist/trans/da.lang
index d858a34..dc2b0f2 100644
Binary files a/data_nodist/trans/da.lang and b/data_nodist/trans/da.lang differ
diff --git a/data_nodist/trans/de.lang b/data_nodist/trans/de.lang
index 7058c5b..e10ead2 100644
Binary files a/data_nodist/trans/de.lang and b/data_nodist/trans/de.lang differ
diff --git a/data_nodist/trans/el.lang b/data_nodist/trans/el.lang
index 27fb88b..6541e1b 100644
Binary files a/data_nodist/trans/el.lang and b/data_nodist/trans/el.lang differ
diff --git a/data_nodist/trans/en.lang b/data_nodist/trans/en.lang
index ea69437..c0f4c84 100644
Binary files a/data_nodist/trans/en.lang and b/data_nodist/trans/en.lang differ
diff --git a/data_nodist/trans/en_AU.lang b/data_nodist/trans/en_AU.lang
index bb1020f..086961d 100644
Binary files a/data_nodist/trans/en_AU.lang and b/data_nodist/trans/en_AU.lang differ
diff --git a/data_nodist/trans/en_GB.lang b/data_nodist/trans/en_GB.lang
index d7eda8a..c4437a8 100644
Binary files a/data_nodist/trans/en_GB.lang and b/data_nodist/trans/en_GB.lang differ
diff --git a/data_nodist/trans/es.lang b/data_nodist/trans/es.lang
index 22430b4..1015d65 100644
Binary files a/data_nodist/trans/es.lang and b/data_nodist/trans/es.lang differ
diff --git a/data_nodist/trans/et.lang b/data_nodist/trans/et.lang
index 2411b26..b7ed4a5 100644
Binary files a/data_nodist/trans/et.lang and b/data_nodist/trans/et.lang differ
diff --git a/data_nodist/trans/fi.lang b/data_nodist/trans/fi.lang
index e647735..b031cf7 100644
Binary files a/data_nodist/trans/fi.lang and b/data_nodist/trans/fi.lang differ
diff --git a/data_nodist/trans/fr.lang b/data_nodist/trans/fr.lang
index f604964..305181a 100644
Binary files a/data_nodist/trans/fr.lang and b/data_nodist/trans/fr.lang differ
diff --git a/data_nodist/trans/gl.lang b/data_nodist/trans/gl.lang
index cfbb07c..39bd13d 100644
Binary files a/data_nodist/trans/gl.lang and b/data_nodist/trans/gl.lang differ
diff --git a/data_nodist/trans/hu.lang b/data_nodist/trans/hu.lang
index 18f59f8..b061d9b 100644
Binary files a/data_nodist/trans/hu.lang and b/data_nodist/trans/hu.lang differ
diff --git a/data_nodist/trans/id.lang b/data_nodist/trans/id.lang
index bec5a2e..46de824 100644
Binary files a/data_nodist/trans/id.lang and b/data_nodist/trans/id.lang differ
diff --git a/data_nodist/trans/it.lang b/data_nodist/trans/it.lang
index cb1e960..e08aac0 100644
Binary files a/data_nodist/trans/it.lang and b/data_nodist/trans/it.lang differ
diff --git a/data_nodist/trans/ja.lang b/data_nodist/trans/ja.lang
index 04071af..309315c 100644
Binary files a/data_nodist/trans/ja.lang and b/data_nodist/trans/ja.lang differ
diff --git a/data_nodist/trans/km.lang b/data_nodist/trans/km.lang
index b2f8c5a..7591f17 100644
Binary files a/data_nodist/trans/km.lang and b/data_nodist/trans/km.lang differ
diff --git a/data_nodist/trans/lt.lang b/data_nodist/trans/lt.lang
index 4fc97cf..0f208b0 100644
Binary files a/data_nodist/trans/lt.lang and b/data_nodist/trans/lt.lang differ
diff --git a/data_nodist/trans/nb.lang b/data_nodist/trans/nb.lang
index ac600be..63ce8e9 100644
Binary files a/data_nodist/trans/nb.lang and b/data_nodist/trans/nb.lang differ
diff --git a/data_nodist/trans/nl.lang b/data_nodist/trans/nl.lang
index bf9f0cb..d12f18c 100644
Binary files a/data_nodist/trans/nl.lang and b/data_nodist/trans/nl.lang differ
diff --git a/data_nodist/trans/pl.lang b/data_nodist/trans/pl.lang
index f8737fe..9fbe45e 100644
Binary files a/data_nodist/trans/pl.lang and b/data_nodist/trans/pl.lang differ
diff --git a/data_nodist/trans/pt.lang b/data_nodist/trans/pt.lang
index d2fa888..b436d88 100644
Binary files a/data_nodist/trans/pt.lang and b/data_nodist/trans/pt.lang differ
diff --git a/data_nodist/trans/pt_BR.lang b/data_nodist/trans/pt_BR.lang
index 8ec1935..34f8b58 100644
Binary files a/data_nodist/trans/pt_BR.lang and b/data_nodist/trans/pt_BR.lang differ
diff --git a/data_nodist/trans/ru.lang b/data_nodist/trans/ru.lang
index d642c5d..138ec16 100644
Binary files a/data_nodist/trans/ru.lang and b/data_nodist/trans/ru.lang differ
diff --git a/data_nodist/trans/sk.lang b/data_nodist/trans/sk.lang
index e3f9277..bbb6501 100644
Binary files a/data_nodist/trans/sk.lang and b/data_nodist/trans/sk.lang differ
diff --git a/data_nodist/trans/sv.lang b/data_nodist/trans/sv.lang
index d8da772..90c20ef 100644
Binary files a/data_nodist/trans/sv.lang and b/data_nodist/trans/sv.lang differ
diff --git a/data_nodist/trans/uk.lang b/data_nodist/trans/uk.lang
index f076e3c..c06236d 100644
Binary files a/data_nodist/trans/uk.lang and b/data_nodist/trans/uk.lang differ
diff --git a/data_nodist/trans/vi.lang b/data_nodist/trans/vi.lang
index 0701da6..61dab5f 100644
Binary files a/data_nodist/trans/vi.lang and b/data_nodist/trans/vi.lang differ
diff --git a/data_nodist/trans/zh_CN.lang b/data_nodist/trans/zh_CN.lang
index 62a8083..a50f594 100644
Binary files a/data_nodist/trans/zh_CN.lang and b/data_nodist/trans/zh_CN.lang differ
diff --git a/data_nodist/trans/zh_TW.lang b/data_nodist/trans/zh_TW.lang
index 5f85fe4..d344196 100644
Binary files a/data_nodist/trans/zh_TW.lang and b/data_nodist/trans/zh_TW.lang differ
diff --git a/docker-test.bat b/docker-test.bat
new file mode 100644
index 0000000..1041e1a
--- /dev/null
+++ b/docker-test.bat
@@ -0,0 +1,6 @@
+docker build . -t josm/josm
+mkdir %CD%\test\report
+docker run -it --name josm -v %CD%\test\report:/josm/test/report josm/josm
+docker rm josm
+docker rmi josm/josm
+pause
diff --git a/docker-test.sh b/docker-test.sh
new file mode 100644
index 0000000..2a2c02c
--- /dev/null
+++ b/docker-test.sh
@@ -0,0 +1,5 @@
+docker build . -t josm/josm
+mkdir -p test/report
+docker run -it --name josm -v `pwd`/test/report:/josm/test/report josm/josm
+docker rm josm
+docker rmi josm/josm
diff --git a/i18n/po/af.po b/i18n/po/af.po
index 16aa784..c61c937 100644
--- a/i18n/po/af.po
+++ b/i18n/po/af.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-10-13 02:39+0000\n"
 "Last-Translator: Grant Slater <Unknown>\n"
 "Language-Team: Afrikaans <af at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:33+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:34+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: af\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/am.po b/i18n/po/am.po
index 21cea66..646b66c 100644
--- a/i18n/po/am.po
+++ b/i18n/po/am.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2010-03-30 12:09+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Amharic <am at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:35+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:35+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: am\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ar.po b/i18n/po/ar.po
index 19ecefe..60374df 100644
--- a/i18n/po/ar.po
+++ b/i18n/po/ar.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-10-08 23:09+0000\n"
 "Last-Translator: mourad101ee <mourad101ee at gmail.com>\n"
 "Language-Team: Arabic <ar at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
 "3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:35+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:35+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ar\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2038,6 +2038,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "إنهي الرسم."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2062,12 +2068,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2502,6 +2502,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2570,6 +2573,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4167,29 +4173,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10837,7 +10845,7 @@ msgstr "ضوبان الموقع (أحمر=عالي،أخضر=منخفض، عند
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10852,15 +10860,23 @@ msgstr "الدراجة"
 msgid "Foot"
 msgstr "المشي"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "حرج"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14960,6 +14976,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15722,6 +15744,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23435,6 +23460,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "حرج"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23785,6 +23813,9 @@ msgstr "الرمز البريدي"
 msgid "Country code"
 msgstr "رمز البلد"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "تسمية المنزل"
 
@@ -24585,7 +24616,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24681,9 +24712,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24771,6 +24799,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ast.po b/i18n/po/ast.po
index bc06a24..5a806b9 100644
--- a/i18n/po/ast.po
+++ b/i18n/po/ast.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-08-09 15:33+0000\n"
 "Last-Translator: Don-vip <Unknown>\n"
 "Language-Team: Asturian <ast at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:37+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:37+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ast\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2177,6 +2177,12 @@ msgstr "Autoensambláu d`ángulos activu."
 msgid "Finish drawing."
 msgstr "Acabar de dibuxar."
 
+msgid "Angle snapping"
+msgstr "Autoensambláu d''ángulos"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Conmutar el mou d''axuste d''ángulu mientres se dibuxa"
+
 msgid "Toggle snapping by {0}"
 msgstr "Activar/Desactivar instantanea de {0}"
 
@@ -2201,12 +2207,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Autoensambláu d''ángulos"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Conmutar el mou d''axuste d''ángulu mientres se dibuxa"
-
 msgid "Dual alignment"
 msgstr "Alliniadura dual"
 
@@ -2691,6 +2691,9 @@ msgstr "usar paréntesis p''arrexuntar espresiones"
 msgid "objects"
 msgstr "oxetos"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "toles víes"
 
@@ -2763,6 +2766,9 @@ msgstr "tolos oxetos escoyíos"
 msgid "all incomplete objects"
 msgstr "tolos oxetos incompletos"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "Oxetos rellacionaos"
 
@@ -4502,32 +4508,32 @@ msgstr "Tipu de relación desconocía"
 msgid "Relation is empty"
 msgstr "La relación tá vacida"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "El rol del miembru nun casa cola espresión {0} de la plantía {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"El tipu de rol de miembru {0} nun casa cola llista aceptada de {1} de la "
-"plantía {2}"
 
 msgid "<empty>"
 msgstr "<vacíu>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rol {0} desconocíu nes plantíes {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Alcontróse un tipu de rol baleru, esperábase unu de {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Falta el rol {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} ye una cantidá de roles bien baxa ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} ye una cantidá de roles bien alta ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Víes que s''interseccionen elles mesmes"
@@ -11860,7 +11866,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Fecha de traza"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11875,15 +11881,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "Pie"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Monte natural"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16479,6 +16493,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Xeobase d''Hidrografía"
 
@@ -17244,6 +17264,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -25112,6 +25135,9 @@ msgstr "Filera d''árboles"
 msgid "A line of trees."
 msgstr "Una filera d''árboles"
 
+msgid "Wood"
+msgstr "Monte natural"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Área forestada onde la producción de lleña nun apodera l''usu."
 
@@ -25477,6 +25503,9 @@ msgstr "Códigu postal"
 msgid "Country code"
 msgstr "Códigu del país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nome del edificiu"
 
@@ -26281,7 +26310,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -26377,9 +26406,6 @@ msgstr "tipu de carretera d''usu temporal"
 msgid "{0} used with {1}"
 msgstr "{0} utilizar con {1}"
 
-msgid "street name contains ss"
-msgstr "nome de cai contien ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26470,6 +26496,12 @@ msgstr "denominación de musulmán desconocía"
 msgid "unknown jewish denomination"
 msgstr "denominación de xudíu desconocía"
 
+msgid "street name contains ss"
+msgstr "nome de cai contien ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} nun ye necesariu"
 
diff --git a/i18n/po/az.po b/i18n/po/az.po
index cc5db4f..16a47b3 100644
--- a/i18n/po/az.po
+++ b/i18n/po/az.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-12-17 13:38+0000\n"
 "Last-Translator: iAZISS <iss-sash at mail.ru>\n"
 "Language-Team: Azerbaijani <az at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:37+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:37+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/be.po b/i18n/po/be.po
index df93cc9..c72d35f 100644
--- a/i18n/po/be.po
+++ b/i18n/po/be.po
@@ -10,8 +10,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-11-30 18:58+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-21 07:49+0000\n"
 "Last-Translator: Viktar Palsciuk <Unknown>\n"
 "Language-Team: Belarusian <i18n at mova.org>\n"
 "MIME-Version: 1.0\n"
@@ -19,8 +19,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:39+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:39+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: be\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2203,6 +2203,12 @@ msgstr "Уключана прывязка да кутоў."
 msgid "Finish drawing."
 msgstr "Скончана вычэрчванне."
 
+msgid "Angle snapping"
+msgstr "Прывязка да кутоў"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Пераключэнне рэжыму прывязкі да кутоў падчас чарчэння"
+
 msgid "Toggle snapping by {0}"
 msgstr "Пераключэнне прывязкі {0}"
 
@@ -2227,12 +2233,6 @@ msgstr "0,30,45,60,90,…"
 msgid "FIX"
 msgstr "Фікс."
 
-msgid "Angle snapping"
-msgstr "Прывязка да кутоў"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Пераключэнне рэжыму прывязкі да кутоў падчас чарчэння"
-
 msgid "Dual alignment"
 msgstr "Падвойнае выраўноўванне"
 
@@ -2724,6 +2724,9 @@ msgstr "выкарыстоўвайце круглыя дужкі для груп
 msgid "objects"
 msgstr "аб’екты"
 
+msgid "all nodes"
+msgstr "усе пункты"
+
 msgid "all ways"
 msgstr "усе лініі"
 
@@ -2795,6 +2798,9 @@ msgstr "усе абраныя аб’екты"
 msgid "all incomplete objects"
 msgstr "усе няпоўныя аб’екты"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr "усе выдаленыя аб''екты (павінен стаяць сцяжок <b>{0}</b>)"
+
 msgid "related objects"
 msgstr "злучаныя аб’екты"
 
@@ -4535,32 +4541,34 @@ msgstr "Тып дачынення невядомы"
 msgid "Relation is empty"
 msgstr "Дачыненне парожняе"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Удзельнік ролі не адпавядае выразу {0} ў шаблоне {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr "Роля ўдзельніка дачынення не адпавядае выразу ''{0}'' у шаблоне {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Тып ўдзельніка ролі {0} не адпавядае спісу дапушчальных тыпаў {1} ў шаблоне "
-"{2}"
+"Тып ''{0}'' удзельніка дачынення з роллю ''{1}'' не адпавядае тыпам ''{2}'', "
+"прынятым у шаблоне {3}"
 
 msgid "<empty>"
 msgstr "<пуста>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Роля {0} невядомая ў шаблонах {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Роля ''{0}'' невядомая ў шаблонах ''{1}''"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Пусты тып ролі, хоць чакаўся адзін з {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Выяўлены пусты тып ролі. Чакаўся адзін з ''{0}''"
 
-msgid "Role {0} missing"
-msgstr "Адсутнічае роля {0}"
+msgid "Role ''{0}'' missing"
+msgstr "Роля ''{0}'' адсутнічае"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Колькасць роляў {0} занадта маленькая ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Колькасць роляў ''{0}'' занадта малая ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Колькасць роляў {0} занадта вялікая ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Колькасць роляў ''{0}'' занадта вялікая ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Лініі, якія перасякаюць самі сябе"
@@ -8964,7 +8972,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Рэдактар"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -11937,8 +11945,8 @@ msgstr ""
 msgid "Track date"
 msgstr "Дата трэка"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Цеплавая карта (цёмны = мала, светлы = шмат)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Адным колерам (можа быць вызначана для найменных пластоў)"
@@ -11952,17 +11960,25 @@ msgstr "Вела"
 msgid "Foot"
 msgstr "Пешшу"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Карыстальнік"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Пекла"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Зелень"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Лес"
+msgstr "Дрэва"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Тэмпература"
 
 msgid "Create markers when reading GPX"
 msgstr "Стварыць маркеры пры чытанні GPX"
@@ -11977,7 +11993,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Згладжваць GPX трэкі"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Маляваць з празрыстасцю (альфа-накладанне) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -12050,6 +12066,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Ужыць дынамічнае альфа-накладанне і падладку шырыні ў залежнасці ад узроўню "
+"маштабавання для ўсіх GPX-трэкаў."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -12077,12 +12095,14 @@ msgstr "Размаляваць пункты і сегменты трэка па
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Адлюстроўваць шчыльнасць пунктаў і сегментаў трэкаў у кожнай пазіцыі ў "
+"выглядзе цеплавой карты."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr "Дазваляе наладжваць афарбоўку трэка для розных сярэдніх хуткасцяў."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Выбар колеравай схемы для цеплавой карты."
 
 msgid "Track and Point Coloring"
 msgstr "Размаляваць трэкі і пункты"
@@ -15816,7 +15836,7 @@ msgstr ""
 "Канфлікт камбінацый клавіш: ''{0}'' пераназначаны з ''{1}'' на ''{2}''."
 
 msgid "Unknown territory id: {0}"
-msgstr ""
+msgstr "Невядомы ідэнтыфікатар тэрыторыі: {0}"
 
 msgid "There was {0} tag found in the buffer, it is suspicious!"
 msgid_plural "There were {0} tags found in the buffer, it is suspicious!"
@@ -16352,7 +16372,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard)"
-msgstr ""
+msgstr "OpenStreetMap Carto (стандартны)"
 
 msgid "OpenStreetMap (Standard Black & White)"
 msgstr "OpenStreetMap (стандартны чорна-белы)"
@@ -16458,7 +16478,7 @@ msgstr ""
 "Здымкі з imagico.de: выспа Мардвінава (Элефант)/выспа Шышкава (Кларанс)"
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN Аргентына (TMS)"
 
 msgid "IGN Argentina (WMS)"
 msgstr "IGN Аргенціна (WMS)"
@@ -16554,7 +16574,7 @@ msgid "AGIV Flanders 2013-2015 aerial imagery 10cm"
 msgstr "AGIV Фландрыя - аэрафотаздымка 2013-2015, 10см"
 
 msgid "AGIV Flanders GRB"
-msgstr ""
+msgstr "AGIV Фландрыя GRB"
 
 msgid "URBISfr numerical imagery (2013)"
 msgstr "URBISfr - лічбавая выява (2013)"
@@ -16590,7 +16610,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC аўтобусныя маршруты (2014)"
 
 msgid "TEC bus stops (2014)"
-msgstr ""
+msgstr "Аўтобусныя прыпынкі TEC (2014)"
 
 msgid "Benin: Cotonou Pleiade 2016"
 msgstr "Бенін: Катану 2016 (Pleiade)"
@@ -16608,13 +16628,19 @@ msgid "IBGE Mapa de Setores Rurais"
 msgstr "IBGE Карта сельскіх раёнаў"
 
 msgid "IBGE Distrito Federal"
-msgstr ""
+msgstr "IBGE Федэральная акруга"
 
 msgid "Rio Mosaic 2013"
-msgstr ""
+msgstr "Рыа, мазаіка 2013"
 
 msgid "Rio Mosaic 2015"
-msgstr ""
+msgstr "Рыа, мазаіка 2013"
+
+msgid "Londrina Ortofoto 2011"
+msgstr "Ландрына - артафота 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Санта-Катарына - OrtoRGB 2012"
 
 msgid "Geobase Hydrography"
 msgstr "Geobase Гідраграфія"
@@ -16645,7 +16671,7 @@ msgstr "Здымкі з imagico.de: поўнач выспы Элсмір"
 
 msgid ""
 "imagico.de OSM images for mapping: Northern Ellesmere Island July 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: выспа Элсмір, ліпень 2016"
 
 msgid "imagico.de OSM images for mapping: Fogo, Cape Verde"
 msgstr "Здымкі з imagico.de: выспа Фагу, Каба-Вэрдэ"
@@ -16697,6 +16723,7 @@ msgstr "Здымкі з imagico.de: вулкан Алтар"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"Здымкі з imagico.de: выспы Дарвін (Кулпепер) і Вулф (Уэнмен), Галапагос"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Эстонія Базавая карта (Maaamet)"
@@ -16870,15 +16897,17 @@ msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight "
 "September 2015"
 msgstr ""
+"Здымкі з imagico.de: авіябаза Туле - DMS, аблёт на нізкай вышыні, верасень "
+"2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight September "
 "2015"
-msgstr ""
+msgstr "Здымкі з imagico.de: авіябаза Туле - DMS, аблёт у верасні 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015"
-msgstr ""
+msgstr "Здымкі з imagico.de: авіябаза Туле - DMS, аблёт у кастрычніку 2015"
 
 msgid "imagico.de OSM images for mapping: Greenland mosaic"
 msgstr "Здымкі з imagico.de: мазаіка Грэнландыі"
@@ -16887,7 +16916,7 @@ msgid "imagico.de OSM images for mapping: May 2013 off-nadir Landsat"
 msgstr "Здымкі з imagico.de: Landsat не ў надзіры (травень 2013)"
 
 msgid "imagico.de OSM images for mapping: Landsat off-nadir July 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: Landsat не ў надзіры (ліпень 2016)"
 
 msgid "imagico.de OSM images for mapping: Northern Greenland ASTER"
 msgstr "Здымкі з imagico.de: поўнач Грэнландыі (ASTER)"
@@ -16897,7 +16926,7 @@ msgstr "Здымкі дронаў (Гаіці)"
 
 msgid ""
 "Temporary inavailable until presumably January 2017 due to a server switch."
-msgstr ""
+msgstr "Часова недаступнае (меркавана, да студзеня 2017) з-за змены сервера."
 
 msgid "Drone Imagery 2014 (Haiti)"
 msgstr "Здымкі з дрону 2014 (Гаіці)"
@@ -16936,7 +16965,7 @@ msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr "Рэчышча Дуная ў Будапешце, Сентэндры і Сігетманасторы"
 
 msgid "Budapest district XI ortophoto 2015"
-msgstr ""
+msgstr "Будапешт, раён XI - ортафота 2015"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
 msgstr "OpenStreetMap Вугоршчына (маршруты пешага турызму)"
@@ -17021,10 +17050,10 @@ msgid "South Tyrol Orthofoto 2011"
 msgstr "Паўднёвы Ціроль - артафота 2011"
 
 msgid "South Tyrol Orthofoto 2011 (highres)"
-msgstr ""
+msgstr "Паўднёвы Тыроль ортафота 2011 (высокая разрознасць)"
 
 msgid "South Tyrol Orthofoto 2014"
-msgstr ""
+msgstr "Паўднёвы Тыроль - ортафота 2014"
 
 msgid "South Tyrol Topomap"
 msgstr "Паўднёвы Ціроль - тапакарта"
@@ -17033,7 +17062,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Японія: ортаздымкі GSI"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: гара Кенія, 2016"
 
 msgid "USSR - Latvia"
 msgstr "СССР - Латвія"
@@ -17078,7 +17107,7 @@ msgid "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 msgstr "Сектар Газа - Pléiades - 06.07.2014 (NIR)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
-msgstr ""
+msgstr "Здымкі з imagico.de: Панамскі канал - ціхаакіянскі бок"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "Здымкі з imagico.de: Панамскі канал"
@@ -17090,7 +17119,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "Здымкі з imagico.de: Новая Ірландыя"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "Здымкі з imagico.de: Карапуна"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -17234,18 +17263,18 @@ msgid "ScanEx SPOT"
 msgstr "ScanEx SPOT"
 
 msgid "imagico.de OSM images for mapping: Kerch Strait"
-msgstr ""
+msgstr "Здымкі з imagico.de: Керчанскі праліў"
 
 msgid "imagico.de OSM images for mapping: Ushakov Island August 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: выспа Ушакова, жнівень 2016"
 
 msgid ""
 "imagico.de OSM images for mapping: Northern and Polar Ural mountains August "
 "2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: Паўночны і Палярны Урал, жнівень 2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
-msgstr ""
+msgstr "Здымкі з imagico.de: касмадром Усходні"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk Аўтамабільная"
@@ -17314,7 +17343,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Канарскія выспы"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "Здымкі з imagico.de: Адамаў Мост"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Кантон Аргаў 25 см (AGIS 2011)"
@@ -17386,8 +17415,11 @@ msgstr "Фіез - артафота 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Кантон Базель-Штадт 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Кантон Базель - ландшафт 10см (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: Цэнтральныя Альпы, канец верасня 2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Тайвань e-Map Open Data"
@@ -17405,7 +17437,7 @@ msgid "NLSC Open Data WMTS"
 msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: Кіліманджара 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -17468,19 +17500,19 @@ msgid "MD Transportation Basemap"
 msgstr "Мэрыленд: базавая карта транспарта"
 
 msgid "Delaware 2012 Orthophotography"
-msgstr ""
+msgstr "Дэлавэр - ортафота 2012"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains"
 msgstr "Здымкі з imagico.de: горы Рувензоры"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains 2016"
-msgstr ""
+msgstr "Здымкі з imagico.de: горы Рувензоры, 2016"
 
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Украіна - артафота 2012"
 
 msgid "Works only from within Ukraine or with an Ukrainian proxy server."
-msgstr ""
+msgstr "Даступна толькі ва Украіне ці праз украінскі проксі-сервер."
 
 msgid "Ukraine - Kyiv 2014 (DZK)"
 msgstr "Украіна - Кіеў 2014 (DZK)"
@@ -17850,7 +17882,7 @@ msgid "Create a grid of ways."
 msgstr "Стварае сетку з ліній."
 
 msgid "Customization of public public transport stops."
-msgstr ""
+msgstr "Налада прыпынкаў грамадскага транспарта."
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
@@ -23161,7 +23193,7 @@ msgstr "халупа"
 
 msgctxt "building"
 msgid "bungalow"
-msgstr ""
+msgstr "бунгала"
 
 msgctxt "building"
 msgid "dormitory"
@@ -24460,7 +24492,7 @@ msgid "Seafood"
 msgstr "Морапрадукты"
 
 msgid "Dairy"
-msgstr ""
+msgstr "Малочныя прадукты"
 
 msgid "Deli (Fine Food)"
 msgstr "Дэлікатэсы"
@@ -25278,6 +25310,9 @@ msgstr "Лінія дрэў"
 msgid "A line of trees."
 msgstr "Шэраг дрэў."
 
+msgid "Wood"
+msgstr "Лес"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Лес, асноўным прызначэннем якога не з’яўляецца нарыхтоўка драўніны."
 
@@ -25640,6 +25675,9 @@ msgstr "Паштовы індэкс"
 msgid "Country code"
 msgstr "Код краіны"
 
+msgid "Unit/Suite"
+msgstr "Блок/комплекс"
+
 msgid "House name"
 msgstr "Назва хаты"
 
@@ -26347,7 +26385,7 @@ msgid "possibly missing {0} tag"
 msgstr "магчыма, прапушчаны тэг {0}"
 
 msgid "street with odd number of {0}, but without {1} and {2} or {3}"
-msgstr ""
+msgstr "вуліца з няцотным лікам {0}, але без {1} і {2} ці {3}"
 
 msgid "{0} is deprecated"
 msgstr "{0} састарэлы"
@@ -26471,8 +26509,8 @@ msgstr "{0} на кропцы. Павінен выкарыстоўвацца н
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} на кропцы. Павінен быць намаляваны як вобласць."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* на кропцы. Варта выкарыстоўваць у дачыненні"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} на лініі. Варта выкарыстоўваць на кропцы."
@@ -26573,11 +26611,10 @@ msgstr "часовы тып дарогі"
 msgid "{0} used with {1}"
 msgstr "{0} скарыстаны з {1}"
 
-msgid "street name contains ss"
-msgstr "назва вуліцы ўтрымоўвае ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
+"{0} не рэкамендуецца, скарыстайце {1}. Гледзіце таксама падобныя тэгі тыпу "
+"{2}"
 
 msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
@@ -26671,6 +26708,12 @@ msgstr "невядомая мусульманская канфесія"
 msgid "unknown jewish denomination"
 msgstr "невядомая канфесія юдаізму"
 
+msgid "street name contains ss"
+msgstr "назва вуліцы ўтрымоўвае ss"
+
+msgid "street name contains ß"
+msgstr "назва вуліцы ўтрымлівае ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} не патрэбен"
 
diff --git a/i18n/po/bg.po b/i18n/po/bg.po
index fa44221..d5d1ef0 100644
--- a/i18n/po/bg.po
+++ b/i18n/po/bg.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-08-05 14:02+0000\n"
 "Last-Translator: pl <Unknown>\n"
 "Language-Team: Bulgarian <bg at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:41+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:41+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: bg\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2107,6 +2107,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Завършване на чертането."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2131,12 +2137,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr "Двойно подравняване"
 
@@ -2593,6 +2593,9 @@ msgstr ""
 msgid "objects"
 msgstr "обекти"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "всички пътища"
 
@@ -2661,6 +2664,9 @@ msgstr "всички избрани обекти"
 msgid "all incomplete objects"
 msgstr "всички непълни обекти"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4279,29 +4285,31 @@ msgstr "Непознат тип релация"
 msgid "Relation is empty"
 msgstr "Релацията е празна"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<празно>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Липсва роля {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -11030,7 +11038,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11045,15 +11053,23 @@ msgstr "Вело"
 msgid "Foot"
 msgstr "Пеш"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Гора"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15187,6 +15203,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -15951,6 +15973,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23679,6 +23704,9 @@ msgstr "Редица дървета"
 msgid "A line of trees."
 msgstr "Ред дървета"
 
+msgid "Wood"
+msgstr "Гора"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24031,6 +24059,9 @@ msgstr "Пощенски код"
 msgid "Country code"
 msgstr "Код на държава"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Име на дом"
 
@@ -24831,8 +24862,8 @@ msgstr "{0} за точка. Трябва да се ползва за път."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} за точка. Трябва да се ползва за площ."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* за точка. Трябва да се ползва в релация."
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr ""
@@ -24927,9 +24958,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr "{0} се използва с {1}"
 
-msgid "street name contains ss"
-msgstr "името на улица съдържа \"ss\""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25017,6 +25045,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr "името на улица съдържа \"ss\""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} е ненужно"
 
diff --git a/i18n/po/bn.po b/i18n/po/bn.po
index f1c4f6e..5e2fb0e 100644
--- a/i18n/po/bn.po
+++ b/i18n/po/bn.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-04-03 09:24+0000\n"
 "Last-Translator: Md Alamgir <alamgircu at hotmail.com>\n"
 "Language-Team: Bengali <bn at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:39+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:39+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: bn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2023,6 +2023,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2047,12 +2053,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2487,6 +2487,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2555,6 +2558,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4139,29 +4145,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10795,7 +10803,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10810,15 +10818,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14911,6 +14927,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15673,6 +15695,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23386,6 +23411,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23736,6 +23764,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24536,7 +24567,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24632,9 +24663,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24722,6 +24750,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/br.po b/i18n/po/br.po
index f0ec3db..a19b5a3 100644
--- a/i18n/po/br.po
+++ b/i18n/po/br.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-10-17 12:11+0000\n"
 "Last-Translator: Fulup <Unknown>\n"
 "Language-Team: Breton <br at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:41+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:41+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: br\n"
 
 msgid "License"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/bs.po b/i18n/po/bs.po
index f04b10f..b00d557 100644
--- a/i18n/po/bs.po
+++ b/i18n/po/bs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2012-11-03 23:07+0000\n"
 "Last-Translator: Alen Mahovic <eyeofthestorm at windowslive.com>\n"
 "Language-Team: Bosnian <bs at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:40+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:40+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: bs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2023,6 +2023,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2047,12 +2053,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2487,6 +2487,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2555,6 +2558,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4139,29 +4145,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10795,7 +10803,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10810,15 +10818,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14911,6 +14927,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15673,6 +15695,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23386,6 +23411,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23736,6 +23764,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24536,7 +24567,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24632,9 +24663,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24722,6 +24750,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ca.po b/i18n/po/ca.po
index 2800a67..2fff0f0 100644
--- a/i18n/po/ca.po
+++ b/i18n/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-11-15 23:48+0000\n"
 "Last-Translator: Don-vip <Unknown>\n"
 "Language-Team: el_libre - - www.catmidia.cat\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:42+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:42+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ca\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2196,6 +2196,12 @@ msgstr "Discretització d''angles activa"
 msgid "Finish drawing."
 msgstr "Finalitza el dibuix."
 
+msgid "Angle snapping"
+msgstr "Unió automàtica d''angles"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Commuta la discretització d''angles mentre es dibuixa"
+
 msgid "Toggle snapping by {0}"
 msgstr "Commuta la discretització amb {0}"
 
@@ -2220,12 +2226,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "ARREGLA"
 
-msgid "Angle snapping"
-msgstr "Unió automàtica d''angles"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Commuta la discretització d''angles mentre es dibuixa"
-
 msgid "Dual alignment"
 msgstr "Alineament doble"
 
@@ -2713,6 +2713,9 @@ msgstr "utilitzar parèntesis per agrupar expressions"
 msgid "objects"
 msgstr "objectes"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "totes les vies"
 
@@ -2784,6 +2787,9 @@ msgstr "tots els objectes seleccionats"
 msgid "all incomplete objects"
 msgstr "tots els objectes incomplets"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objectes relacionats"
 
@@ -4537,33 +4543,32 @@ msgstr "El tipus de relació no és conegut"
 msgid "Relation is empty"
 msgstr "La relació és buida"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
-"El membre del rol no coincideix amb l''expressió {0} a la plantilla {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"El membre de tipus {0} del rol no coincideix amb la llista de {1} de la "
-"plantilla {2}"
 
 msgid "<empty>"
 msgstr "<buit>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rol {0} desconegut a les plantilles {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "S''ha trobat un rol amb tipus buit, s''esperava un rol de tipus {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Manca rol {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Un nombre de {0} rols és massa petit ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Un nombre de {0} rols és massa gran ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Vies que s''encreuen amb elles mateixes"
@@ -11935,7 +11940,7 @@ msgstr "Dilució de la precisió (vermell = alta, verd = baixa, si disponible)"
 msgid "Track date"
 msgstr "Dades del recorregut"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11950,15 +11955,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "Peu"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bosc"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16593,6 +16606,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hidrografia"
 
@@ -17358,6 +17377,9 @@ msgstr "Fiez Orthofoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -25250,6 +25272,9 @@ msgstr "Arbreda"
 msgid "A line of trees."
 msgstr "Filera d''arbres"
 
+msgid "Wood"
+msgstr "Bosc"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Bosc on la producció de fusta no és un ús dominant."
 
@@ -25612,6 +25637,9 @@ msgstr "Codi postal"
 msgid "Country code"
 msgstr "Codi del país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nom de la Casa"
 
@@ -26435,8 +26463,8 @@ msgstr "{0} a un node. Ha de ser utilitzat a una via."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} a un node. Ha de ser utilitzat a una àrea."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* a un node. S''ha d''utilitzar a una relació"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} a una via. Ha de ser utilitzat a un node."
@@ -26531,9 +26559,6 @@ msgstr "via de tipus temporal"
 msgid "{0} used with {1}"
 msgstr "{0} usat amb {1}"
 
-msgid "street name contains ss"
-msgstr "el nom del carrer conté ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26629,6 +26654,12 @@ msgstr "denominació musulmana sense especificar"
 msgid "unknown jewish denomination"
 msgstr "denominació jueva sense especificar"
 
+msgid "street name contains ss"
+msgstr "el nom del carrer conté ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} no és necessari"
 
diff --git a/i18n/po/ca at valencia.po b/i18n/po/ca at valencia.po
index 30921b8..755aae0 100644
--- a/i18n/po/ca at valencia.po
+++ b/i18n/po/ca at valencia.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-04-25 18:52+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: el_libre - - www.catmidia.cat\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:26+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:25+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ca at valencia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2180,6 +2180,12 @@ msgstr "Discretització d''angles activa"
 msgid "Finish drawing."
 msgstr "Finalitza el dibuix."
 
+msgid "Angle snapping"
+msgstr "Unió automàtica d''angles"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Commuta la discretització d''angles mentre es dibuixa"
+
 msgid "Toggle snapping by {0}"
 msgstr "Commuta la discretització amb {0}"
 
@@ -2204,12 +2210,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "ARREGLA"
 
-msgid "Angle snapping"
-msgstr "Unió automàtica d''angles"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Commuta la discretització d''angles mentre es dibuixa"
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2679,6 +2679,9 @@ msgstr "utilitzar parèntesis per agrupar expressions"
 msgid "objects"
 msgstr "objectes"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "totes les vies"
 
@@ -2747,6 +2750,9 @@ msgstr "tots els objectes seleccionats"
 msgid "all incomplete objects"
 msgstr "tots els objectes incomplets"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objectes relacionats"
 
@@ -4464,30 +4470,32 @@ msgstr "El tipus de relació no és conegut"
 msgid "Relation is empty"
 msgstr "La relació és buida"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<buit>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Manca rol {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Un nombre de {0} rols és massa petit ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Un nombre de {0} rols és massa gran ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Vies que s''encreuen amb elles mateixes"
@@ -11766,7 +11774,7 @@ msgstr "Dilució de la precisió (roig = alta, verd = baixa, si disponible)"
 msgid "Track date"
 msgstr "Dades del recorregut"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11781,15 +11789,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "Peu"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bosc"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16380,6 +16396,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -17142,6 +17164,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24966,6 +24991,9 @@ msgstr "Filera d''arbres"
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Bosc"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -25316,6 +25344,9 @@ msgstr "Codi postal"
 msgid "Country code"
 msgstr "Codi del país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nom de la Casa"
 
@@ -26116,7 +26147,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -26212,9 +26243,6 @@ msgstr "via de tipus temporal"
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr "el nom del carrer conté ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26302,6 +26330,12 @@ msgstr "denominació musulmana sense especificar"
 msgid "unknown jewish denomination"
 msgstr "denominació jueva sense especificar"
 
+msgid "street name contains ss"
+msgstr "el nom del carrer conté ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/cs.po b/i18n/po/cs.po
index afa6c84..474cfb9 100644
--- a/i18n/po/cs.po
+++ b/i18n/po/cs.po
@@ -8,16 +8,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-03 08:58+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-26 14:43+0000\n"
 "Last-Translator: Dalibor Jelínek <launchpad.net at dalibor.cz>\n"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:43+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:43+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: cs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2186,6 +2186,12 @@ msgstr "Přichytávání úhlů aktivní."
 msgid "Finish drawing."
 msgstr "Dokončit kreslení"
 
+msgid "Angle snapping"
+msgstr "Přichytávání úhlů"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Přepínat režim přichytávání úhlů během kreslení"
+
 msgid "Toggle snapping by {0}"
 msgstr "přepínat přichytávání {0}"
 
@@ -2210,12 +2216,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "OPRAVIT"
 
-msgid "Angle snapping"
-msgstr "Přichytávání úhlů"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Přepínat režim přichytávání úhlů během kreslení"
-
 msgid "Dual alignment"
 msgstr "Dvojité zarovnávání"
 
@@ -2704,6 +2704,9 @@ msgstr "použijte závorky k seskupení výrazů"
 msgid "objects"
 msgstr "Objekty"
 
+msgid "all nodes"
+msgstr "všechny uzly"
+
 msgid "all ways"
 msgstr "všechny cesty"
 
@@ -2774,6 +2777,10 @@ msgstr "všechny vybrané objekty"
 msgid "all incomplete objects"
 msgstr "všechny nekompletní objekty"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+"všechny smazané objekty (zaškrtávací políčko  <b>{0}</b> musí být zaškrtnuto)"
+
 msgid "related objects"
 msgstr "Související objekty"
 
@@ -4506,30 +4513,34 @@ msgstr "Neznámý typ relace"
 msgid "Relation is empty"
 msgstr "Relace je prázdná"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Role členu neodpovídá výrazu {0} v šabloně {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr "Role členů relace neodpovídají výrazu ''{0}'' v šabloně {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr "Typ role členu {0} není v seznamu přípustných {1} v šabloně {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
+msgstr ""
+"Typ ''{0}'' členu relace s rolí  ''{1}'' neodpovídá přijímaným typům ''{2}'' "
+"v šabloně {3}"
 
 msgid "<empty>"
 msgstr "<prázdné>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Role {0} neznámá v šablonách {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Role ''{0}'' je neznámá v šablonách ''{1}''"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Nalezen prázdný typ role, když bylo očekáváno jedno z {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Nalezena prázdná role, ale byla očekávána jedna z ''{0}''"
 
-msgid "Role {0} missing"
-msgstr "Role {0} chybí"
+msgid "Role ''{0}'' missing"
+msgstr "Role ''{0}'' chybí"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Počet rolí {0} je příliš nízký ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Počet ''{0}'' rolí je příliš nízký ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Počet rolí {0} je příliš vysoký ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Počet ''{0}'' rolí je příliš vysoký ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Cesty protínající samy sebe"
@@ -11824,8 +11835,8 @@ msgstr ""
 msgid "Track date"
 msgstr "Datum záznamu"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Heat Mapa (tmavý = málo, světlý = hodně)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Jedna barva (může být nastavena pro pojmenované vrstvy)"
@@ -11839,17 +11850,25 @@ msgstr "Cyklisté"
 msgid "Foot"
 msgstr "Pěší"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Uživatel"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Inferno"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Viridis"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Prales"
+msgstr "Dřevo"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Heat"
 
 msgid "Create markers when reading GPX"
 msgstr "Vytvořit časové značky v průběhu čtení GPX"
@@ -11864,7 +11883,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Vyhladit GPX grafiku (antialiasing)"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Vykreslit s neprůhledností (alpha blending) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -11936,6 +11955,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Použít dynamický alpha-blending a přizpůsobit šířku podle úrovně zvětšení u "
+"všech čar GPX."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -11963,12 +11984,13 @@ msgstr "Obarvovat body a části trasy podle časových značek."
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Sebrané body a segmenty trasy pro získání polohy a zobrazené jako heat mapa."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr "Umožní ladit barvy cesty podle různých průměrných rychlostí."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Vybrat barevné schéma heat mapy."
 
 msgid "Track and Point Coloring"
 msgstr "Barvy tras a bodů"
@@ -16438,6 +16460,12 @@ msgstr "Rio Mosaic 2013"
 msgid "Rio Mosaic 2015"
 msgstr "Rio Mosaic 2015"
 
+msgid "Londrina Ortofoto 2011"
+msgstr "Londrina Ortofoto 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Santa Catarina OrtoRGB 2012"
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -16468,6 +16496,7 @@ msgstr "imagico.de OSM images for mapping: Northern Ellesmere Island"
 msgid ""
 "imagico.de OSM images for mapping: Northern Ellesmere Island July 2016"
 msgstr ""
+"imagico.de OSM images for mapping: Northern Ellesmere Island July 2016"
 
 msgid "imagico.de OSM images for mapping: Fogo, Cape Verde"
 msgstr "imagico.de OSM images for mapping: Fogo, Cape Verde"
@@ -16519,6 +16548,7 @@ msgstr "imagico.de OSM images for mapping: El Altar"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Estonsko základní (Maaamet)"
@@ -16693,15 +16723,20 @@ msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight "
 "September 2015"
 msgstr ""
+"imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight "
+"September 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight September "
 "2015"
 msgstr ""
+"imagico.de OSM images for mapping: Thule Airbase DMS overflight September "
+"2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015"
 msgstr ""
+"imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015"
 
 msgid "imagico.de OSM images for mapping: Greenland mosaic"
 msgstr "imagico.de OSM images for mapping: Greenland mosaic"
@@ -16710,7 +16745,7 @@ msgid "imagico.de OSM images for mapping: May 2013 off-nadir Landsat"
 msgstr "imagico.de OSM images for mapping: May 2013 off-nadir Landsat"
 
 msgid "imagico.de OSM images for mapping: Landsat off-nadir July 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Landsat off-nadir July 2016"
 
 msgid "imagico.de OSM images for mapping: Northern Greenland ASTER"
 msgstr "imagico.de OSM images for mapping: Northern Greenland ASTER"
@@ -16855,7 +16890,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Japan GSI ortho Imagery"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Mount Kenya 2016"
 
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
@@ -16900,7 +16935,7 @@ msgid "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 msgstr "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Panama Canal - Pacific side"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "imagico.de OSM images for mapping: Panama Canal"
@@ -16912,7 +16947,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "imagico.de OSM images for mapping: New Ireland"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Coropuna"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -17055,18 +17090,20 @@ msgid "ScanEx SPOT"
 msgstr "ScanEx SPOT"
 
 msgid "imagico.de OSM images for mapping: Kerch Strait"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Kerch Strait"
 
 msgid "imagico.de OSM images for mapping: Ushakov Island August 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Ushakov Island August 2016"
 
 msgid ""
 "imagico.de OSM images for mapping: Northern and Polar Ural mountains August "
 "2016"
 msgstr ""
+"imagico.de OSM images for mapping: Northern and Polar Ural mountains August "
+"2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Vostochny Cosmodrome"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk Auto"
@@ -17135,7 +17172,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Kanárské ostrovy"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Adams Bridge"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
@@ -17206,8 +17243,12 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Kanton Basel-Stadt 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Kanton Basel-Landschaft 10cm (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
+"imagico.de OSM images for mapping: Cental Alps in late September 2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Taiwan e-Map Open Data"
@@ -17225,7 +17266,7 @@ msgid "NLSC Open Data WMTS"
 msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -17294,7 +17335,7 @@ msgid "imagico.de OSM images for mapping: Rwenzori Mountains"
 msgstr "imagico.de OSM images for mapping: Rwenzori Mountains"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Rwenzori Mountains 2016"
 
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
@@ -25078,6 +25119,9 @@ msgstr "Stromořadí"
 msgid "A line of trees."
 msgstr "Stromořadí."
 
+msgid "Wood"
+msgstr "Prales"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Lesní porost, kde hlavním účelem není těžba dřeva."
 
@@ -25439,6 +25483,9 @@ msgstr "Poštovní směrovací číslo"
 msgid "Country code"
 msgstr "Kód země"
 
+msgid "Unit/Suite"
+msgstr "Jednotka/Apartmá"
+
 msgid "House name"
 msgstr "Jméno domu"
 
@@ -26264,8 +26311,8 @@ msgstr "{0} na uzlu. Mělo by být použito na cestě."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} na uzlu. Mělo by být nakresleno jako plocha."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* na uzlu. Mělo by být použito v relaci"
+msgid "{0} on a node. Should be used in a relation"
+msgstr "{0} na uzlu. Mělo by být použito v relaci"
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} na cestě. Mělo by být použito na uzlu."
@@ -26366,9 +26413,6 @@ msgstr "dočasný typ cesty"
 msgid "{0} used with {1}"
 msgstr "{0} použito s {1}"
 
-msgid "street name contains ss"
-msgstr "název ulice obsahuje ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 "{0} je zastaralé, použijte spíše {1}. Také se podívejte na podobné značky "
@@ -26468,6 +26512,12 @@ msgstr "neznámá varianta islámu"
 msgid "unknown jewish denomination"
 msgstr "neznámá varianta judaismu"
 
+msgid "street name contains ss"
+msgstr "název ulice obsahuje ss"
+
+msgid "street name contains ß"
+msgstr "název ulice obsahuje ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} není potřeba uvádět"
 
diff --git a/i18n/po/cy.po b/i18n/po/cy.po
index bac9dcc..efebf1a 100644
--- a/i18n/po/cy.po
+++ b/i18n/po/cy.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-07-17 21:45+0000\n"
 "Last-Translator: iggy23 <Unknown>\n"
 "Language-Team: Welsh <cy at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : (n != 8 && n != 11) ? "
 "2 : 3;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:20+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:19+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: cy\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2021,6 +2021,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2045,12 +2051,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2485,6 +2485,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2553,6 +2556,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4137,29 +4143,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10793,7 +10801,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10808,15 +10816,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14909,6 +14925,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15671,6 +15693,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23384,6 +23409,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23734,6 +23762,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24534,7 +24565,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24630,9 +24661,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24720,6 +24748,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/da.po b/i18n/po/da.po
index 7589dc4..384cfad 100644
--- a/i18n/po/da.po
+++ b/i18n/po/da.po
@@ -8,16 +8,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-06 15:02+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-21 11:14+0000\n"
 "Last-Translator: Jørn <joern.map at gmail.com>\n"
 "Language-Team: Dansk <kde-i18n-doc at kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:43+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:43+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: da_DK\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
@@ -2160,6 +2160,12 @@ msgstr "Vinkellås aktiv."
 msgid "Finish drawing."
 msgstr "Afslut tegning."
 
+msgid "Angle snapping"
+msgstr "Vinkellås"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Skift vinkellås tilstand mens der tegnes"
+
 msgid "Toggle snapping by {0}"
 msgstr "Aktiver låsning med {0}"
 
@@ -2184,12 +2190,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Vinkellås"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Skift vinkellås tilstand mens der tegnes"
-
 msgid "Dual alignment"
 msgstr "Dobbelt tilpasning"
 
@@ -2669,6 +2669,9 @@ msgstr "brug paranteser for at gruppere udtryk"
 msgid "objects"
 msgstr "objekter"
 
+msgid "all nodes"
+msgstr "alle punkter"
+
 msgid "all ways"
 msgstr "alle veje"
 
@@ -2740,6 +2743,10 @@ msgstr "alle markerede objekter"
 msgid "all incomplete objects"
 msgstr "alle ufærdige objekter"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+"alle slettede objekter (afkrydsningsfeltet <b>{0}</b> skal være markeret)"
+
 msgid "related objects"
 msgstr "relaterede objekter"
 
@@ -4452,31 +4459,35 @@ msgstr "Relationstypen er ukendt"
 msgid "Relation is empty"
 msgstr "Relationen er tom"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Rolle medlem matcher ikke udtryk {0} i skabelon {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
+"Rolle relation medlem passer ikke til udtryk ''{0}'' i skabelonen {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Rolle medlem type {0} matcher ikke accepteret liste af {1} i skabelon {2}"
+"Type ''{0}'' relation medlem med rollen ''{1}'' passer ikke til accepterede "
+"typer ''{2}'' i skabelonen {3}"
 
 msgid "<empty>"
 msgstr "<tom>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rolle {0} ukendt i skabeloner {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Rolle ''{0}'' ukendt i skabeloner ''{1}''"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Tom rolletype fundet, men forventede en af {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Tom rolle type fundet, havde forventet en af ''{0}''"
 
-msgid "Role {0} missing"
-msgstr "Rolle {0} mangler"
+msgid "Role ''{0}'' missing"
+msgstr "Rolle ''{0}'' mangler"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Antallet af {0} roller er for lav ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Antal ''{0}'' roller for lavt ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Antallet af {0} roller er for stor ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Antal ''{0}'' roller for højt ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Selvkrydsende veje"
@@ -11703,8 +11714,8 @@ msgstr "Opløsning af position (rød = høj, grøn = lav, hvis tilgængelig)"
 msgid "Track date"
 msgstr "Spor-dato"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Heat Map (mørk = få, lyse = mange)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Enkelt farve (kan justeres for navngivne lag)"
@@ -11718,17 +11729,25 @@ msgstr "Cykel"
 msgid "Foot"
 msgstr "Gående"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Bruger"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Inferno"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Viridis"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Naturskov"
+msgstr "Skov"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Varme"
 
 msgid "Create markers when reading GPX"
 msgstr "Opret markører ved indlæsning af GPX"
@@ -11743,7 +11762,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Udjævn GPX grafik (linjeudjævning)"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Tegn med gennemsigtighed (alfa blanding) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -11816,6 +11835,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Brug dynamisk alpha-blanding og justere bredde baseret på zoom-niveau for "
+"alle GPX linjer."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -11842,13 +11863,14 @@ msgstr "Farvelæg punkter og sporsegmenter efter tidsstempel."
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Indsamlede punkter og spor segmenter for en position og vist som heat map."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr ""
 "Tillader at justere sporfarven for forskellige gennemsnitshastigheder."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Vælger farveskema for heat map."
 
 msgid "Track and Point Coloring"
 msgstr "Farvelægning af spor og punkter"
@@ -14296,7 +14318,7 @@ msgid "Shift+Enter: Add all tags to selected objects"
 msgstr "Shift+Enter: Tilføj alle tags til markerede objekter"
 
 msgid "Enable the checkbox to accept the value"
-msgstr "Marker afkrydsningboksen for at acceptere værdien"
+msgstr "Marker afkrydsningsfeltet for at acceptere værdien"
 
 msgid "Accept all tags from {0} for this session"
 msgstr "Accepter alle tags fra {0} i denne session"
@@ -16268,6 +16290,12 @@ msgstr "Rio Mosaic 2013"
 msgid "Rio Mosaic 2015"
 msgstr "Rio Mosaic 2015"
 
+msgid "Londrina Ortofoto 2011"
+msgstr "Londrina Ortofoto 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Santa Catarina OrtoRGB 2012"
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -16350,6 +16378,7 @@ msgstr "imagico.de OSM images for mapping: El Altar"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Estonia Basemap (Maaamet)"
@@ -16693,7 +16722,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Japan GSI ortho Imagery"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Mount Kenya 2016"
 
 msgid "USSR - Latvia"
 msgstr "USSR - Latvia"
@@ -16738,7 +16767,7 @@ msgid "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 msgstr "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Panama Canal - Pacific side"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "imagico.de OSM images for mapping: Panama Canal"
@@ -16750,7 +16779,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "imagico.de OSM images for mapping: New Ireland"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Coropuna"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -16906,7 +16935,7 @@ msgstr ""
 "2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Vostochny Cosmodrome"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk Car"
@@ -16975,7 +17004,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Canary Islands"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Adams Bridge"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
@@ -17046,8 +17075,12 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Kanton Basel-Stadt 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Kanton Basel-Landschaft 10cm (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
+"imagico.de OSM images for mapping: Cental Alps in late September 2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Taiwan e-Map Open Data"
@@ -17065,7 +17098,7 @@ msgid "NLSC Open Data WMTS"
 msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
-msgstr ""
+msgstr "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -24935,6 +24968,9 @@ msgstr "Trærække"
 msgid "A line of trees."
 msgstr "En linje af træer."
 
+msgid "Wood"
+msgstr "Naturskov"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Skov hvor træproduktion ikke dominere brug."
 
@@ -25299,6 +25335,9 @@ msgstr "Postnummer"
 msgid "Country code"
 msgstr "Landekode"
 
+msgid "Unit/Suite"
+msgstr "Enhed"
+
 msgid "House name"
 msgstr "Husnavn"
 
@@ -26121,8 +26160,8 @@ msgstr "{0} på et punkt. Bør bruges på en vej."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} på et punkt. Bør tegnes som et område."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* på et punkt. Bør bruges i en relation"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} på en vej. Bør bruges på et punkt."
@@ -26223,9 +26262,6 @@ msgstr "midlertidig vejtype"
 msgid "{0} used with {1}"
 msgstr "{0} bruges med {1}"
 
-msgid "street name contains ss"
-msgstr "gadenavn indeholder ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr "{0} er forældet, brug {1} i stedet. Tjek også lignende tags som {2}"
 
@@ -26321,6 +26357,12 @@ msgstr "ukendt muslimsk trosretning"
 msgid "unknown jewish denomination"
 msgstr "ukendt jødisk trosretning"
 
+msgid "street name contains ss"
+msgstr "gadenavn indeholder ss"
+
+msgid "street name contains ß"
+msgstr "gadenavn indeholder ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} er unødvendig"
 
diff --git a/i18n/po/de.po b/i18n/po/de.po
index 54cc4ab..ca42739 100644
--- a/i18n/po/de.po
+++ b/i18n/po/de.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-12-27 11:32+0000\n"
-"Last-Translator: Dieter W. <geozeisig at versanet.de>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-27 08:23+0000\n"
+"Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: JOSM\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:49+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:49+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: de\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-Basepath: /home/simon/src/josm.all/i18n\n"
@@ -2232,6 +2232,12 @@ msgstr "Winkelfangen aktiviert."
 msgid "Finish drawing."
 msgstr "Zeichnen beenden."
 
+msgid "Angle snapping"
+msgstr "Winkelfang"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Während des Zeichnens den Winkelfangmodus umschalten"
+
 msgid "Toggle snapping by {0}"
 msgstr "Umschalten des Einrastens mit {0}"
 
@@ -2256,12 +2262,6 @@ msgstr "0,30,45,60,90, …"
 msgid "FIX"
 msgstr "FIXIEREN"
 
-msgid "Angle snapping"
-msgstr "Winkelfang"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Während des Zeichnens den Winkelfangmodus umschalten"
-
 msgid "Dual alignment"
 msgstr "Doppelte Ausrichtung"
 
@@ -2749,6 +2749,9 @@ msgstr "Klammern zum Gruppieren von Ausdrücken verwenden"
 msgid "objects"
 msgstr "Objekte"
 
+msgid "all nodes"
+msgstr "Alle Punkte"
+
 msgid "all ways"
 msgstr "Alle Linien"
 
@@ -2821,6 +2824,10 @@ msgstr "Alle ausgewählten Objekte"
 msgid "all incomplete objects"
 msgstr "Alle unvollständigen Objekte"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+"Alle gelöschten Objekte (Kontrollkästchen <b>{0}</b> muss aktiviert sein)"
+
 msgid "related objects"
 msgstr "zugehörige Objekte"
 
@@ -4581,33 +4588,36 @@ msgstr "Relationstyp unbekannt"
 msgid "Relation is empty"
 msgstr "Relation ist leer"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
-"Rollenmitglied stimmt nicht mit dem Ausdruck {0} in Vorlage {1} überein"
+"Rolle von Relationselement stimmt nicht mit dem Ausdruck ''{0}'' in Vorlage "
+"{1} überein"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Rollen Elementtyp {0} stimmt nicht mit der akzeptierten Liste von {1} in "
-"Vorlage {2} überein"
+"Typ ''{0}'' des Relationselementes mit Rolle ''{1}'' stimmt nicht mit den "
+"akzeptierten Typen ''{2}'' in Vorlage {3} überein"
 
 msgid "<empty>"
 msgstr "<leer>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rolle {0} in Vorlagen {1} unbekannt"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Rolle ''{0}'' in Vorlagen ''{1}'' unbekannt"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Leerer Rollentyp gefunden, erwartet wird einer von {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Leerer Rollentyp gefunden, erwartet wird einer von ''{0}''"
 
-msgid "Role {0} missing"
-msgstr "Rolle {0} fehlt"
+msgid "Role ''{0}'' missing"
+msgstr "Rolle ''{0}'' fehlt"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Anzahl der {0}-Rollen ist zu klein ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Anzahl der ''{0}''-Rollen ist zu klein ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Anzahl der {0}-Rollen ist zu hoch ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Anzahl der ''{0}''-Rollen ist zu hoch ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Linien, die sich selbst überschneiden"
@@ -6026,6 +6036,8 @@ msgstr "Objekt"
 
 msgid "Merged members not frozen yet. Cannot build resolution command"
 msgstr ""
+"Vereinigte Elemente noch nicht fixiert. Konfliktlösung kann nicht ausgeführt "
+"werden"
 
 msgid "<undefined>"
 msgstr "<undefiniert>"
@@ -9037,7 +9049,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Editor"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -12030,8 +12042,8 @@ msgstr ""
 msgid "Track date"
 msgstr "Datum der Spur"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Heatmap (dunkel = wenig, hell = viel)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Einzelne Farbe (kann für benannte Ebenen angepasst werden)"
@@ -12045,17 +12057,25 @@ msgstr "Fahrrad"
 msgid "Foot"
 msgstr "Zu Fuß"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Nutzer"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Inferno"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Viridis"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Naturwald"
+msgstr "Holz"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Hitze"
 
 msgid "Create markers when reading GPX"
 msgstr "Beim Einlesen von GPX Markierungen erzeugen"
@@ -12070,7 +12090,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Glätten der GPX-Darstellung (Anti-Aliasing)"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Mit Deckkraft zeichnen (Alpha Blending) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -12147,6 +12167,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Dynamisches Alpha Blending anwenden und Breite basierend auf Zoomstufe für "
+"alle GPX-Spuren anpassen."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -12174,6 +12196,8 @@ msgstr "Punkte und Spurabschnitte anhand des Zeitstempels einfärben."
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Punkte und Spurabschnitte für eine Position sammeln und als Heatmap "
+"darstellen."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr ""
@@ -12181,7 +12205,7 @@ msgstr ""
 "Durchschnittsgeschwindigkeiten."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Wählt das Farbschema der Heatmap aus."
 
 msgid "Track and Point Coloring"
 msgstr "Färbung von Spuren und Punkten"
@@ -15966,7 +15990,7 @@ msgstr ""
 "Tastenkürzelkonflikt: ''{0}'' wurde von ''{1}'' auf ''{2}'' verschoben."
 
 msgid "Unknown territory id: {0}"
-msgstr ""
+msgstr "Unbekannte Territorial-ID: {0}"
 
 msgid "There was {0} tag found in the buffer, it is suspicious!"
 msgid_plural "There were {0} tags found in the buffer, it is suspicious!"
@@ -16508,7 +16532,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard)"
-msgstr ""
+msgstr "OpenStreetMap Carto (Standard)"
 
 msgid "OpenStreetMap (Standard Black & White)"
 msgstr "OpenStreetMap (Standard schwarz-weiß)"
@@ -16617,7 +16641,7 @@ msgstr ""
 "imagico.de OSM Bilder für die Kartierung: Elephant Island/Clarence Island"
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN (Nationales Institut für Geografie) Argentinien (TMS)"
 
 msgid "IGN Argentina (WMS)"
 msgstr "IGN Argentinien (WMS)"
@@ -16715,6 +16739,8 @@ msgstr "AGIV Flandern 2013-2015 Luftbilder 10 cm"
 
 msgid "AGIV Flanders GRB"
 msgstr ""
+"AGIV (Geografische Informationsagentur Flanderns) Flandern GRB (große "
+"Referenzdatei)"
 
 msgid "URBISfr numerical imagery (2013)"
 msgstr "URBISfr Zahlenbilder (2013)"
@@ -16750,7 +16776,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC-Buslinien (2014)"
 
 msgid "TEC bus stops (2014)"
-msgstr ""
+msgstr "TEC Bus-Haltestellen (2014)"
 
 msgid "Benin: Cotonou Pleiade 2016"
 msgstr "Benin: Großraum Cotonou 2016"
@@ -16769,12 +16795,19 @@ msgstr "IBGE Karte der ländlichen Gebiete"
 
 msgid "IBGE Distrito Federal"
 msgstr ""
+"IBGE (Brasilianisches Institut für Geografie und Statistik) Bundesdistrikt"
 
 msgid "Rio Mosaic 2013"
-msgstr ""
+msgstr "Rio de Janeiro 2013"
 
 msgid "Rio Mosaic 2015"
-msgstr ""
+msgstr "Rio de Janeiro 2015"
+
+msgid "Londrina Ortofoto 2011"
+msgstr "Londrina Orthofoto 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Santa Catarina OrthoRGB 2012"
 
 msgid "Geobase Hydrography"
 msgstr "Geobasis Hydrografie"
@@ -16807,6 +16840,7 @@ msgstr "imagico.de OSM Bilder für die Kartierung: Nördliche Ellesmere-Insel"
 msgid ""
 "imagico.de OSM images for mapping: Northern Ellesmere Island July 2016"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Nördliche Ellesmere-Insel Juli 2016"
 
 msgid "imagico.de OSM images for mapping: Fogo, Cape Verde"
 msgstr "imagico.de OSM Bilder für die Kartierung: Fogo, Kap Verde"
@@ -16858,6 +16892,7 @@ msgstr "imagico.de OSM Bilder für die Kartierung: El Altar"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Inseln Darwin und Wolf, Galapagos"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Estland Basiskarte (Maaamet)"
@@ -17033,18 +17068,24 @@ msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight "
 "September 2015"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Thule Air Base DMS Überflug in "
+"niedriger Höhe September 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight September "
 "2015"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Thule Air Base DMS Überflug "
+"September 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Thule Air Base DMS Überflug "
+"Oktober 2015"
 
 msgid "imagico.de OSM images for mapping: Greenland mosaic"
-msgstr "imagico.de OSM Bilder für die Kartierung: Grönland-Mosaik"
+msgstr "imagico.de OSM Bilder für die Kartierung: Grönland"
 
 msgid "imagico.de OSM images for mapping: May 2013 off-nadir Landsat"
 msgstr ""
@@ -17053,6 +17094,8 @@ msgstr ""
 
 msgid "imagico.de OSM images for mapping: Landsat off-nadir July 2016"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Landsat seitlich aufgenommen (off-"
+"nadir) Juli 2016"
 
 msgid "imagico.de OSM images for mapping: Northern Greenland ASTER"
 msgstr "imagico.de OSM Bilder für die Kartierung: Nördliches Grönland ASTER"
@@ -17063,6 +17106,7 @@ msgstr "Dronenbilder (Haiti)"
 msgid ""
 "Temporary inavailable until presumably January 2017 due to a server switch."
 msgstr ""
+"Bis vermutlich Januar 2017 zeitweise nicht verfügbar wegen Serverumzug."
 
 msgid "Drone Imagery 2014 (Haiti)"
 msgstr "Dronenbilder 2014 (Haiti)"
@@ -17101,7 +17145,7 @@ msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr "Flussufer der Donau in Budapest, Sankt Andrä und Szigetmonostor"
 
 msgid "Budapest district XI ortophoto 2015"
-msgstr ""
+msgstr "Budapest Bezirk XI Orthofoto 2015"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
 msgstr "OpenStreetMap Hungary (Wanderwege)"
@@ -17185,10 +17229,10 @@ msgid "South Tyrol Orthofoto 2011"
 msgstr "Südtirol Orthofoto 2011"
 
 msgid "South Tyrol Orthofoto 2011 (highres)"
-msgstr ""
+msgstr "Südtirol Orthofoto 2011 (hochaufgelöst)"
 
 msgid "South Tyrol Orthofoto 2014"
-msgstr ""
+msgstr "Südtirol Orthofoto 2014"
 
 msgid "South Tyrol Topomap"
 msgstr "Südtirol Topokarte"
@@ -17197,7 +17241,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Japan GSI Luftbild"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Mount-Kenya-Massiv 2016"
 
 msgid "USSR - Latvia"
 msgstr "UdSSR - Lettland"
@@ -17244,6 +17288,7 @@ msgstr "Gazastreifen - Pléiades - 2014/07/06 (Nahinfrarot)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Panamakanal - pazifische Seite"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "imagico.de OSM Bilder für die Kartierung: Panamakanal"
@@ -17255,7 +17300,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "imagico.de OSM Bilder für die Kartierung: Neuirland"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Coropuna"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -17399,18 +17444,20 @@ msgid "ScanEx SPOT"
 msgstr "ScanEx SPOT"
 
 msgid "imagico.de OSM images for mapping: Kerch Strait"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Straße von Kertsch"
 
 msgid "imagico.de OSM images for mapping: Ushakov Island August 2016"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Uschakow-Insel August 2016"
 
 msgid ""
 "imagico.de OSM images for mapping: Northern and Polar Ural mountains August "
 "2016"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Nördlicher und polarer Ural August "
+"2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Kosmodrom Wostotschny"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk Auto"
@@ -17479,7 +17526,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Kanarische Inseln"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Adamsbrücke"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
@@ -17550,8 +17597,13 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Kanton Basel-Stadt 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Kanton Basel-Landschaft 10cm (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
+"imagico.de OSM Bilder für die Kartierung: Zentrale Alpen später September "
+"2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Taiwan e-Map Open Data"
@@ -17569,7 +17621,7 @@ msgid "NLSC Open Data WMTS"
 msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Kilimandscharo 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -17632,19 +17684,20 @@ msgid "MD Transportation Basemap"
 msgstr "Maryland Transport-Basiskarte"
 
 msgid "Delaware 2012 Orthophotography"
-msgstr ""
+msgstr "Delaware 2012 Orthofoto"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains"
 msgstr "imagico.de OSM Bilder für die Kartierung: Ruwenzori-Gebirge"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains 2016"
-msgstr ""
+msgstr "imagico.de OSM Bilder für die Kartierung: Ruwenzori-Gebirge 2016"
 
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
 msgid "Works only from within Ukraine or with an Ukrainian proxy server."
 msgstr ""
+"Funktioniert nur innerhalb der Ukraine oder mit ukrainischen Proxy-Server."
 
 msgid "Ukraine - Kyiv 2014 (DZK)"
 msgstr "Ukraine - Kiew 2014 (DZK)"
@@ -18017,7 +18070,7 @@ msgid "Create a grid of ways."
 msgstr "Erzeugt ein Liniengitter."
 
 msgid "Customization of public public transport stops."
-msgstr ""
+msgstr "Anpassung von Haltestellen öffentlicher Verkehrsmittel."
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
@@ -23351,7 +23404,7 @@ msgstr "Hütte"
 
 msgctxt "building"
 msgid "bungalow"
-msgstr ""
+msgstr "Bungalow"
 
 msgctxt "building"
 msgid "dormitory"
@@ -24650,7 +24703,7 @@ msgid "Seafood"
 msgstr "Fischhändler"
 
 msgid "Dairy"
-msgstr ""
+msgstr "Milchgeschäft"
 
 msgid "Deli (Fine Food)"
 msgstr "Feinkost"
@@ -25469,6 +25522,9 @@ msgstr "Baumreihe"
 msgid "A line of trees."
 msgstr "Eine Reihe von Bäumen."
 
+msgid "Wood"
+msgstr "Naturwald"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Waldgebiet, bei dem die Holzproduktion nicht im Vordergrund steht."
 
@@ -25838,6 +25894,9 @@ msgstr "Postleitzahl"
 msgid "Country code"
 msgstr "Ländercode"
 
+msgid "Unit/Suite"
+msgstr "Wohneinheit/Suite"
+
 msgid "House name"
 msgstr "Hausname (v.a. UK)"
 
@@ -26548,7 +26607,7 @@ msgid "possibly missing {0} tag"
 msgstr "möglicherweise fehlendes {0}-Merkmal"
 
 msgid "street with odd number of {0}, but without {1} and {2} or {3}"
-msgstr ""
+msgstr "Straße mit ungerader Anzahl von {0}, aber ohne {1} und {2} oder {3}"
 
 msgid "{0} is deprecated"
 msgstr "{0} ist veraltet"
@@ -26672,8 +26731,8 @@ msgstr "{0} auf einem Punkt. Sollte auf einer Linie verwendet werden."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} auf einem Punkt. Sollte als eine Fläche gezeichnet werden."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* auf einem Punkt. Sollte in einer Relation verwendet werden."
+msgid "{0} on a node. Should be used in a relation"
+msgstr "{0} auf einem Punkt. Sollte in einer Relation verwendet werden"
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} auf einer Linie. Sollte auf einem Punkt verwendet werden."
@@ -26774,11 +26833,9 @@ msgstr "Temporärer Straßentyp"
 msgid "{0} used with {1}"
 msgstr "{0} zusammen mit {1}"
 
-msgid "street name contains ss"
-msgstr "Straßenname enthält ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
+"{0} ist veraltet, dafür {1} benutzen. Siehe auch ähnliche Merkmale wie {2}"
 
 msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
@@ -26874,6 +26931,12 @@ msgstr "unbekannte islamische Konfession"
 msgid "unknown jewish denomination"
 msgstr "unbekannte jüdische Konfession"
 
+msgid "street name contains ss"
+msgstr "Straßenname enthält ss"
+
+msgid "street name contains ß"
+msgstr "Straßenname enthält ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} ist unnötig"
 
diff --git a/i18n/po/de_DE.po b/i18n/po/de_DE.po
index c6a00cb..25b31cd 100644
--- a/i18n/po/de_DE.po
+++ b/i18n/po/de_DE.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-07-10 12:32+0000\n"
 "Last-Translator: ralekuja <Unknown>\n"
 "Language-Team: German (Germany) <de_DE at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:24+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:22+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2029,6 +2029,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2053,12 +2059,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2493,6 +2493,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2561,6 +2564,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4145,29 +4151,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10801,7 +10809,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10816,15 +10824,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14920,6 +14936,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15682,6 +15704,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23395,6 +23420,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23745,6 +23773,9 @@ msgstr ""
 msgid "Country code"
 msgstr "Ländercode"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24545,7 +24576,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24641,9 +24672,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24731,6 +24759,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/el.po b/i18n/po/el.po
index 989f5db..9aa8189 100644
--- a/i18n/po/el.po
+++ b/i18n/po/el.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-01-25 09:17+0000\n"
 "Last-Translator: Aggelos Arnaoutis <angelosarn at hotmail.com>\n"
 "Language-Team: Greek <el at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:51+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:51+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: el\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2160,6 +2160,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Τέλος σχεδιασμού."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2184,12 +2190,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2637,6 +2637,9 @@ msgstr ""
 msgid "objects"
 msgstr "αντικείμενα"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "όλες τις διαδρομές"
 
@@ -2705,6 +2708,9 @@ msgstr "όλα τα επιλεγμένα αντικείμενα"
 msgid "all incomplete objects"
 msgstr "όλα τα ημιτελή αντικείμενα"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "σχετικά αντικείμενα"
 
@@ -4322,29 +4328,31 @@ msgstr "Ο τύπος της σχέσης είναι αγνωστος"
 msgid "Relation is empty"
 msgstr "Η σχέση είναι άδεια"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<κενό>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -11123,7 +11131,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Ημερομηνία ίχνους"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11138,15 +11146,23 @@ msgstr "Ποδήλατο"
 msgid "Foot"
 msgstr "Πεζοί"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Άλσος"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15301,6 +15317,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16063,6 +16085,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23779,6 +23804,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Άλσος"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24129,6 +24157,9 @@ msgstr "Ταχυδρομικός Κώδικας"
 msgid "Country code"
 msgstr "Κωδικός χώρας"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Όνομα Σπιτιού"
 
@@ -24929,7 +24960,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25025,9 +25056,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25115,6 +25143,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/en_AU.po b/i18n/po/en_AU.po
index 4596bb0..d6db320 100644
--- a/i18n/po/en_AU.po
+++ b/i18n/po/en_AU.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-06-08 12:52+0000\n"
 "Last-Translator: Mark Pulley <mrpulley at lizzy.com.au>\n"
 "Language-Team: English (Australia) <en_AU at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:22+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:21+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2152,6 +2152,12 @@ msgstr "Angle snapping active."
 msgid "Finish drawing."
 msgstr "Finish drawing."
 
+msgid "Angle snapping"
+msgstr "Angle snapping"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Switch angle snapping mode while drawing"
+
 msgid "Toggle snapping by {0}"
 msgstr "Toggle snapping by {0}"
 
@@ -2176,12 +2182,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Angle snapping"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Switch angle snapping mode while drawing"
-
 msgid "Dual alignment"
 msgstr "Dual alignment"
 
@@ -2654,6 +2654,9 @@ msgstr "use parenthesis to group expressions"
 msgid "objects"
 msgstr "objects"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "all ways"
 
@@ -2724,6 +2727,9 @@ msgstr "all selected objects"
 msgid "all incomplete objects"
 msgstr "all incomplete objects"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "related objects"
 
@@ -4410,31 +4416,32 @@ msgstr "Relation type is unknown"
 msgid "Relation is empty"
 msgstr "Relation is empty"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
 
 msgid "<empty>"
 msgstr "<empty>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Role {0} missing"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Self-intersecting ways"
@@ -11563,7 +11570,7 @@ msgstr "Dilution of Position (red = high, green = low, if available)"
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11578,15 +11585,23 @@ msgstr "Bicycle"
 msgid "Foot"
 msgstr "Foot"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Wood"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15852,6 +15867,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16614,6 +16635,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24357,6 +24381,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Wood"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24707,6 +24734,9 @@ msgstr "Post code"
 msgid "Country code"
 msgstr "Country code"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "House name"
 
@@ -25507,7 +25537,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25603,9 +25633,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25693,6 +25720,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/en_CA.po b/i18n/po/en_CA.po
index 5e14235..51d4148 100644
--- a/i18n/po/en_CA.po
+++ b/i18n/po/en_CA.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2010-09-24 17:25+0000\n"
 "Last-Translator: Johann Beda <Unknown>\n"
 "Language-Team: English (Canada) <en_CA at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:24+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:23+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2026,6 +2026,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2050,12 +2056,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2490,6 +2490,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2558,6 +2561,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4142,29 +4148,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10798,7 +10806,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10813,15 +10821,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14914,6 +14930,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15676,6 +15698,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23389,6 +23414,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23739,6 +23767,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24539,7 +24570,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24635,9 +24666,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24725,6 +24753,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/en_GB.po b/i18n/po/en_GB.po
index 874bb76..61f5223 100644
--- a/i18n/po/en_GB.po
+++ b/i18n/po/en_GB.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: JOSM\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-11-01 11:03+0000\n"
 "Last-Translator: Andi Chandler <Unknown>\n"
 "Language-Team: German <josm-dev at openstreetmap.org>\n"
@@ -18,8 +18,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:21+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:20+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: de\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2155,6 +2155,12 @@ msgstr "Angle snapping active."
 msgid "Finish drawing."
 msgstr "Finish drawing."
 
+msgid "Angle snapping"
+msgstr "Angle snapping"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Switch angle snapping mode while drawing"
+
 msgid "Toggle snapping by {0}"
 msgstr "Toggle snapping by {0}"
 
@@ -2179,12 +2185,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Angle snapping"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Switch angle snapping mode while drawing"
-
 msgid "Dual alignment"
 msgstr "Dual alignment"
 
@@ -2661,6 +2661,9 @@ msgstr "use parenthesis to group expressions"
 msgid "objects"
 msgstr "objects"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "all ways"
 
@@ -2731,6 +2734,9 @@ msgstr "all selected objects"
 msgid "all incomplete objects"
 msgstr "all incomplete objects"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "related objects"
 
@@ -4424,31 +4430,32 @@ msgstr "Relation type is unknown"
 msgid "Relation is empty"
 msgstr "Relation is empty"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
 
 msgid "<empty>"
 msgstr "<empty>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Role {0} missing"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Self-intersecting ways"
@@ -11624,7 +11631,7 @@ msgstr "Dilution of Position (red = high, green = low, if available)"
 msgid "Track date"
 msgstr "Track date"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11639,15 +11646,23 @@ msgstr "Bicycle"
 msgid "Foot"
 msgstr "Foot"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Wood"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16169,6 +16184,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -16933,6 +16954,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24798,6 +24822,9 @@ msgstr "Tree Row"
 msgid "A line of trees."
 msgstr "A line of trees."
 
+msgid "Wood"
+msgstr "Wood"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Woodland where timber production does not dominate use."
 
@@ -25162,6 +25189,9 @@ msgstr "Post code"
 msgid "Country code"
 msgstr "Country code"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "House name"
 
@@ -25985,8 +26015,8 @@ msgstr "{0} on a node. Should be used on a way."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} on a node. Should be drawn as an area."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} on a way. Should be used on a node."
@@ -26085,9 +26115,6 @@ msgstr "temporary highway type"
 msgid "{0} used with {1}"
 msgstr "{0} used with {1}"
 
-msgid "street name contains ss"
-msgstr "street name contains ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26181,6 +26208,12 @@ msgstr "unknown muslim denomination"
 msgid "unknown jewish denomination"
 msgstr "unknown jewish denomination"
 
+msgid "street name contains ss"
+msgstr "street name contains ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} is unnecessary"
 
diff --git a/i18n/po/eo.po b/i18n/po/eo.po
index 614f75e..ce30cd5 100644
--- a/i18n/po/eo.po
+++ b/i18n/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-09-21 04:23+0000\n"
 "Last-Translator: Yuri Tretyakov <Unknown>\n"
 "Language-Team: Esperanto <eo at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:45+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:45+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: eo\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2027,6 +2027,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2051,12 +2057,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2491,6 +2491,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2559,6 +2562,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4143,29 +4149,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10799,7 +10807,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10814,15 +10822,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14919,6 +14935,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15681,6 +15703,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23394,6 +23419,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23744,6 +23772,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Domo nomo"
 
@@ -24544,7 +24575,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24640,9 +24671,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24730,6 +24758,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/es.po b/i18n/po/es.po
index 50f14af..4e90e7f 100644
--- a/i18n/po/es.po
+++ b/i18n/po/es.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-12-26 10:03+0000\n"
-"Last-Translator: Emilio Gomez Fernandez <Unknown>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-26 21:21+0000\n"
+"Last-Translator: mor <Unknown>\n"
 "Language-Team: Spanish <es at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:13+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:13+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: es\n"
 "X-Language: es_ES\n"
 "X-Source-Language: C\n"
@@ -2200,6 +2200,12 @@ msgstr "Autoensamblado de ángulos activo."
 msgid "Finish drawing."
 msgstr "Finalizar dibujo."
 
+msgid "Angle snapping"
+msgstr "Autoensamblado de ángulos"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Conmutar el modo de ajuste de ángulo mientras se dibuja"
+
 msgid "Toggle snapping by {0}"
 msgstr "Activar/Desactivar instantanea de {0}"
 
@@ -2224,12 +2230,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Autoensamblado de ángulos"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Conmutar el modo de ajuste de ángulo mientras se dibuja"
-
 msgid "Dual alignment"
 msgstr "Alineamiento dual"
 
@@ -2718,6 +2718,9 @@ msgstr "usar paréntesis para agrupar expresiones"
 msgid "objects"
 msgstr "objetos"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "todas las vías"
 
@@ -2790,6 +2793,9 @@ msgstr "todos los objetos seleccionados"
 msgid "all incomplete objects"
 msgstr "todos los objetos incompletos"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "Objetos relacionados"
 
@@ -4551,33 +4557,32 @@ msgstr "Tipo de relación desconocido"
 msgid "Relation is empty"
 msgstr "La relación está vacía"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
-"La función del miembro no concuerda con la expresión {0} en la planilla {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"El tipo de función de miembro {0} no coincide con la lista aceptada de {1} "
-"en la plantilla {2}"
 
 msgid "<empty>"
 msgstr "<vacío>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Función {0} desconocida en plantillas {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Se encontró un tipo de función vacío cuando se esperaba uno de {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Falta la función {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} es una cantidad de roles muy baja ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} es una cantidad de roles muy alta ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Vías que se interseccionan ellas mismas"
@@ -5137,7 +5142,7 @@ msgid "options provided as Java system properties"
 msgstr "opciones proporcionadas como propiedades de sistema Java"
 
 msgid "Change the JOSM directory name"
-msgstr ""
+msgstr "Cambia el nombre del directorio JOSM"
 
 msgid "/PATH/TO/JOSM/PREF    "
 msgstr "/PATH/TO/JOSM/PREF    "
@@ -5146,7 +5151,7 @@ msgid "Set the preferences directory"
 msgstr "Fija el directorio de preferencias"
 
 msgid "Default: {0}"
-msgstr ""
+msgstr "Predeterminado: {0}"
 
 msgid "/PATH/TO/JOSM/USERDATA"
 msgstr "/PATH/TO/JOSM/USERDATA"
@@ -9025,7 +9030,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Editor"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -12017,7 +12022,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Fecha de la traza"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -12032,15 +12037,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "A pie"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bosque natural"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -12171,7 +12184,7 @@ msgstr ""
 "medias."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Selecciona el esquema de color para el mapa de calor"
 
 msgid "Track and Point Coloring"
 msgstr "Coloreado de traza y punto"
@@ -13501,7 +13514,7 @@ msgid "Checks for errors on relations"
 msgstr "Verifica que no haya errores en las relaciones"
 
 msgid "Territories"
-msgstr ""
+msgstr "Territorios"
 
 msgid "Checks for territories-specific features"
 msgstr ""
@@ -16459,7 +16472,7 @@ msgid "OpenStreetMap Carto (Standard)"
 msgstr ""
 
 msgid "OpenStreetMap (Standard Black & White)"
-msgstr ""
+msgstr "OpenStreetMap (Blanco y Negro Estandar)"
 
 msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, sin etiquetas)"
@@ -16561,7 +16574,7 @@ msgid "imagico.de OSM images for mapping: Elephant Island/Clarence Island"
 msgstr ""
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN Argentina (TMS)"
 
 msgid "IGN Argentina (WMS)"
 msgstr "IGN Argentina (WMS)"
@@ -16621,7 +16634,7 @@ msgid "Tiris: DOM (Surface model)"
 msgstr "Tiris: DOM (modelo de superficie)"
 
 msgid "Tiris: contour lines"
-msgstr ""
+msgstr "Tiris: líneas de contorno"
 
 msgid "Vienna: Mehrzweckkarte (general purpose)"
 msgstr "Viena: Mehrzweckkarte (propósito general)"
@@ -16693,7 +16706,7 @@ msgid "TEC bus lines (2014)"
 msgstr "Líneas de transporte urbano TEC (2014)"
 
 msgid "TEC bus stops (2014)"
-msgstr ""
+msgstr "TEC paradas de bus (2014)"
 
 msgid "Benin: Cotonou Pleiade 2016"
 msgstr ""
@@ -16719,6 +16732,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Hidrografía Geobase"
 
@@ -17038,7 +17057,7 @@ msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr "Línea costera del Danubio en Budapestt, Szentendre y Szigetmonostor"
 
 msgid "Budapest district XI ortophoto 2015"
-msgstr ""
+msgstr "Budapest districto XI ortofotos 2015"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
 msgstr "OpenStreetMap Hungría (rutas de senderismo)"
@@ -17368,7 +17387,7 @@ msgid "RABA-KGZ: Slovenia built-up areas"
 msgstr "RABA-KGZ: Eslovenia - Área urbanizada"
 
 msgid "City of Cape Town 2013 Aerial"
-msgstr ""
+msgstr "Ciudad del Cabo aérea 2013"
 
 msgid "City of Cape Town 2015 Aerial"
 msgstr "Ciudad de Cabo 2015 Aérea"
@@ -17485,6 +17504,9 @@ msgstr "Fiez Ortofoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -21374,7 +21396,7 @@ msgid "TÜV"
 msgstr "TÜV"
 
 msgid "Clothes"
-msgstr "Ropas"
+msgstr "Ropa"
 
 msgid "anchors"
 msgstr "amarres"
@@ -21677,10 +21699,10 @@ msgid "Guest House/Bed & Breakfast"
 msgstr "Pensión / Cama y desayuno"
 
 msgid "Apartment"
-msgstr ""
+msgstr "Apartamento"
 
 msgid "Number of apartments"
-msgstr ""
+msgstr "Número de apartamentos"
 
 msgid "Chalet"
 msgstr "Cabaña o bungalow"
@@ -21749,22 +21771,22 @@ msgid "Takeaway"
 msgstr "Comida para llevar"
 
 msgid "Delivery"
-msgstr ""
+msgstr "Entrega"
 
 msgid "Mo-Su 12:00-22:00"
-msgstr ""
+msgstr "Lu-Do 12:00-22:00"
 
 msgid "Fast Food"
 msgstr "Establecimiento de comida rápida"
 
 msgid "Food Court"
-msgstr "Comida y Bebidas"
+msgstr "Zona de restaurantes (plaza de comidas)"
 
 msgid "Cafe"
 msgstr "Cafetería"
 
 msgid "Ice cream"
-msgstr "Helado"
+msgstr "Heladería"
 
 msgid "Pub"
 msgstr "Pub"
@@ -21983,7 +22005,7 @@ msgid "charcoal"
 msgstr "Carbón vegetal"
 
 msgid "Firepit"
-msgstr "hoguera"
+msgstr "Lugar para fogatas"
 
 msgid "Fishing"
 msgstr "Pesca"
@@ -22713,7 +22735,7 @@ msgid "Water Point"
 msgstr "Punto de agua"
 
 msgid "Animal watering place"
-msgstr ""
+msgstr "Abrevadero"
 
 msgid "Compressed Air"
 msgstr "Aire comprimido"
@@ -22864,7 +22886,7 @@ msgid "Track and Field Athletics"
 msgstr "Competencias de pista y campo (Track&Field)"
 
 msgid "Running"
-msgstr "Corriendo"
+msgstr "Carreras"
 
 msgid "Climbing"
 msgstr "Alpinismo"
@@ -23307,7 +23329,7 @@ msgstr "cabaña"
 
 msgctxt "building"
 msgid "bungalow"
-msgstr ""
+msgstr "bungalow"
 
 msgctxt "building"
 msgid "dormitory"
@@ -23541,7 +23563,7 @@ msgid "Water Tower"
 msgstr "Torre de agua"
 
 msgid "Water Works"
-msgstr "Obras hidráulicas"
+msgstr "Depuradora"
 
 msgid "Wastewater Treatment Plant"
 msgstr "Planta de tratamiento de aguas residuales"
@@ -24606,7 +24628,7 @@ msgid "Seafood"
 msgstr "Pescadería o marisquería"
 
 msgid "Dairy"
-msgstr ""
+msgstr "Lechería"
 
 msgid "Deli (Fine Food)"
 msgstr "Delicatessen"
@@ -24843,13 +24865,13 @@ msgid "Variety Store"
 msgstr "Tienda de variedades o bazar"
 
 msgid "Bookmaker"
-msgstr "Encuadernador"
+msgstr "Corredor de apuestas"
 
 msgid "Lottery"
 msgstr "Lotería"
 
 msgid "Bag"
-msgstr "Cartera"
+msgstr "Bolsos"
 
 msgid "Pet"
 msgstr "Mascota"
@@ -25064,7 +25086,7 @@ msgstr "Institución educativa"
 
 msgctxt "office"
 msgid "Employment agency"
-msgstr "Agencia de empleos"
+msgstr "Agencia de empleo"
 
 msgctxt "office"
 msgid "Estate agent"
@@ -25430,6 +25452,9 @@ msgstr "Fila de árboles"
 msgid "A line of trees."
 msgstr "Una hilera de árboles."
 
+msgid "Wood"
+msgstr "Bosque natural"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Área forestada donde la producción de leña no domina el uso."
 
@@ -25800,6 +25825,9 @@ msgstr "Código postal"
 msgid "Country code"
 msgstr "Código del país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nombre del edificio"
 
@@ -26625,7 +26653,7 @@ msgid "misspelled value"
 msgstr ""
 
 msgid "wrong value: {0}"
-msgstr ""
+msgstr "valor incorrecto: {0}"
 
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} sobre un nodo. Debería ser utilizado sobre una vía."
@@ -26633,8 +26661,8 @@ msgstr "{0} sobre un nodo. Debería ser utilizado sobre una vía."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} sobre un nodo. Debería ser dibujado como un área."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* sobre un nodo. Debería ser utilizado en una relación"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} sobre una vía. Debería ser utilizado en un nodo."
@@ -26733,9 +26761,6 @@ msgstr "tipo de carretera de uso temporal"
 msgid "{0} used with {1}"
 msgstr "{0} se utiliza con {1}"
 
-msgid "street name contains ss"
-msgstr "nombre de calle contiene ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26832,6 +26857,12 @@ msgstr "denominación musulmana desconocida"
 msgid "unknown jewish denomination"
 msgstr "denominación judía desconocida"
 
+msgid "street name contains ss"
+msgstr "nombre de calle contiene ss"
+
+msgid "street name contains ß"
+msgstr "el nombre de la calle contiene ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} no es necesario"
 
@@ -33985,6 +34016,8 @@ msgstr "Marcar seleccionados"
 
 msgid "Mark the selected items (on the map) as done in the todo list."
 msgstr ""
+"Marcar como hechos en la lista de cosas por hacer los elementos "
+"seleccionados (en el mapa)."
 
 msgid "Mark the selected item in the todo list as done. (])."
 msgstr ""
@@ -34505,7 +34538,7 @@ msgid "Turn Lanes Editor"
 msgstr "Editor de carriles de viraje"
 
 msgid " The number of lanes has fixed according number of turns"
-msgstr ""
+msgstr " El número de carriles se ha corregido acorde al número de giros"
 
 msgid " The number of lanes:forward has fixed according number of turns"
 msgstr ""
@@ -34532,10 +34565,10 @@ msgid "Build bidirectional road"
 msgstr "Construir una carretera de dos direcciones"
 
 msgid "Use \"none\""
-msgstr ""
+msgstr "Usar \"ninguno\""
 
 msgid "use \"none\" instead of empty values"
-msgstr ""
+msgstr "Usar \"ninguno\" en lugar de valores vacíos"
 
 msgid "Preset turn lanes"
 msgstr "Carriles de viraje preestablecidos"
diff --git a/i18n/po/et.po b/i18n/po/et.po
index 2719a98..477739d 100644
--- a/i18n/po/et.po
+++ b/i18n/po/et.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-01-02 11:25+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-08 15:16+0000\n"
 "Last-Translator: AivoK <aivo.kuhlberg at hot.ee>\n"
 "Language-Team: Estonian <et at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:45+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:46+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: et\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -485,7 +485,7 @@ msgid "Download notes in current view"
 msgstr ""
 
 msgid "Download in current view"
-msgstr ""
+msgstr "Laadi alla aktiivses vaates"
 
 msgid "Download map data from the OSM server in current view"
 msgstr ""
@@ -1095,7 +1095,7 @@ msgid "Paste contents of clipboard."
 msgstr ""
 
 msgid "Paste at source position"
-msgstr ""
+msgstr "Kleebi lähteasukohta"
 
 msgid "Paste contents of clipboard at the position they were copied from."
 msgstr ""
@@ -2080,6 +2080,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Lõpeta joonistamine."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2104,12 +2110,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2557,6 +2557,9 @@ msgstr "kasuta sulgusid avaldiste grupeerimiseks"
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2625,6 +2628,9 @@ msgstr "kõik valitud objektid"
 msgid "all incomplete objects"
 msgstr "kõik lõpetamata objektid"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "seotud objektid"
 
@@ -4225,29 +4231,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -4942,7 +4950,7 @@ msgstr ""
 
 msgctxt "menu"
 msgid "Edit"
-msgstr ""
+msgstr "Muuda"
 
 msgctxt "menu"
 msgid "View"
@@ -10966,7 +10974,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10981,15 +10989,23 @@ msgstr "Jalgratas"
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Mets"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15151,6 +15167,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15913,6 +15935,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23635,6 +23660,9 @@ msgstr "Puuderivi"
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Mets"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23985,6 +24013,9 @@ msgstr "Sihtnumber"
 msgid "Country code"
 msgstr "Riigi kood"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Maja nimi"
 
@@ -24785,7 +24816,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24881,9 +24912,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24971,6 +24999,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/eu.po b/i18n/po/eu.po
index d7b5924..e1e5949 100644
--- a/i18n/po/eu.po
+++ b/i18n/po/eu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-03-09 16:55+0000\n"
 "Last-Translator: Asier Sarasua Garmendia <Unknown>\n"
 "Language-Team: Basque <eu at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:38+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:38+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: eu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2101,6 +2101,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Marrazketa amaitu."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2125,12 +2131,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2574,6 +2574,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2642,6 +2645,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4274,29 +4280,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10984,7 +10992,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10999,15 +11007,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Basoa"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15106,6 +15122,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15868,6 +15890,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23621,6 +23646,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Basoa"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23971,6 +23999,9 @@ msgstr "Posta-kodea"
 msgid "Country code"
 msgstr "Estatuaren kodea"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Eraikinaren izena"
 
@@ -24771,7 +24802,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24867,9 +24898,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24957,6 +24985,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/fa.po b/i18n/po/fa.po
index defdfc4..bed7059 100644
--- a/i18n/po/fa.po
+++ b/i18n/po/fa.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2014-03-18 07:32+0000\n"
 "Last-Translator: Saeed Ghazi Joolaee <Unknown>\n"
 "Language-Team: Persian <fa at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:07+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:06+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: fa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2085,6 +2085,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2109,12 +2115,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2549,6 +2549,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2617,6 +2620,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4199,29 +4205,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10865,7 +10873,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10880,15 +10888,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14981,6 +14997,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15743,6 +15765,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23456,6 +23481,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23806,6 +23834,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24606,7 +24637,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24702,9 +24733,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24792,6 +24820,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/fi.po b/i18n/po/fi.po
index 7b06ac5..30107c4 100644
--- a/i18n/po/fi.po
+++ b/i18n/po/fi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-01-19 17:11+0000\n"
 "Last-Translator: Lauri Kytömaa <Unknown>\n"
 "Language-Team: Finnish <fi at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:47+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:47+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: fi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2166,6 +2166,14 @@ msgstr "Kulman askellus käytössä."
 msgid "Finish drawing."
 msgstr "Lopeta piirtäminen."
 
+msgid "Angle snapping"
+msgstr "Piirtokulman askellus"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+"Kulmien askellus pakottaa seuraavan janan tiettyihin kulmiin edelliseen "
+"janaan nähden."
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2190,14 +2198,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "PAKOTA"
 
-msgid "Angle snapping"
-msgstr "Piirtokulman askellus"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-"Kulmien askellus pakottaa seuraavan janan tiettyihin kulmiin edelliseen "
-"janaan nähden."
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2669,6 +2669,9 @@ msgstr "käytä kaarisulkuja ryhmittääksesi hakulauseita"
 msgid "objects"
 msgstr "objektit"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "kaikki polut"
 
@@ -2737,6 +2740,9 @@ msgstr "kaikki valitut kohteet"
 msgid "all incomplete objects"
 msgstr "kaikki keskeneräiset kohteet"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "emo- ja lapsikohteet"
 
@@ -4417,30 +4423,32 @@ msgstr "Tarkistin ei tunne relaation type-tagia"
 msgid "Relation is empty"
 msgstr "Relaatiossa ei ole jäseniä"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<tyhjä>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Ei yhtään jäsentä roolissa {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Roolissa {0} on liian vähän relaatiojäseniä ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Roolissa {0} on liikaa relaatiojäseniä ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Polussa risteys itsensä kanssa."
@@ -11461,7 +11469,7 @@ msgstr "Paikannuksen tarkkuus (punainen = huono, vihreä = hyvä)"
 msgid "Track date"
 msgstr "Aikaleima"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11476,15 +11484,23 @@ msgstr "Polkupyörä"
 msgid "Foot"
 msgstr "Jalankulku (foot)"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Metsä"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15773,6 +15789,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16535,6 +16557,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24288,6 +24313,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Metsä"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24638,6 +24666,9 @@ msgstr "Postinumero"
 msgid "Country code"
 msgstr "Maakoodi"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Talon nimi"
 
@@ -25447,7 +25478,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25543,9 +25574,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25637,6 +25665,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} on tarpeeton"
 
diff --git a/i18n/po/fil.po b/i18n/po/fil.po
index f4169af..9778cb0 100644
--- a/i18n/po/fil.po
+++ b/i18n/po/fil.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-06-19 14:15+0000\n"
 "Last-Translator: Anthony Balico <Unknown>\n"
 "Language-Team: Filipino <fil at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:25+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:23+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: fil\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/fo.po b/i18n/po/fo.po
index 4595ae7..d2eef26 100644
--- a/i18n/po/fo.po
+++ b/i18n/po/fo.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-02-28 16:15+0000\n"
 "Last-Translator: LiFo <Unknown>\n"
 "Language-Team: Faroese <fo at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:46+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:46+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}: valmøguleiki ''{1}'' er tvítýddur"
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/fr.po b/i18n/po/fr.po
index fd4c511..8533428 100644
--- a/i18n/po/fr.po
+++ b/i18n/po/fr.po
@@ -5,16 +5,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: fr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-12-31 14:28+0000\n"
-"Last-Translator: Don-vip <Unknown>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-27 08:23+0000\n"
+"Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: Fr <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:48+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:48+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: fr\n"
 "X-Poedit-Bookmarks: 1767,-1,-1,2669,-1,-1,-1,-1,-1,-1\n"
 
@@ -2193,6 +2193,12 @@ msgstr "Discrétisation des angles active."
 msgid "Finish drawing."
 msgstr "Terminer le chemin."
 
+msgid "Angle snapping"
+msgstr "Discrétisation des angles"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Activer/Désactiver la discrétisation des angles"
+
 msgid "Toggle snapping by {0}"
 msgstr "Activer/Désactiver la discrétisation avec {0}"
 
@@ -2217,12 +2223,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "Correctif"
 
-msgid "Angle snapping"
-msgstr "Discrétisation des angles"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Activer/Désactiver la discrétisation des angles"
-
 msgid "Dual alignment"
 msgstr "Double alignement"
 
@@ -2705,6 +2705,9 @@ msgstr "utiliser des parenthèses pour grouper des expressions"
 msgid "objects"
 msgstr "objets"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "tous les chemins"
 
@@ -2777,6 +2780,9 @@ msgstr "tous les objets sélectionnés"
 msgid "all incomplete objects"
 msgstr "tous les objets incomplets"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objets concernés"
 
@@ -3572,7 +3578,7 @@ msgstr ""
 "La projection ''{0}'' est introuvable, le signet ''{1}'' n’est pas utilisable"
 
 msgid "HTTP error {0} when loading tiles"
-msgstr "Erreur HTTTP {0} lors du chargement des tuiles"
+msgstr "Erreur HTTP {0} lors du chargement des tuiles"
 
 msgid "Error downloading tiles: {0}"
 msgstr "Erreur lors du téléchargement des tuiles : {0}"
@@ -4528,32 +4534,32 @@ msgstr "Le type de relation est inconnu"
 msgid "Relation is empty"
 msgstr "La relation est vide"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Le rôle du membre ne satisfait pas la condition {0} du modèle {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Le type de rôle du membre {0} ne fait pas partie de la liste de {1} du "
-"modèle {2}"
 
 msgid "<empty>"
 msgstr "<vide>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Le rôle {0} est inconnu parmi les modèles {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Role vide. Une des valeurs suivantes est attendue : {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Le rôle {0} manque"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Nombre de rôles {0} trop bas ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Nombre de rôles {0} trop élevé ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Chemins se coupant sur eux-mêmes"
@@ -8934,7 +8940,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Éditeur"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -11911,7 +11917,7 @@ msgstr ""
 msgid "Track date"
 msgstr "La date"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11926,15 +11932,23 @@ msgstr "Vélos"
 msgid "Foot"
 msgstr "Piétons"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bois"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -12690,7 +12704,7 @@ msgid "Load plugins from a list of plugins"
 msgstr "Téléchargement des plugins depuis une liste de plugins"
 
 msgid "Disable all other plugins"
-msgstr ""
+msgstr "Désactiver tous les autres greffons"
 
 msgid "Enter a list of plugins you want to download."
 msgstr "Entrez une liste de plugins que vous voulez télécharger."
@@ -13803,7 +13817,7 @@ msgstr ""
 "dans lʼarchive ZIP ''{0}''. Lʼexception était: {1}"
 
 msgid "The requested URL {0} was not found"
-msgstr ""
+msgstr "L''URL demandée {0} n''a pas été trouvée"
 
 msgid "Failed to rename file {0} to {1}."
 msgstr "Impossible de renommer le fichier de {0} à {1}."
@@ -15551,7 +15565,7 @@ msgstr ""
 "<html>Le serveur rapporte un conflit.<br>Message d’erreur :<br>{0}</html>"
 
 msgid "<html>The server reported that it has detected a conflict."
-msgstr "<html>Le serveur a signalé qu’il a détecté un conflit."
+msgstr ""
 
 msgid ""
 "<html>Failed to upload to changeset <strong>{0}</strong><br>because it has "
@@ -15943,7 +15957,7 @@ msgid "Report Bug"
 msgstr "Rapporter l’erreur"
 
 msgid "Suppress this error for this session."
-msgstr ""
+msgstr "Supprimer cette erreur pour cette session."
 
 msgid "Suppress further error dialogs for this session."
 msgstr "Masquer les prochaines fenêtres d’erreur pour cette session."
@@ -15982,6 +15996,8 @@ msgstr "JOSM est à jour."
 
 msgid "JOSM is out of date. The current version is {0}. Try updating JOSM."
 msgstr ""
+"JOSM n''est pas  jour. La version actuelle est {0}. Essayez de mettre à jour "
+"JOSM."
 
 msgid ""
 "Before you file a bug report make sure you have updated to the latest "
@@ -16455,7 +16471,7 @@ msgid "imagico.de OSM images for mapping: Elephant Island/Clarence Island"
 msgstr ""
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN Argentine (TMS)"
 
 msgid "IGN Argentina (WMS)"
 msgstr "IGN Argentina (WMS)"
@@ -16587,7 +16603,7 @@ msgid "TEC bus lines (2014)"
 msgstr "Lignes du réseau TEC (2014)"
 
 msgid "TEC bus stops (2014)"
-msgstr ""
+msgstr "Poteaux d''arrêt du réseau TEC (2014) (Peu précis)"
 
 msgid "Benin: Cotonou Pleiade 2016"
 msgstr "Benin : Cotonou Pleiade 2016"
@@ -16613,6 +16629,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Hydrographie Geobase"
 
@@ -17379,6 +17401,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -19857,19 +19882,19 @@ msgid "grade3"
 msgstr "catégorie 3"
 
 msgid "Even mixture of hard and soft materials"
-msgstr ""
+msgstr "Surface mixte de matériaux durs et mous"
 
 msgid "grade4"
 msgstr "catégorie 4"
 
 msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
-msgstr ""
+msgstr "Généralement mou : terre/sable/herbe mélangé avec des matériaux durs"
 
 msgid "grade5"
 msgstr "catégorie 5"
 
 msgid "Soft: soil/sand/grass"
-msgstr ""
+msgstr "Mou : terre/sable/herbe"
 
 msgid "MTB Scale"
 msgstr "Niveau de difficulté VTT"
@@ -21618,7 +21643,7 @@ msgid "Delivery"
 msgstr "Livraison"
 
 msgid "Mo-Su 12:00-22:00"
-msgstr ""
+msgstr "Mo-Su 12:00-22:00"
 
 msgid "Fast Food"
 msgstr "Fast-food"
@@ -24477,7 +24502,7 @@ msgid "Seafood"
 msgstr "Poissonnerie"
 
 msgid "Dairy"
-msgstr ""
+msgstr "Laiterie"
 
 msgid "Deli (Fine Food)"
 msgstr "Épicerie fine"
@@ -25296,6 +25321,9 @@ msgstr "Rangée d''arbres"
 msgid "A line of trees."
 msgstr "Une ligne d’arbres."
 
+msgid "Wood"
+msgstr "Bois"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Zone boisée où l’exploitation forestière n’est pas prédominante."
 
@@ -25660,6 +25688,9 @@ msgstr "Code postal"
 msgid "Country code"
 msgstr "Indicatif du pays"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nom"
 
@@ -26485,8 +26516,8 @@ msgstr "{0} sur un nœud. Devrait être employé sur un chemin."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} sur un nœud. Devrait former une aire."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* sur un nœud. Devrait être employé dans une relation"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} sur un chemin. Devrait être employé sur un nœud."
@@ -26584,9 +26615,6 @@ msgstr "type de route temporaire"
 msgid "{0} used with {1}"
 msgstr "{0} utilisé avec {1}"
 
-msgid "street name contains ss"
-msgstr "le nom de rue contient ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26684,6 +26712,12 @@ msgstr "dénomination musulmane inconnue"
 msgid "unknown jewish denomination"
 msgstr "dénomination juive inconnue"
 
+msgid "street name contains ss"
+msgstr "le nom de rue contient ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} n’est pas nécessaire"
 
diff --git a/i18n/po/ga.po b/i18n/po/ga.po
index 6a5c4f9..28c0f35 100644
--- a/i18n/po/ga.po
+++ b/i18n/po/ga.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-05-17 11:43+0000\n"
 "Last-Translator: Thorsten <Unknown>\n"
 "Language-Team: Irish <ga at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:50+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:50+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/gl.po b/i18n/po/gl.po
index f7797e0..a7afeb8 100644
--- a/i18n/po/gl.po
+++ b/i18n/po/gl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-01-01 15:11+0000\n"
 "Last-Translator: Marcos Lans <Unknown>\n"
 "Language-Team: Galician <proxecto at trasno.net>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:51+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:51+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: gl\n"
 "X-Poedit-Language: Galician\n"
 
@@ -2167,6 +2167,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Rematar debuxo."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2191,12 +2197,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2640,6 +2640,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2708,6 +2711,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4343,29 +4349,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr "A relación esta baldeira"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<empty>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Número de {0} roles demasiado baixos ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -11209,7 +11217,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11224,15 +11232,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "Pé"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Madeira"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15430,6 +15446,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16192,6 +16214,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23938,6 +23963,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Madeira"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24288,6 +24316,9 @@ msgstr "Código postal"
 msgid "Country code"
 msgstr "Código do país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nome da casa"
 
@@ -25088,7 +25119,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25184,9 +25215,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25274,6 +25302,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/he.po b/i18n/po/he.po
index a95ae16..b719178 100644
--- a/i18n/po/he.po
+++ b/i18n/po/he.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2013-03-30 13:38+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: Hebrew <he at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:53+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:52+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: he\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2026,6 +2026,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "הפסק לצייר."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2050,12 +2056,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2492,6 +2492,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2560,6 +2563,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4151,29 +4157,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10829,7 +10837,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10844,15 +10852,23 @@ msgstr "אופניים"
 msgid "Foot"
 msgstr "רגל"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "חורש"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14949,6 +14965,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15711,6 +15733,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23424,6 +23449,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "חורש"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23774,6 +23802,9 @@ msgstr "מיקוד"
 msgid "Country code"
 msgstr "קוד מדינה"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "שם בית"
 
@@ -24574,7 +24605,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24670,9 +24701,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24760,6 +24788,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/hi.po b/i18n/po/hi.po
index a6ae718..4f561f7 100644
--- a/i18n/po/hi.po
+++ b/i18n/po/hi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-11-14 16:28+0000\n"
 "Last-Translator: nipunreddevil <nipunreddevil at gmail.com>\n"
 "Language-Team: Hindi <hi at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:53+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:53+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: hi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/hr.po b/i18n/po/hr.po
index 3866c01..f653ef0 100644
--- a/i18n/po/hr.po
+++ b/i18n/po/hr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-01-04 15:56+0000\n"
 "Last-Translator: gogo <trebelnik2 at gmail.com>\n"
 "Language-Team: Croatian <hr at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:12+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:11+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: hr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2102,6 +2102,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Završi crtanje."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2126,12 +2132,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2571,6 +2571,9 @@ msgstr ""
 msgid "objects"
 msgstr "objekti"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "svi putevi"
 
@@ -2639,6 +2642,9 @@ msgstr "svi selektirani objekti"
 msgid "all incomplete objects"
 msgstr "svi nedovršeni objekti"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4244,29 +4250,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10942,7 +10950,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10957,15 +10965,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15058,6 +15074,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15820,6 +15842,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23533,6 +23558,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23883,6 +23911,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24683,7 +24714,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24779,9 +24810,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24869,6 +24897,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ht.po b/i18n/po/ht.po
index 5d18d78..8119d45 100644
--- a/i18n/po/ht.po
+++ b/i18n/po/ht.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2010-03-11 21:17+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Haitian; Haitian Creole <ht at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:52+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:52+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/hu.po b/i18n/po/hu.po
index 0b8c032..86cbf13 100644
--- a/i18n/po/hu.po
+++ b/i18n/po/hu.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-10-07 10:56+0000\n"
 "Last-Translator: AndreasTUHU <poggyasz at gmail.com>\n"
 "Language-Team: Hungarian <kde-l10n-hu at kde.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:54+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:54+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: hu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2187,6 +2187,12 @@ msgstr "Igazított szög aktív"
 msgid "Finish drawing."
 msgstr "Rajzolás befejezése."
 
+msgid "Angle snapping"
+msgstr "Igazított szög"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Igazított szög mód kapcsolása rajzolás közben"
+
 msgid "Toggle snapping by {0}"
 msgstr "Illesztés váltása ezzel: {0}"
 
@@ -2211,12 +2217,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Igazított szög"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Igazított szög mód kapcsolása rajzolás közben"
-
 msgid "Dual alignment"
 msgstr "Dupla igazítás"
 
@@ -2691,6 +2691,9 @@ msgstr "használj zárójelet a kifejezések csoportosításához"
 msgid "objects"
 msgstr "objektumok"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "minden vonal"
 
@@ -2760,6 +2763,9 @@ msgstr "minden kiválasztott objektum"
 msgid "all incomplete objects"
 msgstr "minden félkész objektum"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "kapcsolódó objektumok"
 
@@ -4474,30 +4480,32 @@ msgstr "Kapcsolat típusa ismeretlen"
 msgid "Relation is empty"
 msgstr "Üres kapcsolat"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<üres>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "{0} szerep ismeretlen a(z) {1} sablonokban"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Üres szereptípus, pedig {0} közül kéne legyen valamelyik"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Hiányzó {0} szerep"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} szerepek száma túl kevés ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} szerepek száma túl sok ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Önmagát metsző vonal"
@@ -11779,7 +11787,7 @@ msgstr "Pozíció pontossága (piros=gyenge, zöld=magas, ha elérhető)"
 msgid "Track date"
 msgstr "Nyomvonal dátuma"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11794,15 +11802,23 @@ msgstr "Kerékpár"
 msgid "Foot"
 msgstr "Gyalogos"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Őserdő"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16414,6 +16430,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hidrológiai"
 
@@ -17178,6 +17200,9 @@ msgstr "Fiez Ortofotó 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -25080,6 +25105,9 @@ msgstr "Fasor"
 msgid "A line of trees."
 msgstr "Fák egyvonalban."
 
+msgid "Wood"
+msgstr "Őserdő"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Erdőség, ahol a fa előállítás nem uralja a használatot."
 
@@ -25447,6 +25475,9 @@ msgstr "Irányítószám"
 msgid "Country code"
 msgstr "Országkód"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Háznév"
 
@@ -26282,8 +26313,8 @@ msgstr "{0} egy ponton. Vonalon kellene használni."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} egy ponton. Területként kellene megrajzolni."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* egy ponton van. Egy kapcsolatban kellene használni"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} vonalon. Ponton kellene használni."
@@ -26382,9 +26413,6 @@ msgstr "ideiglenes közút típus"
 msgid "{0} used with {1}"
 msgstr "{0} együtt használva {1}-el"
 
-msgid "street name contains ss"
-msgstr "az utcanév ss-t tartalmaz"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26483,6 +26511,12 @@ msgstr "ismeretlen muszlim gyülekezet"
 msgid "unknown jewish denomination"
 msgstr "ismeretlen zsidó gyülekezet"
 
+msgid "street name contains ss"
+msgstr "az utcanév ss-t tartalmaz"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} szükségtelen"
 
diff --git a/i18n/po/hy.po b/i18n/po/hy.po
index 179d2da..15e8569 100644
--- a/i18n/po/hy.po
+++ b/i18n/po/hy.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-04-13 21:51+0000\n"
 "Last-Translator: Gev777 <Unknown>\n"
 "Language-Team: Armenian <hy at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:36+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:36+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: hy\n"
 
 msgid "Cancel"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ia.po b/i18n/po/ia.po
index 559e1b9..abc6597 100644
--- a/i18n/po/ia.po
+++ b/i18n/po/ia.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-08-29 01:02+0000\n"
 "Last-Translator: Emilio Sepulveda <Unknown>\n"
 "Language-Team: Interlingua <ia at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:55+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:55+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/id.po b/i18n/po/id.po
index 72a1a7d..6747157 100644
--- a/i18n/po/id.po
+++ b/i18n/po/id.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-03-10 03:36+0000\n"
 "Last-Translator: Ezagren <ezagren at gmail.com>\n"
 "Language-Team: Indonesian <id at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:56+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:55+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: id\n"
 "X-Language: id_ID\n"
 
@@ -2144,6 +2144,12 @@ msgstr "Angle snapping aktif"
 msgid "Finish drawing."
 msgstr "Selesai menggambar."
 
+msgid "Angle snapping"
+msgstr "Menempelkan sudut"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Tukar mode angle snapping ketika menggambar"
+
 msgid "Toggle snapping by {0}"
 msgstr "Alihkan snapping dengan {0}"
 
@@ -2169,12 +2175,6 @@ msgid "FIX"
 msgstr ""
 "Perbaiki (pe,pn) - arah garis snapping (e0,n0) - garis snapping yang asli"
 
-msgid "Angle snapping"
-msgstr "Menempelkan sudut"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Tukar mode angle snapping ketika menggambar"
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2642,6 +2642,9 @@ msgstr "Menggunakan tanda kurung untuk mengelompokkan ekspresi yang ada"
 msgid "objects"
 msgstr "Objek-objek"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "seluruh way/garis"
 
@@ -2710,6 +2713,9 @@ msgstr "semua objek yang dipilih"
 msgid "all incomplete objects"
 msgstr "Seluruh objek yang tidak lengkap"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objek tekait"
 
@@ -4376,30 +4382,32 @@ msgstr "Jenis hubungan tidak diketahui"
 msgid "Relation is empty"
 msgstr "Hubungan kosong"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<kosong>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Peran {0} menghilang"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Angka {0} perannya begitu rendah ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Angka {0} perannya begitu tinggi ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "garis self-intersecting"
@@ -11472,7 +11480,7 @@ msgstr "Dilusi dari posisi (merah = tinggi, hijau = rendah, jika tersedia)"
 msgid "Track date"
 msgstr "Tanggal track"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11487,15 +11495,23 @@ msgstr "Sepeda"
 msgid "Foot"
 msgstr "Pejalan Kaki"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Hutan"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15903,6 +15919,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16665,6 +16687,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24471,6 +24496,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Hutan"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -24821,6 +24849,9 @@ msgstr "Kode Pos"
 msgid "Country code"
 msgstr "Kode Negara"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nama Rumah"
 
@@ -25623,7 +25654,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25719,9 +25750,6 @@ msgstr "jenis jalan raya yang temporer"
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr "nama jalan berisi ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25809,6 +25837,12 @@ msgstr "golongan agama islam tidak diketahui"
 msgid "unknown jewish denomination"
 msgstr "golongan agama Yahudi tidak diketahui"
 
+msgid "street name contains ss"
+msgstr "nama jalan berisi ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/is.po b/i18n/po/is.po
index 509cbe3..82a3c18 100644
--- a/i18n/po/is.po
+++ b/i18n/po/is.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-11-06 00:32+0000\n"
 "Last-Translator: Stefán Örvar Sigmundsson <stefan.orvar.sigmundsson at emi.is>\n"
 "Language-Team: Icelandic <is at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:54+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:54+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: is\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2034,6 +2034,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2058,12 +2064,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2498,6 +2498,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2566,6 +2569,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4155,29 +4161,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10829,7 +10837,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10844,15 +10852,23 @@ msgstr "Hjól"
 msgid "Foot"
 msgstr "Fótgangandi"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Skógur"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14959,6 +14975,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15721,6 +15743,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23435,6 +23460,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Skógur"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23785,6 +23813,9 @@ msgstr "Póstnúmer"
 msgid "Country code"
 msgstr "Landskóði"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nafn húss"
 
@@ -24585,7 +24616,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24681,9 +24712,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24771,6 +24799,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/it.po b/i18n/po/it.po
index ba398f2..472619c 100644
--- a/i18n/po/it.po
+++ b/i18n/po/it.po
@@ -4,16 +4,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm 20081003\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-12-31 11:55+0000\n"
-"Last-Translator: Silvio Brera <Unknown>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-10 12:05+0000\n"
+"Last-Translator: Don-vip <Unknown>\n"
 "Language-Team: Italian <talk-it at lists.openstreetmap.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:56+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:56+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: it\n"
 "X-Language: it_IT\n"
 "X-Source-Language: en\n"
@@ -2221,6 +2221,12 @@ msgstr "Scatto angolo attivo."
 msgid "Finish drawing."
 msgstr "Termina tracciamento."
 
+msgid "Angle snapping"
+msgstr "Scatto angolo"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Commuta la modalità di scatto angolo durante il disegno"
+
 msgid "Toggle snapping by {0}"
 msgstr "Commuta scatto da {0}"
 
@@ -2245,12 +2251,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "CORREZIONE"
 
-msgid "Angle snapping"
-msgstr "Scatto angolo"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Commuta la modalità di scatto angolo durante il disegno"
-
 msgid "Dual alignment"
 msgstr "Doppio allineamento"
 
@@ -2744,6 +2744,9 @@ msgstr "utilizzare le parentesi per raggruppare le espressioni"
 msgid "objects"
 msgstr "oggetti"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "tutti i percorsi"
 
@@ -2813,6 +2816,9 @@ msgstr "tutti gli oggetti selezionati"
 msgid "all incomplete objects"
 msgstr "tutti gli oggetti incompleti"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "oggetti collegati"
 
@@ -4574,33 +4580,32 @@ msgstr "Tipo di relazione sconosciuto"
 msgid "Relation is empty"
 msgstr "Relazione vuota"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
-"Il membro Ruolo non corrisponde all''espressione {0} nel template {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Il tipo di membro {0} non corrisponde alla lista di quelli accettati {1} nel "
-"template {2}"
 
 msgid "<empty>"
 msgstr "<vuoto>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Ruolo {0} sconosciuto nel template{1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Tipo di ruolo vuoto, mentre era atteso uno di {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Ruolo {0} mancante"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Numero di ruoli {0} troppo basso ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Numero di ruoli {0} troppo alto ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Percorsi che si auto-intersecano"
@@ -7100,7 +7105,7 @@ msgid "Sort"
 msgstr "Ordina"
 
 msgid "Open the note in an external browser"
-msgstr ""
+msgstr "Apri Nota in un browser esterno"
 
 msgid "Object type:"
 msgstr "Tipo oggetto:"
@@ -9064,7 +9069,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Editor"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -9457,7 +9462,7 @@ msgid "Unsaved changes - Save/Upload before deleting?"
 msgstr "Modifiche non salvate - Salvare/caricare prima di eliminare?"
 
 msgid "Unsaved changes - Save/Upload before restarting?"
-msgstr ""
+msgstr "Modifiche non salvate - Salvare ed inviare prima del riavvio?"
 
 msgid "Uploading and saving modified layers ..."
 msgstr "Caricamento e salvataggio dei livelli modificati ..."
@@ -9532,7 +9537,7 @@ msgid "Restart now!"
 msgstr "È necessario riavviare!"
 
 msgid "Restart JOSM without saving. Unsaved changes are lost."
-msgstr ""
+msgstr "Riavvia JOSM senza salvare. Le modifiche non salvate andranno perse."
 
 msgid "Delete now!"
 msgstr "Elimina adesso!"
@@ -9553,6 +9558,8 @@ msgstr ""
 
 msgid "Restart JOSM with saving. Unsaved changes are uploaded and/or saved."
 msgstr ""
+"Riavvia JOSM dopo aver fatto il salvataggio. Le modifiche saranno salvate "
+"e/o trasmesse al server."
 
 msgid "Perform actions before deleting"
 msgstr "Esegui azioni prima di eliminare"
@@ -12072,7 +12079,7 @@ msgstr ""
 msgid "Track date"
 msgstr "data del tracciato"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -12087,15 +12094,23 @@ msgstr "Bicicletta"
 msgid "Foot"
 msgstr "Pedone"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bosco"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -12896,10 +12911,10 @@ msgid "You can copy+paste the list of a status report here."
 msgstr ""
 
 msgid "Load plugins from list"
-msgstr ""
+msgstr "Scarica plugin da una lista"
 
 msgid "The following plugins were not found. Continue anyway?"
-msgstr ""
+msgstr "I seguenti plugin non sono stati trovati. Continuare l''attività?"
 
 msgid "Add JOSM Plugin description URL."
 msgstr "Aggiungi indirizzo URL di descrizione dell''estensione JOSM."
@@ -16136,7 +16151,7 @@ msgid "Report Bug"
 msgstr "Segnala bug"
 
 msgid "Suppress this error for this session."
-msgstr ""
+msgstr "Ignora l''errore durante questa sessione."
 
 msgid "Suppress further error dialogs for this session."
 msgstr "Non mostrare più le finestre di errore in questa sessione."
@@ -16646,10 +16661,10 @@ msgid "imagico.de OSM images for mapping: Elephant Island/Clarence Island"
 msgstr ""
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN Argentina (TMS)"
 
 msgid "IGN Argentina (WMS)"
-msgstr ""
+msgstr "IGN Argentina (WMS)"
 
 msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI bianco-nero 2.5m"
@@ -16799,9 +16814,15 @@ msgid "IBGE Distrito Federal"
 msgstr ""
 
 msgid "Rio Mosaic 2013"
-msgstr ""
+msgstr "Rio Mosaic 2013"
 
 msgid "Rio Mosaic 2015"
+msgstr "Rio Mosaic 2015"
+
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
 msgstr ""
 
 msgid "Geobase Hydrography"
@@ -17001,7 +17022,7 @@ msgid "Berlin aerial photograph 2015"
 msgstr "Foto aeree Berlino 2015"
 
 msgid "Berlin aerial photograph 2016"
-msgstr ""
+msgstr "Berlino foto aeree 2016"
 
 msgid "Erlangen aerial imagery (2016 5.0 cm)"
 msgstr ""
@@ -17121,7 +17142,7 @@ msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr ""
 
 msgid "Budapest district XI ortophoto 2015"
-msgstr ""
+msgstr "Ortofoto Budapest distretto XI 2015"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
 msgstr ""
@@ -17205,10 +17226,10 @@ msgid "South Tyrol Orthofoto 2011"
 msgstr "Alto Adige Ortofoto 2011"
 
 msgid "South Tyrol Orthofoto 2011 (highres)"
-msgstr ""
+msgstr "Ortofoto Alto Adige 2011 (alta risoluzione)"
 
 msgid "South Tyrol Orthofoto 2014"
-msgstr ""
+msgstr "Ortofoto Alto Adige 2014"
 
 msgid "South Tyrol Topomap"
 msgstr "Topomap Alto Adige"
@@ -17451,10 +17472,10 @@ msgid "RABA-KGZ: Slovenia built-up areas"
 msgstr "RABA-KGZ: Slovenia aree edificate"
 
 msgid "City of Cape Town 2013 Aerial"
-msgstr ""
+msgstr "Foto aerea Città del Capo 2013"
 
 msgid "City of Cape Town 2015 Aerial"
-msgstr ""
+msgstr "Foto aerea Città del Capo 2015"
 
 msgid "South Africa CD:NGI Aerial"
 msgstr "South Africa CD:NGI Aerial"
@@ -17567,6 +17588,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -17634,7 +17658,7 @@ msgid "WA Vector Streetmap for San Juan County"
 msgstr ""
 
 msgid "Texas Orthophoto"
-msgstr ""
+msgstr "Ortofoto del Texas"
 
 msgid "Philadelphia 2015 Imagery"
 msgstr ""
@@ -17649,7 +17673,7 @@ msgid "MD Transportation Basemap"
 msgstr ""
 
 msgid "Delaware 2012 Orthophotography"
-msgstr ""
+msgstr "Ortofoto del Delaware 2012"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains"
 msgstr ""
@@ -17661,10 +17685,10 @@ msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Ukraine - Orthophotomaps 2012"
 
 msgid "Works only from within Ukraine or with an Ukrainian proxy server."
-msgstr ""
+msgstr "Disponibile solo in Ucraina o tramite proxy ucraini."
 
 msgid "Ukraine - Kyiv 2014 (DZK)"
-msgstr ""
+msgstr "Ucraina - Kiev 2014 (DZK)"
 
 msgid "7th Series (OS7)"
 msgstr "7th Series (OS7)"
@@ -21297,7 +21321,7 @@ msgid "Types of vehicles which can be charged:"
 msgstr ""
 
 msgid "Scooter"
-msgstr ""
+msgstr "Scooter"
 
 msgid "Truck"
 msgstr "Camion"
@@ -21357,7 +21381,7 @@ msgid "NFC"
 msgstr "NFC"
 
 msgid "Membership card"
-msgstr ""
+msgstr "Carta fedeltà"
 
 msgid "Wash"
 msgstr "Autolavaggio"
@@ -21790,7 +21814,7 @@ msgid "Takeaway"
 msgstr "Per asporto"
 
 msgid "Delivery"
-msgstr ""
+msgstr "Consegna a domicilio"
 
 msgid "Mo-Su 12:00-22:00"
 msgstr ""
@@ -25463,6 +25487,9 @@ msgstr "Fila di alberi"
 msgid "A line of trees."
 msgstr "un filare di alberi"
 
+msgid "Wood"
+msgstr "Bosco"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Bosco la cui funzione prevalente non è la produzione di legname."
 
@@ -25826,6 +25853,9 @@ msgstr "Codice postale"
 msgid "Country code"
 msgstr "Codice nazione"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nome edificio"
 
@@ -26643,8 +26673,8 @@ msgstr "{0} in un nodo. Dovrebbe essere usato in un tracciato."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} in un nodo. Dovrebbe essere disegnata come un''area."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* in un nodo. Dovrebbe essere utilizzato in una relazione"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} per una via. Si dovrebbe usare per un nodo."
@@ -26739,9 +26769,6 @@ msgstr "strada di tipo temporaneo"
 msgid "{0} used with {1}"
 msgstr "{0} utilizzato con {1}"
 
-msgid "street name contains ss"
-msgstr "nome di strada contenente ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26834,6 +26861,12 @@ msgstr "denominazione mussulmana sconosciuta"
 msgid "unknown jewish denomination"
 msgstr "denominazione ebraica sconosciuta"
 
+msgid "street name contains ss"
+msgstr "nome di strada contenente ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} non necessario"
 
diff --git a/i18n/po/ja.po b/i18n/po/ja.po
index a1bb348..79e8e95 100644
--- a/i18n/po/ja.po
+++ b/i18n/po/ja.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2016-12-30 03:12+0000\n"
-"Last-Translator: Tom Konda <tomohiro.konda at gmail.com>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-07 13:55+0000\n"
+"Last-Translator: Masao Takaku <Unknown>\n"
 "Language-Team: Japanese <tr at openstreetmap.jp>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:57+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:57+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "X-Poedit-Country: JAPAN\n"
 "Language: ja\n"
 "X-Poedit-Language: Japanese\n"
@@ -2038,6 +2038,12 @@ msgstr "角度合わせが有効です。"
 msgid "Finish drawing."
 msgstr "描画の完了"
 
+msgid "Angle snapping"
+msgstr "角度合わせ"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "描画時の角度合わせモードの切り替え"
+
 msgid "Toggle snapping by {0}"
 msgstr "{0}への位置合わせを有効化/無効化"
 
@@ -2062,12 +2068,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "角度合わせ"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "描画時の角度合わせモードの切り替え"
-
 msgid "Dual alignment"
 msgstr "平行移動"
 
@@ -2511,6 +2511,9 @@ msgstr "条件をグループ化するために括弧を使用"
 msgid "objects"
 msgstr "オブジェクト"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "全てのウェイ"
 
@@ -2579,6 +2582,9 @@ msgstr "すべての選択されたオブジェクト"
 msgid "all incomplete objects"
 msgstr "すべての不完全なオブジェクト"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "関連するオブジェクト"
 
@@ -4167,30 +4173,32 @@ msgstr "リレーション種別が不明です"
 msgid "Relation is empty"
 msgstr "リレーションは空です"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "テンプレート{1}において、式{0}に一致するロールメンバーはありません"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr "テンプレート{2}において、{1}のリストに一致する{0}の種類のロールメンバーはありません"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
+msgstr ""
 
 msgid "<empty>"
 msgstr "<empty>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "ロール{0}はテンプレート{1}で認識できません"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "空のロールが見つかりました。{0}のどれかを指定する必要があります"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "ロール{0} がありません"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} ロールの数({1})が少なすぎます"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} ロールの数({1})が多すぎます"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "自身で交差するウェイ"
@@ -10959,7 +10967,7 @@ msgstr "位置精度低下率(赤=高い、緑=低い、可能な場合)"
 msgid "Track date"
 msgstr "記録日"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10974,15 +10982,23 @@ msgstr "自転車"
 msgid "Foot"
 msgstr "徒歩"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "自然林"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -12478,7 +12494,7 @@ msgid "Presets"
 msgstr "プリセット"
 
 msgid "Search for objects by preset..."
-msgstr ""
+msgstr "プリセットからオブジェクトを検索..."
 
 msgid "Search for objects by preset"
 msgstr "プリセットでオブジェクトを検索"
@@ -15180,6 +15196,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -15944,6 +15966,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23699,6 +23724,9 @@ msgstr "並木"
 msgid "A line of trees."
 msgstr "木の並びです。"
 
+msgid "Wood"
+msgstr "自然林"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "木材生産が積極的に行われていない森林です。"
 
@@ -24050,6 +24078,9 @@ msgstr "郵便番号"
 msgid "Country code"
 msgstr "国コード"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "建物名"
 
@@ -24850,8 +24881,8 @@ msgstr "{0}がノードに設定されています。ウェイに設定するべ
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0}がノードに設定されています。エリアとして描画するべきです。"
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=*がノードに設定されています。リレーションに設定するべきです"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr ""
@@ -24946,9 +24977,6 @@ msgstr "道路の種別が未確定"
 msgid "{0} used with {1}"
 msgstr "{0}が{1}と一緒に使われている"
 
-msgid "street name contains ss"
-msgstr "ssが含まれている通り名"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25036,6 +25064,12 @@ msgstr "不明なイスラム教の宗派"
 msgid "unknown jewish denomination"
 msgstr "不明なユダヤ教の宗派"
 
+msgid "street name contains ss"
+msgstr "ssが含まれている通り名"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0}は不要"
 
diff --git a/i18n/po/ka.po b/i18n/po/ka.po
index 8f87c02..d003e27 100644
--- a/i18n/po/ka.po
+++ b/i18n/po/ka.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-12-16 00:14+0000\n"
 "Last-Translator: datogogishvili <Unknown>\n"
 "Language-Team: Georgian <ka at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:48+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:48+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ka\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2025,6 +2025,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2049,12 +2055,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2489,6 +2489,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2557,6 +2560,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4141,29 +4147,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10797,7 +10805,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10812,15 +10820,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14913,6 +14929,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15675,6 +15697,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23388,6 +23413,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23738,6 +23766,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24538,7 +24569,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24634,9 +24665,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24724,6 +24752,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/km.po b/i18n/po/km.po
index a790cf2..9422e9d 100644
--- a/i18n/po/km.po
+++ b/i18n/po/km.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-01-27 10:25+0000\n"
 "Last-Translator: Sophea Sok <sksophea at gmail.com>\n"
 "Language-Team: Khmer <km at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:57+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:57+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2138,6 +2138,12 @@ msgstr "មុំ​ឆក់​សកម្ម។"
 msgid "Finish drawing."
 msgstr "បញ្ចប់​ការ​គូរ។"
 
+msgid "Angle snapping"
+msgstr "មុំ​ឆក់"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "ប្ដូរ​របៀប​មុំ​ឆក់ នៅ​ពេល​គូរ"
+
 msgid "Toggle snapping by {0}"
 msgstr "បិទ/បើក​ការ​ឆក់​ដោយ {0}"
 
@@ -2162,12 +2168,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "មុំ​ឆក់"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "ប្ដូរ​របៀប​មុំ​ឆក់ នៅ​ពេល​គូរ"
-
 msgid "Dual alignment"
 msgstr "ការ​តម្រឹម​ទ្វេ"
 
@@ -2634,6 +2634,9 @@ msgstr "ប្រើ​វង់ក្រចក​ដើម្បី​ដាក
 msgid "objects"
 msgstr "វត្ថុ"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "ផ្លូវ​ទាំងអស់"
 
@@ -2702,6 +2705,9 @@ msgstr "វត្ថុ​ដែល​បាន​ជ្រើស​ទាំង
 msgid "all incomplete objects"
 msgstr "វត្ថុ​ដែល​មិន​បញ្ចប់​ទាំងអស់"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "វត្ថុ​ដែល​ពាក់ព័ន្ធ"
 
@@ -4386,32 +4392,32 @@ msgstr "មិន​ស្គាល់​ប្រភេទ​ទំនាក់
 msgid "Relation is empty"
 msgstr "ទំនាក់ទំនង​គឺ​ទទេ"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "តួនាទី​សមាជិក​មិន​ផ្គូផ្គង​ជាមួយ​កន្សោម {0} នៅ​ក្នុង​ពុម្ព {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"ប្រភេទ​តួនាទី​សមាជិក {0} មិន​ផ្គូផ្គង​ជាមួយ​បញ្ជី​ព្រម​ទទួល {1} "
-"នៅ​ក្នុង​ពុម្ព {2}"
 
 msgid "<empty>"
 msgstr "<ទទេ>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "មិន​ស្គាល់​តួនាទី {0} នៅ​ក្នុង​ពុម្ព {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "បាន​រក​ឃើញ​តួនាទី​ទទេ ពេល​ទាមទារ​មួយ​ក្នុង​ចំណោម {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "បាត់​បញ្ជី {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "ចំនួន​នៃ​បញ្ជី {0} គឺ​ទាប​ពេក ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "ចំនួន​នៃ​បញ្ជី {0} គឺ​ខ្ពស់​ពេក ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "ផ្លូវ​ដែល​ប្រសព្វ​ខ្លួន​ឯង"
@@ -11657,7 +11663,7 @@ msgstr "ការ​លាយ​បន្សាប​នៃ​ទីតាំង
 msgid "Track date"
 msgstr "កាលបរិច្ឆេទ​ដាន"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11672,15 +11678,23 @@ msgstr "កង់"
 msgid "Foot"
 msgstr "ថ្មើជើង"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16238,6 +16252,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -17000,6 +17020,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24801,6 +24824,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -25151,6 +25177,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -25951,7 +25980,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -26047,9 +26076,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26137,6 +26163,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ko.po b/i18n/po/ko.po
index e415027..c231837 100644
--- a/i18n/po/ko.po
+++ b/i18n/po/ko.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-08-05 12:36+0000\n"
 "Last-Translator: Myeongjin <aranet100 at gmail.com>\n"
 "Language-Team: Korean <ko at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:59+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:58+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ko\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2011,6 +2011,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "그리기 끝내기"
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2035,12 +2041,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2475,6 +2475,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2543,6 +2546,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4120,29 +4126,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10778,7 +10786,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10793,15 +10801,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14894,6 +14910,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15656,6 +15678,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23369,6 +23394,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23719,6 +23747,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24519,7 +24550,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24615,9 +24646,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24705,6 +24733,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ky.po b/i18n/po/ky.po
index da7fc16..2b73aab 100644
--- a/i18n/po/ky.po
+++ b/i18n/po/ky.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2012-12-18 02:36+0000\n"
 "Last-Translator: SimpleLeon <Unknown>\n"
 "Language-Team: Kirghiz <ky at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:58+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:58+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/lb.po b/i18n/po/lb.po
index 27ab10d..50eb7a1 100644
--- a/i18n/po/lb.po
+++ b/i18n/po/lb.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-04-28 18:56+0000\n"
 "Last-Translator: Charel <ceilenbecker at gmail.com>\n"
 "Language-Team: Luxembourgish <lb at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:01+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:01+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}:D''Optioun \"{1}\" ass net eendeiteg"
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/lo.po b/i18n/po/lo.po
index de5a189..c36f0a4 100644
--- a/i18n/po/lo.po
+++ b/i18n/po/lo.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-09-15 10:06+0000\n"
 "Last-Translator: Anousone <Unknown>\n"
 "Language-Team: Lao <lo at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:59+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:59+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/lt.po b/i18n/po/lt.po
index e808c71..9969f46 100644
--- a/i18n/po/lt.po
+++ b/i18n/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-12-01 19:23+0000\n"
 "Last-Translator: Aurimas Fišeras <Unknown>\n"
 "Language-Team: Lithuanian <lt at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "(n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:00+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:00+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: lt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2185,6 +2185,12 @@ msgstr "Kampų pritraukimas įjungtas."
 msgid "Finish drawing."
 msgstr "Baigti braižyti."
 
+msgid "Angle snapping"
+msgstr "Kampų pritraukimas"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Perjungti kampų pritraukimo režimą paišant"
+
 msgid "Toggle snapping by {0}"
 msgstr "Perjungti pritraukimą prie {0}"
 
@@ -2209,12 +2215,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "PATAISYTI"
 
-msgid "Angle snapping"
-msgstr "Kampų pritraukimas"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Perjungti kampų pritraukimo režimą paišant"
-
 msgid "Dual alignment"
 msgstr "Dvigubas lygiavimas"
 
@@ -2698,6 +2698,9 @@ msgstr "išraiškų grupavimui naudokite skliaustus"
 msgid "objects"
 msgstr "objektai"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "visi keliai"
 
@@ -2767,6 +2770,9 @@ msgstr "visi pažymėti objektai"
 msgid "all incomplete objects"
 msgstr "visi nebaigti objektai"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "susiję objektai"
 
@@ -4498,30 +4504,32 @@ msgstr "Nežinomas ryšio tipas"
 msgid "Relation is empty"
 msgstr "Ryšys yra tuščias"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Ryšio narys neatitinka išraiškos {0} šablone {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr "Ryšio nario tipas {0} neatitinka priimtinų sąrašo {1} šablone {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
+msgstr ""
 
 msgid "<empty>"
 msgstr "<tuščias>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rolė {0} nežinoma šablonuose {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Rastas tuščias rolės tipas, kai buvo tikėtasi vieno iš {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Trūksta rolės {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Per mažai {0} rolių ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Per daug {0} rolių ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Save kertantys keliai"
@@ -11822,7 +11830,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Pėdsako data"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11837,15 +11845,23 @@ msgstr "Dviratis"
 msgid "Foot"
 msgstr "Pėstieji"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Medžiai"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16355,6 +16371,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase hidrografija"
 
@@ -17121,6 +17143,9 @@ msgstr "Fyzo Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24851,6 +24876,9 @@ msgstr "Medžių eilė"
 msgid "A line of trees."
 msgstr "Medžių eilė."
 
+msgid "Wood"
+msgstr "Medžiai"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -25208,6 +25236,9 @@ msgstr "Pašto kodas"
 msgid "Country code"
 msgstr "Šalies kodas"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Namo pavadinimas"
 
@@ -26012,7 +26043,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -26108,9 +26139,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26198,6 +26226,12 @@ msgstr "nežinoma musulmoniška denominacija"
 msgid "unknown jewish denomination"
 msgstr "nežinoma žydiška denominacija"
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} yra nereikalinga"
 
diff --git a/i18n/po/lv.po b/i18n/po/lv.po
index ce1a641..ed05c4d 100644
--- a/i18n/po/lv.po
+++ b/i18n/po/lv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2012-10-03 22:16+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: Latvian <lv at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:00+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:59+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: lv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2031,6 +2031,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2055,12 +2061,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2495,6 +2495,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2563,6 +2566,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4147,29 +4153,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10802,7 +10810,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10817,15 +10825,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14922,6 +14938,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15684,6 +15706,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23397,6 +23422,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23747,6 +23775,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24547,7 +24578,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24643,9 +24674,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24733,6 +24761,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/mk.po b/i18n/po/mk.po
index 6a39307..d4d0319 100644
--- a/i18n/po/mk.po
+++ b/i18n/po/mk.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2013-05-11 04:37+0000\n"
 "Last-Translator: Bojan Jankuloski <bojan.jankuloski at gmail.com>\n"
 "Language-Team: Macedonian <mk at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:02+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:01+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: mk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2023,6 +2023,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2047,12 +2053,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2487,6 +2487,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2555,6 +2558,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4139,29 +4145,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10795,7 +10803,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10810,15 +10818,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14912,6 +14928,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15674,6 +15696,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23387,6 +23412,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23737,6 +23765,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24537,7 +24568,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24633,9 +24664,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24723,6 +24751,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/mr.po b/i18n/po/mr.po
index 631d0c9..e69c565 100644
--- a/i18n/po/mr.po
+++ b/i18n/po/mr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-05-24 23:45+0000\n"
 "Last-Translator: Singleton <singleton47+ubuntuone at live.com>\n"
 "Language-Team: Marathi <mr at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:02+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:02+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: mr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2047,6 +2047,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "रेखाटन संपवा."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2071,12 +2077,6 @@ msgstr "०,३०,४५,६०,९०,..."
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2511,6 +2511,9 @@ msgstr ""
 msgid "objects"
 msgstr "वस्तू"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "सर्व मार्ग"
 
@@ -2579,6 +2582,9 @@ msgstr "सर्व निवडलेल्या वस्तू"
 msgid "all incomplete objects"
 msgstr "सर्व अपूर्ण वस्तू"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "संबंधित वस्तू"
 
@@ -4164,29 +4170,31 @@ msgstr "संबंध प्रकार अज्ञात आहे"
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10831,7 +10839,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10846,15 +10854,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14947,6 +14963,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15709,6 +15731,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23422,6 +23447,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23772,6 +23800,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24572,7 +24603,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24668,9 +24699,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24758,6 +24786,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ms.po b/i18n/po/ms.po
index 688ab7d..e0ed2c5 100644
--- a/i18n/po/ms.po
+++ b/i18n/po/ms.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-12-11 22:14+0000\n"
 "Last-Translator: abuyop <Unknown>\n"
 "Language-Team: Malay <ms at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:03+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:03+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ms\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/nb.po b/i18n/po/nb.po
index 84c0224..249ffcf 100644
--- a/i18n/po/nb.po
+++ b/i18n/po/nb.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-10-06 19:11+0000\n"
 "Last-Translator: Syver Stensholt <sssandum at gmail.com>\n"
 "Language-Team: Norwegian Bokmal <nb at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:05+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:04+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: nb\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2090,6 +2090,12 @@ msgstr "Vinkelfesting aktiv."
 msgid "Finish drawing."
 msgstr "Avslutt tegning."
 
+msgid "Angle snapping"
+msgstr "Vinkelfesting"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Bytt vinkelfestingmodus under tegning"
+
 msgid "Toggle snapping by {0}"
 msgstr "Veksle mellom festing etter {0}"
 
@@ -2114,12 +2120,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr "Vinkelfesting"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Bytt vinkelfestingmodus under tegning"
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2565,6 +2565,9 @@ msgstr "bruk parenteser til å gruppere uttrykk"
 msgid "objects"
 msgstr "objekter"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "alle veier"
 
@@ -2633,6 +2636,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4231,29 +4237,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10984,7 +10992,7 @@ msgstr "Dilution of Position (rød = bra, green = dårlig (hvis noen)"
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10999,15 +11007,23 @@ msgstr "Sykkel"
 msgid "Foot"
 msgstr "Til fots"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Skogsområde"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15138,6 +15154,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15900,6 +15922,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23628,6 +23653,9 @@ msgstr "Trerekke"
 msgid "A line of trees."
 msgstr "En rekke med trær."
 
+msgid "Wood"
+msgstr "Skogsområde"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23978,6 +24006,9 @@ msgstr "Postnummer"
 msgid "Country code"
 msgstr "Landskode"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Husnavn"
 
@@ -24788,8 +24819,8 @@ msgstr "{0} på en node. Bør brukes på linje."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* på en node. Bør brukes i en relasjon."
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} på en linje. Bør brukes på en node."
@@ -24884,9 +24915,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr "{0} brukt med {1}"
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24974,6 +25002,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/nds.po b/i18n/po/nds.po
index a54c904..db73010 100644
--- a/i18n/po/nds.po
+++ b/i18n/po/nds.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-11-29 09:01+0000\n"
 "Last-Translator: Dirk Stöcker <launchpad at dstoecker.de>\n"
 "Language-Team: German, Low <nds at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:04+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:03+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Holt"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Holt"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/nl.po b/i18n/po/nl.po
index 0aeeab2..6beb1b9 100644
--- a/i18n/po/nl.po
+++ b/i18n/po/nl.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-02 22:10+0000\n"
-"Last-Translator: korst <Unknown>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-24 14:26+0000\n"
+"Last-Translator: DiGro <Unknown>\n"
 "Language-Team: Dutch\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:44+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:44+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: nl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2223,6 +2223,12 @@ msgstr "Hoeken vastsetten actief."
 msgid "Finish drawing."
 msgstr "Tekenen beëindigen"
 
+msgid "Angle snapping"
+msgstr "Hoek vastklikken"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Schakel hoek vastklikken tijdens tekenen aan/uit"
+
 msgid "Toggle snapping by {0}"
 msgstr "Schakelen vastklikken met {0}"
 
@@ -2247,12 +2253,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "HERSTELLEN"
 
-msgid "Angle snapping"
-msgstr "Hoek vastklikken"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Schakel hoek vastklikken tijdens tekenen aan/uit"
-
 msgid "Dual alignment"
 msgstr "Dubbel uitlijnen"
 
@@ -2737,6 +2737,9 @@ msgstr "gebruik haakjes om uitdrukkingen te groeperen"
 msgid "objects"
 msgstr "objecten"
 
+msgid "all nodes"
+msgstr "alle knopen"
+
 msgid "all ways"
 msgstr "alle wegen"
 
@@ -2808,6 +2811,10 @@ msgstr "alle geselecteerde objecten"
 msgid "all incomplete objects"
 msgstr "alle onvolledige objecten"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+"alle verwijderde objecten (keuzevak <b>{0}</b> moet zijn geselecteerd)"
+
 msgid "related objects"
 msgstr "gerelateerde objecten"
 
@@ -4549,32 +4556,36 @@ msgstr "Relatietype is onbekend"
 msgid "Relation is empty"
 msgstr "Lege relatie"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Rol van het lid komt niet overeen met expressie {0} in sjabloon {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
+"Rol van het lid van de relatie komt niet overeen met de expressie ''{0}'' in "
+"sjabloon {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Rol van het type lid {0} komt niet overeen met de geaccepteerde lijst van "
-"{1} in sjabloon {2}"
+"Type ''{0}'' van het lid van de relatie met de rol ''{1}'' komt niet overeen "
+"met de geaccepteerde types ''{2}'' in sjabloon {3}"
 
 msgid "<empty>"
 msgstr "<leeg>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rol {0} onbekend in sjablonen {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Rol ''{0}'' onbekend in sjabloon ''{1}''"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Leeg type rol gevonden waar verwacht werd een van {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Leeg type rol gevonden terwijl een van ''{0}'' werd verwacht"
 
-msgid "Role {0} missing"
-msgstr "Rol {0} ontbreekt"
+msgid "Role ''{0}'' missing"
+msgstr "Rol ''{0}'' ontbreekt"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Het aantal {0} rollen is te laag ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Aantal ''{0}'' rollen te laag ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Het aantal {0} rollen is te hoog ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Aantal ''{0}'' rollen te hoog ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Zelfkruisende wegen"
@@ -5998,6 +6009,8 @@ msgstr "Primitief"
 
 msgid "Merged members not frozen yet. Cannot build resolution command"
 msgstr ""
+"Samengevoegde leden nog niet bevroren. Kan opdracht voor resolutie niet "
+"bouwen"
 
 msgid "<undefined>"
 msgstr "<ongedefinieerd>"
@@ -9019,7 +9032,7 @@ msgid "B"
 msgstr "B"
 
 msgid "Editor"
-msgstr ""
+msgstr "Redacteur"
 
 msgid ""
 "Failed to update primitive with id {0} because current edit layer is null"
@@ -12006,8 +12019,8 @@ msgstr ""
 msgid "Track date"
 msgstr "Datum spoor"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "HeatMap (donker = weinig, helder = veel)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Enkele kleur (kan voor lagen met een naam ingesteld worden)"
@@ -12021,17 +12034,25 @@ msgstr "Fiets"
 msgid "Foot"
 msgstr "Te voet"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Inferno"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Viridis"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Oerbos"
+msgstr "Hout"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Hitte"
 
 msgid "Create markers when reading GPX"
 msgstr "Maak markeringen bij het lezen van GPX"
@@ -12046,7 +12067,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "GPX-lagen anti-aliasen"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Tekenen met transparantie (Alfa mengen) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -12122,6 +12143,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Dynamisch mengen van Alfa toepassen en breedte aanpassen, gebaseerd op "
+"zoomniveau voor alle GPX-lijnen."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -12150,6 +12173,8 @@ msgstr ""
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Verzamelde punten en segmenten van tracks voor een positie en weergegeven "
+"als heatmap."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr ""
@@ -12157,7 +12182,7 @@ msgstr ""
 "gemiddelde snelheden."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Selecteert het kleurenschema voor heatmap."
 
 msgid "Track and Point Coloring"
 msgstr "Kleuren van sporen en punten"
@@ -15878,7 +15903,7 @@ msgstr ""
 "Stil conflict in sneltoetsen: ''{0}'' verplaatst door ''{1}'' naar ''{2}''."
 
 msgid "Unknown territory id: {0}"
-msgstr ""
+msgstr "Onbekende ID voor gebied: {0}"
 
 msgid "There was {0} tag found in the buffer, it is suspicious!"
 msgid_plural "There were {0} tags found in the buffer, it is suspicious!"
@@ -16414,7 +16439,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard)"
-msgstr ""
+msgstr "OpenStreetMap Carto (Standaard)"
 
 msgid "OpenStreetMap (Standard Black & White)"
 msgstr "OpenStreetMap (Standaard zwart & wit)"
@@ -16519,7 +16544,7 @@ msgid "imagico.de OSM images for mapping: Elephant Island/Clarence Island"
 msgstr "imagico.de OSM images for mapping: Elephant Island/Clarence Island"
 
 msgid "IGN Argentina (TMS)"
-msgstr ""
+msgstr "IGN Argentinië (TMS)"
 
 msgid "IGN Argentina (WMS)"
 msgstr "IGN Argentinië (WMS)"
@@ -16615,7 +16640,7 @@ msgid "AGIV Flanders 2013-2015 aerial imagery 10cm"
 msgstr "AGIV Vlaanderen 2013-2015 luchtfoto''s 10cm"
 
 msgid "AGIV Flanders GRB"
-msgstr ""
+msgstr "AGIV Vlaanderen GRB"
 
 msgid "URBISfr numerical imagery (2013)"
 msgstr "URBISfr numerieke afbeeldingen (2013)"
@@ -16651,7 +16676,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC buslijnen (2014)"
 
 msgid "TEC bus stops (2014)"
-msgstr ""
+msgstr "TEC bushaltes (2014)"
 
 msgid "Benin: Cotonou Pleiade 2016"
 msgstr "Benin: Cotonou Pleiade 2016"
@@ -16669,13 +16694,19 @@ msgid "IBGE Mapa de Setores Rurais"
 msgstr "IBGE Mapa de Setores Rurais"
 
 msgid "IBGE Distrito Federal"
-msgstr ""
+msgstr "IBGE Distrito Federal"
 
 msgid "Rio Mosaic 2013"
-msgstr ""
+msgstr "Rio Mosaic 2013"
 
 msgid "Rio Mosaic 2015"
-msgstr ""
+msgstr "Rio Mosaic 2015"
+
+msgid "Londrina Ortofoto 2011"
+msgstr "Londrina Ortofoto 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Santa Catarina OrtoRGB 2012"
 
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrografie"
@@ -16707,6 +16738,8 @@ msgstr "imagico.de OSM images for mapping: Northern Ellesmere Island"
 msgid ""
 "imagico.de OSM images for mapping: Northern Ellesmere Island July 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Northern Ellesmere Island "
+"July 2016"
 
 msgid "imagico.de OSM images for mapping: Fogo, Cape Verde"
 msgstr "imagico.de OSM images for mapping: Fogo, Cape Verde"
@@ -16758,6 +16791,8 @@ msgstr "imagico.de OSM images for mapping: El Altar"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Darwin and Wolf islands, "
+"Galapagos"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Estonia Basemap (Maaamet)"
@@ -16933,15 +16968,21 @@ msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS low altitude overflight "
 "September 2015"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Thule Airbase DMS low "
+"altitude overflight September 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight September "
 "2015"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Thule Airbase DMS "
+"overflight September 2015"
 
 msgid ""
 "imagico.de OSM images for mapping: Thule Airbase DMS overflight October 2015"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Thule Airbase DMS "
+"overflight October 2015"
 
 msgid "imagico.de OSM images for mapping: Greenland mosaic"
 msgstr "imagico.de OSM images for mapping: Greenland mosaic"
@@ -16951,6 +16992,8 @@ msgstr "imagico.de OSM images for mapping: May 2013 off-nadir Landsat"
 
 msgid "imagico.de OSM images for mapping: Landsat off-nadir July 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Landsat off-nadir July "
+"2016"
 
 msgid "imagico.de OSM images for mapping: Northern Greenland ASTER"
 msgstr "imagico.de OSM images for mapping: Northern Greenland ASTER"
@@ -16961,6 +17004,8 @@ msgstr "Drone afbeeldingen (Haiti)"
 msgid ""
 "Temporary inavailable until presumably January 2017 due to a server switch."
 msgstr ""
+"Tijdelijk niet beschikbaar tot vermoedelijk januari 2017 in verband met "
+"wisselen van server."
 
 msgid "Drone Imagery 2014 (Haiti)"
 msgstr "Drone afbeeldingen 2014 (Haiti)"
@@ -16999,7 +17044,7 @@ msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr "Rivieroevers van Danube in Boedapest, Szentendre en Szigetmonostor"
 
 msgid "Budapest district XI ortophoto 2015"
-msgstr ""
+msgstr "Boedapest district XI luchtfoto 2015"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
 msgstr "OpenStreetMap Hongarije (wandelroutes)"
@@ -17083,10 +17128,10 @@ msgid "South Tyrol Orthofoto 2011"
 msgstr "Zuid  Tirol luchtofoto 2011"
 
 msgid "South Tyrol Orthofoto 2011 (highres)"
-msgstr ""
+msgstr "Zuid-Tirol luchtfoto 2011 (hoge resolutie)"
 
 msgid "South Tyrol Orthofoto 2014"
-msgstr ""
+msgstr "Zuid-Tirol luchtfoto 2014"
 
 msgid "South Tyrol Topomap"
 msgstr "Zuid Tirol Topomap"
@@ -17095,7 +17140,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Japan GSI ortho Imagery"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "imagico.de OSM-afbeeldingen voor in kaart brengen: Mount Kenya 2016"
 
 msgid "USSR - Latvia"
 msgstr "USSR - Letland"
@@ -17141,6 +17186,8 @@ msgstr "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Panama Canal - Pacific "
+"side"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "imagico.de OSM images for mapping: Panama Canal"
@@ -17152,7 +17199,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "imagico.de OSM images for mapping: New Ireland"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "imagico.de OSM-afbeeldingen voor in kaart brengen: Coropuna"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -17295,18 +17342,22 @@ msgid "ScanEx SPOT"
 msgstr "ScanEx SPOT"
 
 msgid "imagico.de OSM images for mapping: Kerch Strait"
-msgstr ""
+msgstr "imagico.de OSM-afbeeldingen voor in kaart brengen: Kerch Strait"
 
 msgid "imagico.de OSM images for mapping: Ushakov Island August 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Ushakov Island August 2016"
 
 msgid ""
 "imagico.de OSM images for mapping: Northern and Polar Ural mountains August "
 "2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Northern and Polar Ural "
+"mountains August 2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Vostochny Cosmodrome"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk Car"
@@ -17375,7 +17426,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Canarische eilanden"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "imagico.de OSM-afbeeldingen voor in kaart brengen: Adams Bridge"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Kanton Aargau 25cm (AGIS 2011)"
@@ -17446,8 +17497,13 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Kanton Basel-Stadt 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Kanton Basel-Landschaft 10cm (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Cental Alps in late "
+"September 2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Taiwan e-Map Open Data"
@@ -17466,6 +17522,7 @@ msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Mount Kilimanjaro 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -17528,19 +17585,20 @@ msgid "MD Transportation Basemap"
 msgstr "MD Transportation Basemap"
 
 msgid "Delaware 2012 Orthophotography"
-msgstr ""
+msgstr "Delaware 2012 Orthophotography"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains"
 msgstr "imagico.de OSM images for mapping: Rwenzori Mountains"
 
 msgid "imagico.de OSM images for mapping: Rwenzori Mountains 2016"
 msgstr ""
+"imagico.de OSM-afbeeldingen voor in kaart brengen: Rwenzori Mountains 2016"
 
 msgid "Ukraine - Orthophotomaps 2012"
 msgstr "Oekraïne - Orthophotomaps 2012"
 
 msgid "Works only from within Ukraine or with an Ukrainian proxy server."
-msgstr ""
+msgstr "Werkt alleen vanuit de Oekraïne of met een Oekraïense proxyserver."
 
 msgid "Ukraine - Kyiv 2014 (DZK)"
 msgstr "Oekraïne - Kiev 2014 (DZK)"
@@ -17915,7 +17973,7 @@ msgid "Create a grid of ways."
 msgstr "Maak een raster van wegen."
 
 msgid "Customization of public public transport stops."
-msgstr ""
+msgstr "Aanpassen van haltes openbaar vervoer."
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
@@ -25376,6 +25434,9 @@ msgstr "Bomenrij"
 msgid "A line of trees."
 msgstr "Een bomenrij"
 
+msgid "Wood"
+msgstr "Oerbos"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Een bosgebied waar houtproductie niet het gebruik domineert."
 
@@ -25733,6 +25794,9 @@ msgstr "Postcode"
 msgid "Country code"
 msgstr "Landcode"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Huisnaam"
 
@@ -26566,8 +26630,8 @@ msgstr "{0} op een knoop. Zou moeten wordne gebruikt op een weg."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} op een knoop. Zou moeten worden getekend als een gebied."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* op een knoop. Zou moeten worden gebruikt in een relatie"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} op een weg. Zou moeten worden gebruikt op een knoop."
@@ -26668,9 +26732,6 @@ msgstr "type tijdelijke verkeersweg"
 msgid "{0} used with {1}"
 msgstr "{0} gebruikt met {1}"
 
-msgid "street name contains ss"
-msgstr "straatnaam bevat ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26770,6 +26831,12 @@ msgstr "onbekende moslim omschrijving"
 msgid "unknown jewish denomination"
 msgstr "onbekende joodse omschrijving"
 
+msgid "street name contains ss"
+msgstr "straatnaam bevat ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} is niet nodig"
 
diff --git a/i18n/po/nn.po b/i18n/po/nn.po
index 62fc7b8..bf08821 100644
--- a/i18n/po/nn.po
+++ b/i18n/po/nn.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-07-15 12:49+0000\n"
 "Last-Translator: Skippern <Unknown>\n"
 "Language-Team: Norwegian Nynorsk <nn at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:04+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:04+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: nn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/oc.po b/i18n/po/oc.po
index d7360b8..1b39824 100644
--- a/i18n/po/oc.po
+++ b/i18n/po/oc.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2012-10-03 22:14+0000\n"
 "Last-Translator: Cédric VALMARY (Tot en òc) <cvalmary at yahoo.fr>\n"
 "Language-Team: Occitan (post 1500) <oc at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:06+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:05+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2027,6 +2027,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2051,12 +2057,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2491,6 +2491,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2559,6 +2562,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4143,29 +4149,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10801,7 +10809,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10816,15 +10824,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14917,6 +14933,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15679,6 +15701,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23392,6 +23417,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23742,6 +23770,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24542,7 +24573,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24638,9 +24669,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24728,6 +24756,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/pa.po b/i18n/po/pa.po
index 25162b9..498b218 100644
--- a/i18n/po/pa.po
+++ b/i18n/po/pa.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-05-06 15:52+0000\n"
 "Last-Translator: A S Alam <aalam at users.sf.net>\n"
 "Language-Team: Punjabi <pa at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:06+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:06+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: pa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/pl.po b/i18n/po/pl.po
index c8ed21e..448a248 100644
--- a/i18n/po/pl.po
+++ b/i18n/po/pl.po
@@ -8,17 +8,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-06 11:36+0000\n"
-"Last-Translator: Rafał Rudzik <rrudzik at gmail.com>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-25 22:01+0000\n"
+"Last-Translator: slodki <Unknown>\n"
 "Language-Team: polski <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
 "|| n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:08+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:07+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: pl\n"
 "X-Poedit-Bookmarks: 1098,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
 "X-Poedit-Basepath: /home/mfloryan/dev/josm/i18n\n"
@@ -32,6 +32,10 @@ msgstr "Oświetlenie"
 msgid "Repair"
 msgstr "Warsztat naprawczy"
 
+msgctxt "christian"
+msgid "roman_catholic"
+msgstr "rzymskokatolickie"
+
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}: opcja „{1}” jest niejednoznaczna"
 
@@ -69,7 +73,7 @@ msgid "Opening link not supported on current platform (''{0}'')"
 msgstr "Otwarcie łącza nie jest obsługiwane na tej platformie („{0}”)"
 
 msgid "Executing platform startup hook"
-msgstr "Zakotwiczanie platformy startowej"
+msgstr "Wykonanie procedur początkowych platformy"
 
 msgid "Building main menu"
 msgstr "Budowanie menu głównego"
@@ -191,9 +195,9 @@ msgstr "Kontynuuj"
 
 msgid "Click to continue and to open {0} browser"
 msgid_plural "Click to continue and to open {0} browsers"
-msgstr[0] "Proszę kliknąć, aby kontynuować i otworzyć {0} przeglądarkę"
-msgstr[1] "Kliknij by kontynuować i otworzyć {0} przeglądarki"
-msgstr[2] "Kliknij by kontynuować i otworzyć {0} przeglądarek"
+msgstr[0] "Proszę kliknąć, aby kontynuować i otworzyć {0} okno przeglądarki"
+msgstr[1] "Proszę kliknąć, aby kontynuować i otworzyć {0} okna przeglądarki"
+msgstr[2] "Proszę kliknąć, aby kontynuować i otworzyć {0} okien przeglądarki"
 
 msgid "Cancel"
 msgstr "Anuluj"
@@ -1036,10 +1040,10 @@ msgid "Ok"
 msgstr "Zatwierdź"
 
 msgid "Open Location..."
-msgstr "Otwórz adres..."
+msgstr "Otwórz położenie..."
 
 msgid "Open an URL."
-msgstr "Otwiera adres URL."
+msgstr "Otwiera adres URL"
 
 msgid "Enter URL to download:"
 msgstr "Proszę wprowadzić adres danych do pobrania:"
@@ -1054,7 +1058,7 @@ msgid "Select if the data should be downloaded into a new layer"
 msgstr "Wczytuje dane do nowej warstwy"
 
 msgid "Download Location"
-msgstr "Położenie pobierania"
+msgstr "Pobieranie położenia"
 
 msgid "Download URL"
 msgstr "Pobierz adres URL"
@@ -1685,7 +1689,7 @@ msgid "Undo ..."
 msgstr "Cofnij ..."
 
 msgid "Undo {0}"
-msgstr "Cofnij {0}"
+msgstr "Cofa {0}"
 
 msgid "Unselect All"
 msgstr "Odznacz wszystko"
@@ -2214,6 +2218,12 @@ msgstr "Przyciąganie do kątów włączone"
 msgid "Finish drawing."
 msgstr "Zakończ rysowanie."
 
+msgid "Angle snapping"
+msgstr "Przyciąganie do kątów"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Podczas rysowania przyciąga do określonych kątów"
+
 msgid "Toggle snapping by {0}"
 msgstr "Przyciąganie o {0}"
 
@@ -2238,12 +2248,6 @@ msgstr "0, 30, 45, 60, 90..."
 msgid "FIX"
 msgstr "Napraw"
 
-msgid "Angle snapping"
-msgstr "Przyciąganie do kątów"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Podczas rysowania przyciąga do określonych kątów"
-
 msgid "Dual alignment"
 msgstr "Przesuwanie wzdłuż bocznych segmentów"
 
@@ -2730,6 +2734,9 @@ msgstr "użyj nawiasów do zgrupowania wyrażeń"
 msgid "objects"
 msgstr "obiekty"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "wszystkie linie"
 
@@ -2800,6 +2807,9 @@ msgstr "wszystkie wybrane obiekty"
 msgid "all incomplete objects"
 msgstr "wszystkie niekompletne obiekty"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "powiązane obiekty"
 
@@ -3431,28 +3441,30 @@ msgstr ""
 "Proszę aktywować ręcznie odpowiednią opcję i spróbować zaimportować ponownie."
 
 msgid "Failed to create missing cache directory: {0}"
-msgstr "Nie udało się utworzyć brakującego katalogu podręcznego: {0}"
+msgstr "Nie udało się utworzyć brakującego katalogu pamięci podręcznej: {0}"
 
 msgid "<html>Failed to create missing cache directory: {0}</html>"
-msgstr "<html>Nie udało się utworzyć brakującego folderu cache: {0}</html>"
+msgstr ""
+"<html>Nie udało się utworzyć brakującego katalogu pamięci podręcznej: "
+"{0}</html>"
 
 msgid "Unable to delete temporary file {0}"
-msgstr "Próba usunięcia tymczasowego pliku {0} nie powiodła się"
+msgstr "Nie można usunąć pliku tymczasowego {0}"
 
 msgid "Unable to set file non-readable {0}"
-msgstr "Próba usunięcia uprawnień do odczytu na pliku {0} nie powiodła się"
+msgstr "Nie można odwołać uprawnień do odczytywania pliku {0}"
 
 msgid "Unable to set file non-writable {0}"
-msgstr "Próba usunięcia uprawnień do zapisu na pliku {0} nie powiodła się"
+msgstr "Nie można odwołać uprawnień do zapisywania pliku {0}"
 
 msgid "Unable to set file non-executable {0}"
-msgstr "Próba usunięcia uprawnień do wykonywania pliku {0} nie powiodła się"
+msgstr "Nie można odwołać uprawnień do uruchamiania pliku {0}"
 
 msgid "Unable to set file readable {0}"
-msgstr "Próba dodania uprawnień do odczytu na pliku {0} nie powiodła się"
+msgstr "Nie można nadać uprawnień do odczytywania pliku {0}"
 
 msgid "Unable to set file writable {0}"
-msgstr "Próba dodania uprawnień do zapisu na pliku {0} nie powiodła się"
+msgstr "Nie można nadać uprawnień do zapisywania pliku {0}"
 
 msgid ""
 "Failed to initialize preferences. Preference directory ''{0}'' is not a "
@@ -3464,7 +3476,7 @@ msgid ""
 "<html>Failed to initialize preferences.<br>Preference directory ''{0}'' is "
 "not a directory.</html>"
 msgstr ""
-"<html>Nie udało się zainicjować preferencji.<br>Katalog preferencji „{0}'' "
+"<html>Nie udało się zainicjować preferencji.<br>Katalog preferencji „{0}” "
 "nie jest katalogiem.</html>"
 
 msgid ""
@@ -3488,7 +3500,7 @@ msgstr ""
 msgid ""
 "Replacing existing preference file ''{0}'' with default preference file."
 msgstr ""
-"Zamiana istniejącego pliku z ustawieniami „{0}'' na plik z ustawieniami "
+"Zastępowanie istniejącego pliku z ustawieniami „{0}” na plik z ustawieniami "
 "domyślnymi."
 
 msgid ""
@@ -3513,10 +3525,11 @@ msgstr ""
 "ustawień domyślnych: {0}"
 
 msgid "Failed to load defaults cache file: {0}"
-msgstr "Nie udało się załadować domyślnego pliku cache: {0}"
+msgstr "Nie udało się wczytać domyślnego pliku pamięci podręcznej: {0}"
 
 msgid "Failed to delete faulty defaults cache file: {0}"
-msgstr "Nie udało się usunąć uszkodzonego domyślnego pliku cache: {0}"
+msgstr ""
+"Nie udało się usunąć uszkodzonego domyślnego pliku pamięci podręcznej: {0}"
 
 msgid "Paint style {0}: {1}"
 msgstr "Styl rysowania {0}: {1}"
@@ -3531,8 +3544,8 @@ msgid ""
 "Try enabling IPv6 network, prefering IPv6 over IPv4 (only works on early "
 "startup)."
 msgstr ""
-"Spróbuj włączyć obsługę adresów IPv6 i preferuj adresy IPv6 nad IPv4 (działa "
-"tylko na początku rozruchu)."
+"Proszę spróbować włączyć obsługę adresów IPv6 i preferuj adresy IPv6 nad "
+"IPv4 (działa tylko na początku rozruchu)."
 
 msgid "Preference setting {0} has been removed since it is no longer used."
 msgstr "Ustawienie {0} zostało usunięte, ponieważ nie jest już używane."
@@ -4116,7 +4129,7 @@ msgid "Reversed coastline"
 msgstr "Odwrócona linia brzegowa"
 
 msgid "invalid coastline"
-msgstr ""
+msgstr "nieważna linia brzegowa"
 
 msgid "Conditional Keys"
 msgstr "Klucze Warunkowe"
@@ -4158,7 +4171,7 @@ msgid "Self crossing"
 msgstr ""
 
 msgid "Self-crossing ways"
-msgstr ""
+msgstr "Linie przecinające same siebie"
 
 msgid ""
 "This test checks if two roads, railways, waterways or buildings crosses in "
@@ -4508,13 +4521,13 @@ msgid "Public Transport Route"
 msgstr "Trasa pojazdów transportu publicznego"
 
 msgid "Route relation contains a ''{0}'' role"
-msgstr ""
+msgstr "Relacja trasy zawiera ''{0}'' role"
 
 msgid "Route relation contains a gap"
 msgstr "Relacja trasy posiada luki"
 
 msgid "Stop position not part of route"
-msgstr ""
+msgstr "Miejsce zatrzymania nie jest częścią trasy"
 
 msgid "Role verification problem"
 msgstr "Problem z weryfikacją roli"
@@ -4536,32 +4549,32 @@ msgstr "Nieustalony rodzaj relacji"
 msgid "Relation is empty"
 msgstr "Pusta relacja"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Członek nie spełnia wymagań {0} w szablonie {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Typ członka {0} nie pasuje do listy akceptowanych wartości {1} w szablonie "
-"{2}"
 
 msgid "<empty>"
 msgstr "<pusta>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rola {0} jest nieznana w szablonach {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Znaleziono pusty typ roli zamiast spodziewanego jednego z {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Brakująca rola {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Za mała ilość ról {0} ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Liczba ról {0} zbyt wysoka ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Linie przecinające same siebie"
@@ -4608,16 +4621,16 @@ msgid "Key ''{0}'' invalid."
 msgstr "Klucz „{0}'' jest nieprawidłowy."
 
 msgid "Tag value contains character with code less than 0x20"
-msgstr "Wartość tagu zawiera znaki o kodzie mniejszym niż 0x20"
+msgstr "Wartość znacznika zawiera znaki o kodzie mniejszym niż 0x20"
 
 msgid "Tag key contains character with code less than 0x20"
-msgstr "Klucz tagu zawiera znaki o kodzie mniejszym niż 0x20"
+msgstr "Klucz znacznika zawiera znaki o kodzie mniejszym niż 0x20"
 
 msgid "Tag value longer than allowed"
-msgstr "Wartość tagu jest za długa"
+msgstr "Wartość znacznika jest za długa"
 
 msgid "Tag key longer than allowed"
-msgstr "Klucz tagu jest za długi"
+msgstr "Klucz znacznika jest za długi"
 
 msgid "Tags with empty values"
 msgstr "Znaczniki z pustymi wartościami"
@@ -4741,7 +4754,7 @@ msgid "No \"to\" way found"
 msgstr "Nie znaleziono linii z rolą „to\""
 
 msgid "\"from\" way equals \"to\" way"
-msgstr "Linia \"from\" jest identyczna jak \"to\""
+msgstr "Linia „from” jest taka sama jak „to”"
 
 msgid "No \"via\" node or way found"
 msgstr "Nie znaleziono linii lub węzła z rolą „via\""
@@ -4822,54 +4835,52 @@ msgid "Unconnected power ways"
 msgstr "Niepołączone linie elektryczne"
 
 msgid "This test checks if a way has an endpoint very near to another way."
-msgstr "Sprawdza, czy linia ma punkt końcowy bardzo blisko innej linii."
+msgstr "Sprawdza, czy węzeł końcowy linii leży w pobliżu innej linii."
 
 msgid "Way end node near other highway"
-msgstr "Węzeł końca linii leżący blisko innej drogi"
+msgstr "Węzeł kończący linię w pobliżu drogi"
 
 msgid "Way end node near other way"
-msgstr "Węzeł końca linii leżący blisko innej linii"
+msgstr "Węzeł kończący linię w pobliżu innej linii"
 
 msgid "Way node near other way"
-msgstr "Węzeł linii blisko innej linii"
+msgstr "Węzeł linii w pobliżu innej linii"
 
 msgid "Connected way end node near other way"
-msgstr ""
-"Węzeł kończący jedną linię blisko drugiej. Podejrzewamy brak złączenia linii "
-"posiadających w rzeczywistości połączenie."
+msgstr "Połączony węzeł kończący linię w pobliżu innej linii"
 
 msgid "Unconnected nodes without physical tags"
-msgstr "Niepołączone węzły bez tagów"
+msgstr "Niepołączone węzły bez znaczników"
 
 msgid "Untagged and unconnected nodes"
-msgstr "Nieotagowane i niepołączone węzły"
+msgstr "Nieoznaczone i niepołączone węzły"
 
 msgid "This test checks for untagged nodes that are not part of any way."
-msgstr "Ten test znajduje węzły bez tagu i poza linią."
+msgstr "Wyszukuje węzły bez znaczników, leżące poza liniami."
 
 msgid "No tags"
-msgstr "Bez tagów"
+msgstr "Bez znaczników"
 
 msgid "Has tag containing ''fixme'' or ''FIXME''"
-msgstr "Posiada tagi zawierające „fixme'' lub „FIXME''"
+msgstr "Posiada znaczniki zawierające „fixme” lub „FIXME”"
 
 msgid "Has key ''note'' or ''comment'' or ''description''"
-msgstr "Posiada klucz „note'', „comment'' lub „description''"
+msgstr "Posiada klucz „note”, „comment” lub „description”"
 
 msgid "Has key ''created_by'' or ''converted_by''"
-msgstr "Posiada klucz „created_by'' lub „converted_by''"
+msgstr "Posiada klucz „created_by” lub „converted_by”"
 
 msgid "Has key ''watch''"
-msgstr "Posiada klucz „watch''"
+msgstr "Posiada klucz „watch”"
 
 msgid "Has key ''source''"
-msgstr "Posiada klucz „source''"
+msgstr "Posiada klucz „source”"
 
 msgid "Untagged, empty and one node ways"
 msgstr "Nieoznaczone, puste i jednowęzłowe linie"
 
 msgid "This test checks for untagged, empty and one node ways."
-msgstr "Ten test znajduje linie bez tagów, puste i z jednym węzłem."
+msgstr "Wyszukuje linie bez znaczników, puste i z jednym węzłem."
 
 msgid "Unnamed ways"
 msgstr "Drogi bez nazwy"
@@ -4878,10 +4889,10 @@ msgid "Unnamed junction"
 msgstr "Skrzyżowanie bez nazwy"
 
 msgid "Untagged ways (commented)"
-msgstr "Linie bez tagów (z komentarzem)"
+msgstr "Linie bez znaczników (z komentarzem)"
 
 msgid "Untagged ways"
-msgstr "Linie bez tagów"
+msgstr "Linie bez znaczników"
 
 msgid "Empty ways"
 msgstr "Puste linie"
@@ -4893,7 +4904,7 @@ msgid "Way connected to Area"
 msgstr "Linia połączona z obszarem"
 
 msgid "Checks for ways connected to areas."
-msgstr "Sprawdzanie czy linie nie są połączone z obszarami."
+msgstr "Sprawdza czy linie nie są połączone z obszarami."
 
 msgid "Way terminates on Area"
 msgstr "Linia kończy się na obszarze"
@@ -4903,7 +4914,7 @@ msgstr "Nieprawidłowe kierunki linii"
 
 msgid "This test checks the direction of water, land and coastline ways."
 msgstr ""
-"Ten test sprawdza kierunek dróg wodnych (waterway), lądu (land) i wybrzeża "
+"Sprawdza kierunek linii wodnych (waterway), lądu (land) i wybrzeża "
 "(coastline)."
 
 msgid "Reversed land: land not on left side"
@@ -5123,7 +5134,7 @@ msgid "Set the preferences directory"
 msgstr "Podaj położenie katalogu ustawień"
 
 msgid "Default: {0}"
-msgstr ""
+msgstr "Domyślnie: {0}"
 
 msgid "/PATH/TO/JOSM/USERDATA"
 msgstr "/SCIEZKA/DO/JOSM/USERDATA"
@@ -5144,6 +5155,8 @@ msgid ""
 "Set the preferences+data+cache directory (cache directory will be "
 "josm.home/cache)"
 msgstr ""
+"Ustaw katalog preferencji, danych i pamięci podręcznej (katalogiem pamięci "
+"podręcznej będzie josm.home/cache)"
 
 msgid ""
 "-Djosm.home has lower precedence, i.e. the specific setting overrides the "
@@ -5177,7 +5190,7 @@ msgid "Log level is at {0} ({1}, {2})"
 msgstr ""
 
 msgid "Plugin loading skipped"
-msgstr "Pominiięto wczytywanie wtyczki"
+msgstr "Pominięto wczytywanie wtyczki"
 
 msgid "Enabled detailed debug level (trace)"
 msgstr "Włączony poziom dokładnego debugowania (trace)"
@@ -5207,8 +5220,8 @@ msgid ""
 "''{0}'' is not a valid value for argument ''{1}''. Possible values are {2}, "
 "possibly delimited by commas."
 msgstr ""
-"''{0}'' nie jest prawidłową wartością dla argumentu „{1}”. Możliwe wartości: "
-" {2}, ewentualnie oddzielonych od siebie przecinkami."
+"''{0}” nie jest prawidłową wartością parametru „{1}”. Możliwe wartości: {2}, "
+"ewentualnie oddzielonych od siebie przecinkami."
 
 msgid ""
 "JOSM is running in offline mode. This resource will not be available: {0}"
@@ -5225,7 +5238,7 @@ msgstr ""
 "restarcie."
 
 msgid "Detected useable IPv6 network, prefering IPv6 over IPv4."
-msgstr ""
+msgstr "Wykryto użyteczną sieć IPv6 która jest preferowana nad IPv4."
 
 msgid ""
 "Detected no useable IPv6 network, prefering IPv4 over IPv6 after next "
@@ -5351,7 +5364,7 @@ msgid "Preset preferences"
 msgstr "Ustawienia szablonów"
 
 msgid "Click to open the tagging presets tab in the preferences"
-msgstr "Kliknij by otworzyć w ustawieniach zakładkę szablonów tagowania"
+msgstr "Kliknij by otworzyć w ustawieniach zakładkę szablonów znaczników"
 
 msgid "Imagery preferences"
 msgstr "Ustawienia podkładów"
@@ -5491,7 +5504,7 @@ msgid "Enlarge"
 msgstr "Przybliż"
 
 msgid "Shrink"
-msgstr "Zmniejsz"
+msgstr "Oddal"
 
 msgid ""
 "<html>Please select a <strong>range of OSM tiles</strong> at a given zoom "
@@ -5825,7 +5838,7 @@ msgid "Their with Merged"
 msgstr "Ich z Połączoną"
 
 msgid "Role {0} is not participating in compare pair {1}."
-msgstr ""
+msgstr "Rola {0} nie uczestniczy w parze porównania {1}."
 
 msgid "Properties"
 msgstr "Właściwości"
@@ -5886,7 +5899,7 @@ msgid "Pending conflicts in the member list of this relation"
 msgstr "Oczekujące konflikty na liście członków tej relacji"
 
 msgid "No pending property conflicts"
-msgstr ""
+msgstr "Nie ma żadnych konfliktów własności"
 
 msgid "Properties(with conflicts)"
 msgstr "Właściwości (z konfliktami)"
@@ -8512,7 +8525,7 @@ msgid "Bounding Box"
 msgstr "Prostokąt ograniczający"
 
 msgid "The string ''{0}'' is not a valid double value."
-msgstr "Ciąg „{0}” nie reprezentuje poprawnej liczby zmiennoprzecinkowej."
+msgstr "Ciąg „{0}” nie reprezentuje prawidłowej liczby zmiennoprzecinkowej."
 
 msgid "Value for latitude in range [-90,90] required."
 msgstr "Wartości szerokości geograficznej musza być z zakresu [-90,90]."
@@ -9091,8 +9104,8 @@ msgid ""
 "Authenticating at the OSM API ''{0}'' failed. Please enter a valid username "
 "and a valid password."
 msgstr ""
-"Uwierzytelnianie OSM przy pomocy API ''{0}'' nie powiodło się. Proszę "
-"wprowadź poprawną nazwę użytkownika i poprawne hasło."
+"Nie udało się uwierzytelnić przy pomocy API OSM „{0}”. Proszę wprowadzić "
+"prawidłową nazwę użytkownika i hasło."
 
 msgid "Please enter the user name of your account"
 msgstr "Proszę wprowadzić nazwę użytkownika konta"
@@ -9153,8 +9166,8 @@ msgid ""
 "Cannot download file ''{0}''. Its download link ''{1}'' is not a valid URL. "
 "Skipping download."
 msgstr ""
-"Nie można pobrać pliku „{0}”. Ten link „{1}” nie jest prawidłowym adresem. "
-"Pomijanie pobierania."
+"Nie można pobrać pliku „{0}”. Odnośnik „{1}” nie jest prawidłowym adresem "
+"URL. Pomijanie pobierania."
 
 msgid ""
 "Could not retrieve the list of your open changesets because<br>JOSM does not "
@@ -11761,7 +11774,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Data śladu"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11776,15 +11789,23 @@ msgstr "Rowery"
 msgid "Foot"
 msgstr "Ruch pieszy"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Drzewa/las pierwotny"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -13863,7 +13884,7 @@ msgid "Fetching relation with id {0} from ''{1}''"
 msgstr "Pobieranie relacji o identyfikatorze {0} z „{1}”"
 
 msgid "Server replied with response code 404 for id {0}. Skipping."
-msgstr "Serwer odpowiedział kodem 404 dla id {0}. Pomijam."
+msgstr "Serwer odpowiedział kodem 404 dla id {0}. Pomijanie."
 
 msgid "NMEA-0183 Files"
 msgstr "Pliki NMEA-0183"
@@ -15692,6 +15713,8 @@ msgid ""
 "The maximum bbox size is 0.25, and your request was too large. Either "
 "request a smaller area, or use planet.osm"
 msgstr ""
+"Maksymalny rozmiar bbox to 0.25 i twoje żądanie jest zbyt duże. Wskaż "
+"mniejszy obszar lub użyj planet.osm"
 
 msgid "JOSM-Trac login at josm.openstreetmap.de"
 msgstr ""
@@ -16246,6 +16269,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -17008,6 +17037,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -17908,7 +17940,7 @@ msgid "concrete:lanes"
 msgstr "beton (ślady)"
 
 msgid "paving_stones"
-msgstr "kostka brukowa (cementowa)"
+msgstr "kostka brukowa"
 
 msgid "sett"
 msgstr "kostka brukowa (kamienna)"
@@ -21478,10 +21510,6 @@ msgid "quaker"
 msgstr "kwakierstwo"
 
 msgctxt "christian"
-msgid "roman_catholic"
-msgstr "rzymski katolicyzm"
-
-msgctxt "christian"
 msgid "russian_orthodox"
 msgstr "rosyjskoprawosławie"
 
@@ -23928,7 +23956,7 @@ msgid "Supermarket"
 msgstr "Supermarket"
 
 msgid "Convenience Store"
-msgstr "Sklep osiedlowy"
+msgstr "Sklep ogólnospożywczy"
 
 msgid "Kiosk"
 msgstr "Kiosk"
@@ -24759,6 +24787,9 @@ msgstr "Rząd drzew"
 msgid "A line of trees."
 msgstr "Rząd drzew"
 
+msgid "Wood"
+msgstr "Drzewa/las pierwotny"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -25109,6 +25140,9 @@ msgstr "Kod pocztowy"
 msgid "Country code"
 msgstr "Kod kraju"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nazwa domu"
 
@@ -25917,7 +25951,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -26013,9 +26047,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr "{0} użyte z {1}"
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26103,6 +26134,12 @@ msgstr "nieznane wyznanie islamskie"
 msgid "unknown jewish denomination"
 msgstr "nieznanie wyznanie żydowskie"
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} jest zbyteczne"
 
@@ -28307,10 +28344,10 @@ msgid "Save image as..."
 msgstr "Zapisz obraz jako..."
 
 msgid "PNG files (*.png)"
-msgstr "pliki PNG (*.png)"
+msgstr "Pliki PNG (*.png)"
 
 msgid "GeoTiff files (*.tif)"
-msgstr ""
+msgstr "Pliki GeoTiff (*.tif)"
 
 msgid "Export image (only raster images)"
 msgstr ""
@@ -30994,7 +31031,7 @@ msgid "Building JOSM layer"
 msgstr ""
 
 msgid "Postprocessing layer"
-msgstr ""
+msgstr "Przetwarzanie końcowe warstwy"
 
 msgid "Saving to file."
 msgstr "Zapis do pliku."
@@ -32353,7 +32390,7 @@ msgid "Save SDS file"
 msgstr ""
 
 msgid "No object selected"
-msgstr ""
+msgstr "Nie wybrano obiektu"
 
 msgid "SeaChart Editor"
 msgstr ""
@@ -32989,7 +33026,7 @@ msgid ""
 msgstr ""
 
 msgid "Load objects from server"
-msgstr ""
+msgstr "Wczytaj obiekty z serwera"
 
 msgid "Download signed data"
 msgstr ""
@@ -34482,10 +34519,10 @@ msgid "Sync"
 msgstr "Synchronizacja"
 
 msgid "Unable to find JNA Java library!"
-msgstr "Nie mogę znaleźć biblioteki JNA od Javy!"
+msgstr "Nie można odnaleźć biblioteki JNA dla Javy!"
 
 msgid "Unable to find native libvlc library!"
-msgstr "Nie mogę znaleźć biblioteki libvlc!"
+msgstr "Nie można odnaleźć biblioteki libvlc!"
 
 msgid "play"
 msgstr "odtwarzaj"
@@ -34551,7 +34588,7 @@ msgid ""
 msgstr ""
 
 msgid "Merge duplicate node?"
-msgstr "Połączyć zduplikowany węzeł?"
+msgstr "Połączyć powielony węzeł?"
 
 msgid "<html>No more connected ways to download.</html>"
 msgstr "<html>Nie ma więcej połączonych linii do pobrania.</html>"
@@ -34628,7 +34665,7 @@ msgid "Search Wikipedia category"
 msgstr "Szukaj kategorii w Wikipedii"
 
 msgid "Load category"
-msgstr "Załaduj kategorię"
+msgstr "Wczytaj kategorię"
 
 msgid "Fetch Wikipedia articles with coordinates"
 msgstr "Pobierz artykuły z Wikipedii ze współrzędnymi"
@@ -34692,7 +34729,7 @@ msgid ""
 "Adds a ''wikipedia'' tag corresponding to this article to the selected "
 "objects"
 msgstr ""
-"Dodaje tag „wikidata” powiązany z tym artykułem do zaznaczonych obiektów"
+"Dodaje do zaznaczonych obiektów znacznik „wikidata” powiązany z tym artykułem"
 
 msgid "The Ultimate WMS Super-speed Turbo Challenge II"
 msgstr "The Ultimate WMS Super-speed Turbo Challenge II"
diff --git a/i18n/po/pt.po b/i18n/po/pt.po
index 9371adc..7049fdb 100644
--- a/i18n/po/pt.po
+++ b/i18n/po/pt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-09-10 17:36+0000\n"
 "Last-Translator: Rui <xande6ruz at yandex.com>\n"
 "Language-Team: Portuguese <pt at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:08+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:08+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: pt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2225,6 +2225,12 @@ msgstr "Íman em ângulos ativado."
 msgid "Finish drawing."
 msgstr "Terminar o desenho."
 
+msgid "Angle snapping"
+msgstr "Ângulos com íman"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Mudar ângulo com íman ao desenhar"
+
 msgid "Toggle snapping by {0}"
 msgstr "Alternar alinhamento com {0}"
 
@@ -2249,12 +2255,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIXAR"
 
-msgid "Angle snapping"
-msgstr "Ângulos com íman"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Mudar ângulo com íman ao desenhar"
-
 msgid "Dual alignment"
 msgstr "Alinhamento duplo"
 
@@ -2738,6 +2738,9 @@ msgstr "use parêntesis para agrupar expressões"
 msgid "objects"
 msgstr "objetos"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "todas as linhas"
 
@@ -2809,6 +2812,9 @@ msgstr "todos os objetos selecionados"
 msgid "all incomplete objects"
 msgstr "todos os objetos incompletos"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objetos relacionados"
 
@@ -4559,34 +4565,32 @@ msgstr "O tipo de relação é desconhecido"
 msgid "Relation is empty"
 msgstr "A relação está vazia"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
-"A função de um membro da relação não corresponde à expressão {0} no modelo "
-"{1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"O tipo de função {0} não corresponde à lista de valores aceites de {1} no "
-"modelo {2}"
 
 msgid "<empty>"
 msgstr "<vazio>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Função {0} desconhecida nos modelos {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Tipo de função desconhecido em vez do esperado {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Falta a função {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Número de {0} funções insuficiente ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Número de {0} funções a mais ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Linhas que se cruzam entre si mesmas"
@@ -11994,7 +11998,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Data do trilho"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -12009,15 +12013,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "A pé"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Bosque"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16677,6 +16689,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase - Hidrografia"
 
@@ -17447,6 +17465,9 @@ msgstr "Fiez Ortofoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -25376,6 +25397,9 @@ msgstr "Linha de Árvores"
 msgid "A line of trees."
 msgstr "Linha de árvores."
 
+msgid "Wood"
+msgstr "Bosque"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 "Bosque no qual não é predominante a produção de madeira para uso comercial."
@@ -25737,6 +25761,9 @@ msgstr "Código postal"
 msgid "Country code"
 msgstr "Código do país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Nome da casa"
 
@@ -26555,8 +26582,8 @@ msgstr "{0} num nó. Deve ser usado numa linha."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} num nó. Deve ser usado numa área."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* num nó. Deve ser usado numa relação"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} numa linha. Deve ser usado num nó."
@@ -26651,9 +26678,6 @@ msgstr "tipo de estrada temporária (etiqueta road)"
 msgid "{0} used with {1}"
 msgstr "{0} usada em simultâneo com {1}"
 
-msgid "street name contains ss"
-msgstr "nome da rua contém ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26748,6 +26772,12 @@ msgstr "denominação religiosa muçulmana desconhecida"
 msgid "unknown jewish denomination"
 msgstr "denominação religiosa judaica desconhecida"
 
+msgid "street name contains ss"
+msgstr "nome da rua contém ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} não é necessária"
 
diff --git a/i18n/po/pt_BR.po b/i18n/po/pt_BR.po
index 64f8797..5469550 100644
--- a/i18n/po/pt_BR.po
+++ b/i18n/po/pt_BR.po
@@ -8,16 +8,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-04 23:23+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-26 01:52+0000\n"
 "Last-Translator: Nelson A. de Oliveira <naoliv at debian.org>\n"
 "Language-Team: Português Brasileiro <gnome-pt_br-list at gnome.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:20+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:19+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: pt_BR\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2193,6 +2193,12 @@ msgstr "Encaixar Ângulos ativo."
 msgid "Finish drawing."
 msgstr "Finalizar desenho."
 
+msgid "Angle snapping"
+msgstr "Encaixar ângulos"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Habilita/desabilita encaixe de ângulos"
+
 msgid "Toggle snapping by {0}"
 msgstr "Alternar encaixe por {0}"
 
@@ -2217,12 +2223,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "CORREÇÃO"
 
-msgid "Angle snapping"
-msgstr "Encaixar ângulos"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Habilita/desabilita encaixe de ângulos"
-
 msgid "Dual alignment"
 msgstr "Alinhamento duplo"
 
@@ -2704,6 +2704,9 @@ msgstr "use parênteses para agrupar expressões"
 msgid "objects"
 msgstr "objetos"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "todos os caminhos"
 
@@ -2773,6 +2776,9 @@ msgstr "todos os objetos selecionados"
 msgid "all incomplete objects"
 msgstr "todos os objetos incompletos"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "objetos relacionados"
 
@@ -4506,32 +4512,32 @@ msgstr "Tipo de relação é desconhecida"
 msgid "Relation is empty"
 msgstr "Relação está vazio"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Papel do membro não bate com a expressão {0} no template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Papel do membro do tipo {0} não bate com a lista aceita de {1} no template "
-"{2}."
 
 msgid "<empty>"
 msgstr "<vazio>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Papel {0} é desconhecido no template {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Papel vazio encontrado quando se esperava {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Regra {0} faltando"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Número de {0} funções muito baixo ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Número de {0} funções muito alto ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Vias que se auto-interceptam"
@@ -11866,7 +11872,7 @@ msgstr "Diluição da posição (vermelho = alta, verde = baixo, se disponível)
 msgid "Track date"
 msgstr "Data da trilha"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11881,15 +11887,23 @@ msgstr "Bicicleta"
 msgid "Foot"
 msgstr "A Pé"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Floresta"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16472,6 +16486,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrography"
 
@@ -17237,6 +17257,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -18234,10 +18257,10 @@ msgid "concrete"
 msgstr "concreto"
 
 msgid "concrete:plates"
-msgstr "placa de concreto"
+msgstr "placas de concreto"
 
 msgid "concrete:lanes"
-msgstr "faixa de concreto"
+msgstr "faixas de concreto"
 
 msgid "paving_stones"
 msgstr "piso intertravado"
@@ -18252,7 +18275,7 @@ msgid "grass_paver"
 msgstr "pisograma"
 
 msgid "compacted"
-msgstr "compactado"
+msgstr "solo compactado"
 
 msgid "fine_gravel"
 msgstr "cascalho fino"
@@ -18532,7 +18555,7 @@ msgid "italian"
 msgstr "italiana"
 
 msgid "chinese"
-msgstr "chinessa"
+msgstr "chinesa"
 
 msgid "pizza"
 msgstr "pizza"
@@ -21354,7 +21377,7 @@ msgid "Gate"
 msgstr "Portão"
 
 msgid "Facilities"
-msgstr "Facilidade"
+msgstr "Instalações"
 
 msgid "Accommodation"
 msgstr "Alojamento"
@@ -22104,7 +22127,7 @@ msgid "Volume (in liters)"
 msgstr "Volume (em litros)"
 
 msgid "Assembly Point"
-msgstr "Ponto de montagem"
+msgstr "Ponto de encontro"
 
 msgid "Emergency Phone"
 msgstr "Telefone de Emergência"
@@ -22551,10 +22574,10 @@ msgid "track"
 msgstr "pista"
 
 msgid "Nine-pin Bowling"
-msgstr "Boliche de nove pinos"
+msgstr "Bolão"
 
 msgid "Ten-pin Bowling"
-msgstr "Boliche de dez pinos"
+msgstr "Boliche"
 
 msgid "Archery"
 msgstr "Arco e Flecha"
@@ -24305,7 +24328,7 @@ msgid "Seafood"
 msgstr "Peixaria / Frutos do Mar"
 
 msgid "Dairy"
-msgstr ""
+msgstr "Laticínios"
 
 msgid "Deli (Fine Food)"
 msgstr "Deli (comida requintada)"
@@ -25064,7 +25087,7 @@ msgid "scoria"
 msgstr "cone de escórias"
 
 msgid "Ridge"
-msgstr "Cume"
+msgstr "Cumeeira"
 
 msgid "A mountain or hill ridge."
 msgstr "Uma montanha ou o cume de um monte."
@@ -25124,6 +25147,9 @@ msgstr "Fileira de árvores"
 msgid "A line of trees."
 msgstr "Uma linha de árvores."
 
+msgid "Wood"
+msgstr "Floresta"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Floresta onde a produção de madeira não é o uso dominante."
 
@@ -25488,6 +25514,9 @@ msgstr "CEP"
 msgid "Country code"
 msgstr "Código do país"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Complemento"
 
@@ -26113,7 +26142,7 @@ msgid "{0} without {1}"
 msgstr "{0} sem {1}"
 
 msgid "missing tag"
-msgstr ""
+msgstr "faltando etiqueta"
 
 msgid "{0} without {1} or {2}"
 msgstr "{0} sem {1} ou {2}"
@@ -26306,8 +26335,8 @@ msgstr "{0} em um nó. Deveria ser usado em uma via."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} em um nó. Deveria ser desenhado como uma área."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* em um nó. Deveria ser utilizado em uma relação"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} em uma linha. Deveria ser usado em um ponto."
@@ -26402,9 +26431,6 @@ msgstr "tipo de estrada temporária"
 msgid "{0} used with {1}"
 msgstr "{0} use com {1}"
 
-msgid "street name contains ss"
-msgstr "nome da ruas contem ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26499,6 +26525,12 @@ msgstr "denominação muçulmana desconhecida"
 msgid "unknown jewish denomination"
 msgstr "denominação judaica desconhecida"
 
+msgid "street name contains ss"
+msgstr "nome da ruas contem ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} é desnecessário"
 
diff --git a/i18n/po/rm.po b/i18n/po/rm.po
index 92f0073..62916f9 100644
--- a/i18n/po/rm.po
+++ b/i18n/po/rm.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-06-21 19:14+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Raeto-Romance <rm at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n !=1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:09+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:08+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ro.po b/i18n/po/ro.po
index e896c3a..e63963d 100644
--- a/i18n/po/ro.po
+++ b/i18n/po/ro.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: JOSM\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-02-24 11:34+0000\n"
 "Last-Translator: Ciprian <c1pr1an_43v3r at yahoo.com>\n"
 "Language-Team: Romanian <gnomero-list at lists.sourceforge.net>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
 "== 0) && (n != 0))) ? 2: 1));\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:10+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:09+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "X-Poedit-Country: ROMANIA\n"
 "Language: ro\n"
 "X-Poedit-Language: Romanian\n"
@@ -2070,6 +2070,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2094,12 +2100,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2534,6 +2534,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2602,6 +2605,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4190,29 +4196,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10852,7 +10860,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10867,15 +10875,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14971,6 +14987,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15733,6 +15755,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23446,6 +23471,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23796,6 +23824,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24596,7 +24627,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24692,9 +24723,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24782,6 +24810,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ru.po b/i18n/po/ru.po
index 7460739..e574111 100644
--- a/i18n/po/ru.po
+++ b/i18n/po/ru.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-06 18:58+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-26 06:13+0000\n"
 "Last-Translator: Aleksey Kabanov <Unknown>\n"
 "Language-Team: Koptev Oleg <koptev.oleg at gmail.com>\n"
 "MIME-Version: 1.0\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:10+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:10+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ru_RU\n"
 
 msgid "Use OAuth"
@@ -2220,6 +2220,12 @@ msgstr "Включена привязка к углам."
 msgid "Finish drawing."
 msgstr "Закончено вычерчивание."
 
+msgid "Angle snapping"
+msgstr "Привязка к углам"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Переключение режима привязки к углам во время черчения"
+
 msgid "Toggle snapping by {0}"
 msgstr "Переключение привязки {0}"
 
@@ -2244,12 +2250,6 @@ msgstr "0,30,45,60,90,…"
 msgid "FIX"
 msgstr "Фикс."
 
-msgid "Angle snapping"
-msgstr "Привязка к углам"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Переключение режима привязки к углам во время черчения"
-
 msgid "Dual alignment"
 msgstr "Двойное выравнивание"
 
@@ -2742,6 +2742,9 @@ msgstr "используйте круглые скобки для группир
 msgid "objects"
 msgstr "объекты"
 
+msgid "all nodes"
+msgstr "все точки"
+
 msgid "all ways"
 msgstr "все линии"
 
@@ -2813,6 +2816,9 @@ msgstr "все выбранные объекты"
 msgid "all incomplete objects"
 msgstr "все неполные объекты"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr "все удалённые объекты (должен стоять флажок <b>{0}</b>)"
+
 msgid "related objects"
 msgstr "связанные объекты"
 
@@ -4559,32 +4565,35 @@ msgstr "Неизвестный тип отношения"
 msgid "Relation is empty"
 msgstr "Пустое отношение"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Участник роли не соответствует выражению {0} в шаблоне {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
+"Роль участника отношения не соответствует выражению ''{0}'' в шаблоне {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Тип участника роли {0} не соответствует списку допустимых типов {1} в "
-"шаблоне {2}"
+"Тип ''{0}'' участника отношения с ролью ''{1}'' не соответствует типам "
+"''{2}'', принятым в шаблоне {3}"
 
 msgid "<empty>"
 msgstr "<пусто>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Роль {0} неизвестна в шаблонах {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Роль ''{0}'' неизвестна в шаблонах ''{1}''"
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Пустой тип роли, хотя ожидался один из {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Обнаружен пустой тип роли. Ожидался один из ''{0}''"
 
-msgid "Role {0} missing"
-msgstr "Отсутствует роль {0}"
+msgid "Role ''{0}'' missing"
+msgstr "Роль ''{0}'' отсутствует"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Количество ролей {0} слишком маленькое ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Количество ролей ''{0}'' слишком мало ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Количество ролей {0} слишком большое ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Количество ролей ''{0}'' слишком велико ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Линии, пересекающие сами себя"
@@ -11992,8 +12001,8 @@ msgstr ""
 msgid "Track date"
 msgstr "Дата трека"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Тепловая карта (тёмный = мало, светлый = много)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Одним цветом (может быть определено для именованных слоёв)"
@@ -12007,17 +12016,25 @@ msgstr "Вело"
 msgid "Foot"
 msgstr "Пешком"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Цвета пользователя"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Инферно"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Зелень"
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr "Лес"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Нагрев"
 
 msgid "Create markers when reading GPX"
 msgstr "Создать маркеры при чтении GPX"
@@ -12032,7 +12049,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Сглаживать GPX треки"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Рисовать с непрозрачностью (альфа-наложение) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -12104,6 +12121,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Применять динамическое альфа-наложение и подстройку ширины в зависимости от "
+"уровня масштабирования для всех GPX-треков."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -12131,12 +12150,14 @@ msgstr "Раскрасить точки и сегменты трека по ме
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Отображать плотность точек и сегментов треков в каждой позиции в виде "
+"тепловой карты."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr "Позволяет настраивать окраску трека для различных средних скоростей."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Выбор цветовой схемы для тепловой карты."
 
 msgid "Track and Point Coloring"
 msgstr "Раскрасить треки и точки"
@@ -16646,6 +16667,12 @@ msgstr "Рио, мозаика 2013"
 msgid "Rio Mosaic 2015"
 msgstr "Рио, мозаика 2015"
 
+msgid "Londrina Ortofoto 2011"
+msgstr "Лондрина - ортофото 2011"
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Санта-Катарина - OrtoRGB 2012"
+
 msgid "Geobase Hydrography"
 msgstr "Geobase (гидрография)"
 
@@ -16727,6 +16754,7 @@ msgstr "Снимки с imagico.de: вулкан Алтар"
 
 msgid "imagico.de OSM images for mapping: Darwin and Wolf islands, Galapagos"
 msgstr ""
+"Снимки с imagico.de: острова Дарвин (Кулпеппер) и Вулф (Уэнмен), Галапагос"
 
 msgid "Estonia Basemap (Maaamet)"
 msgstr "Эстония: базовая карта (Maaamet)"
@@ -17063,7 +17091,7 @@ msgid "Japan GSI ortho Imagery"
 msgstr "Япония: ортоснимки GSI"
 
 msgid "imagico.de OSM images for mapping: Mount Kenya 2016"
-msgstr ""
+msgstr "Снимки с imagico.de: гора Кения, 2016"
 
 msgid "USSR - Latvia"
 msgstr "СССР - Латвия"
@@ -17108,7 +17136,7 @@ msgid "Gaza Strip - Pléiades - 2014/07/06 (NIR)"
 msgstr "Сектор Газа - со спутников Pléiades - 06.07.2014 (NIR)"
 
 msgid "imagico.de OSM images for mapping: Panama Canal - Pacific side"
-msgstr ""
+msgstr "Снимки с imagico.de: Панамский канал - тихоокеанская сторона"
 
 msgid "imagico.de OSM images for mapping: Panama Canal"
 msgstr "Снимки с imagico.de: Панамский канал"
@@ -17120,7 +17148,7 @@ msgid "imagico.de OSM images for mapping: New Ireland"
 msgstr "Снимки с imagico.de: Новая Ирландия"
 
 msgid "imagico.de OSM images for mapping: Coropuna"
-msgstr ""
+msgstr "Снимки с imagico.de: Коропуна"
 
 msgid ""
 "imagico.de OSM images for mapping: Willkanuta Mountains and Quelccaya Ice Cap"
@@ -17275,7 +17303,7 @@ msgid ""
 msgstr "Снимки с imagico.de: Северный и Полярный Урал, август 2016"
 
 msgid "imagico.de OSM images for mapping: Vostochny Cosmodrome"
-msgstr ""
+msgstr "Снимки с imagico.de: космодром Восточный"
 
 msgid "Freemap.sk Car"
 msgstr "Freemap.sk (автомобильная)"
@@ -17344,7 +17372,7 @@ msgid "GRAFCAN Express - Canary Islands"
 msgstr "GRAFCAN Express - Канарские острова"
 
 msgid "imagico.de OSM images for mapping: Adams Bridge"
-msgstr ""
+msgstr "Снимки с imagico.de: Адамов Мост"
 
 msgid "Kanton Aargau 25cm (AGIS 2011)"
 msgstr "Кантон Аргау 25см (AGIS 2011)"
@@ -17416,8 +17444,11 @@ msgstr "Фиез - ортофото 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Кантон Базель-Штадт 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr "Кантон Базель - ландшафт 10см (2015)"
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
-msgstr ""
+msgstr "Снимки с imagico.de: Центральные Альпы,  конец сентября 2016"
 
 msgid "Taiwan e-Map Open Data"
 msgstr "Тайвань - e-Map Open Data"
@@ -17435,7 +17466,7 @@ msgid "NLSC Open Data WMTS"
 msgstr "NLSC Open Data WMTS"
 
 msgid "imagico.de OSM images for mapping: Mount Kilimanjaro 2016"
-msgstr ""
+msgstr "Снимки с imagico.de: Килиманджаро 2016"
 
 msgid "MSR Maps Topo"
 msgstr "MSR Maps Topo"
@@ -25311,6 +25342,9 @@ msgstr "Линия деревьев"
 msgid "A line of trees."
 msgstr "Ряд деревьев."
 
+msgid "Wood"
+msgstr "Лес"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Лес, основным назначением которого не является заготовка древесины."
 
@@ -25673,6 +25707,9 @@ msgstr "Почтовый индекс"
 msgid "Country code"
 msgstr "Код страны"
 
+msgid "Unit/Suite"
+msgstr "Блок/комплекс"
+
 msgid "House name"
 msgstr "Название дома"
 
@@ -26503,8 +26540,8 @@ msgstr "{0} на точке. Должен использоваться на ли
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} на точке. Должен быть нарисован как область."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* на точке. Следует использовать в отношении"
+msgid "{0} on a node. Should be used in a relation"
+msgstr "{0} на точке. Должен использоваться на отношении"
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} на линии. Следует использовать на точке."
@@ -26605,9 +26642,6 @@ msgstr "временный тип дороги"
 msgid "{0} used with {1}"
 msgstr "{0} использован с {1}"
 
-msgid "street name contains ss"
-msgstr "название улицы содержит ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 "{0} не рекомендуется, используйте {1}. Смотрите также подобные теги типа {2}"
@@ -26704,6 +26738,12 @@ msgstr "неизвестная мусульманская конфессия"
 msgid "unknown jewish denomination"
 msgstr "неизвестная конфессия иудаизма"
 
+msgid "street name contains ss"
+msgstr "название улицы содержит ss"
+
+msgid "street name contains ß"
+msgstr "название улицы содержит ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} не нужен"
 
diff --git a/i18n/po/sk.po b/i18n/po/sk.po
index f84ac44..8a4b398 100644
--- a/i18n/po/sk.po
+++ b/i18n/po/sk.po
@@ -9,16 +9,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-06 21:22+0000\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-28 23:42+0000\n"
 "Last-Translator: aceman444 <Unknown>\n"
 "Language-Team: Slovak <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:12+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:12+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: sk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2195,6 +2195,12 @@ msgstr "Zameriavanie uhlov je aktívne."
 msgid "Finish drawing."
 msgstr "Koniec kreslenia."
 
+msgid "Angle snapping"
+msgstr "Zameriavanie uhlov"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Zapnúť/vypnúť zameriavanie uhlov počas kreslenia"
+
 msgid "Toggle snapping by {0}"
 msgstr "Prepínať prichytenie s {0}"
 
@@ -2219,12 +2225,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "Zameriavanie uhlov"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Zapnúť/vypnúť zameriavanie uhlov počas kreslenia"
-
 msgid "Dual alignment"
 msgstr "Dvojité zarovnávanie"
 
@@ -2704,6 +2704,9 @@ msgstr "použiť zátvorky pre zoskupenie výrazov"
 msgid "objects"
 msgstr "objekty"
 
+msgid "all nodes"
+msgstr "všetky body"
+
 msgid "all ways"
 msgstr "všetky cesty"
 
@@ -2773,6 +2776,9 @@ msgstr "všetky vybraté objekty"
 msgid "all incomplete objects"
 msgstr "všetky nekompletné objekty"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr "všetky vymazané objekty (voľba <b>{0}</b> musí byť zapnutá)"
+
 msgid "related objects"
 msgstr "súvisiace objekty"
 
@@ -4385,7 +4391,7 @@ msgid "Multipolygon outer way shares segment(s) with other ring"
 msgstr "Vonkajšia cesta multipolygónu zdieľa úseky s vonkajšou oblasťou"
 
 msgid "No useful role for multipolygon member"
-msgstr "Žiadna platná funkcia pre člena multipolygónu"
+msgstr "Žiadna platná rola pre člena multipolygónu"
 
 msgid "Non-Way in multipolygon"
 msgstr "V multipolygóne je člen, ktorý nie je cestou"
@@ -4522,30 +4528,34 @@ msgstr "Neznámy typ relácie"
 msgid "Relation is empty"
 msgstr "Relácia je prázdna"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Člen nezodpovedá výrazu {0} v šablóne {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr "Rola člena relácie nezodpovedá výrazu \"{0}\" v šablóne {1}"
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr "Typ člena {0} nezodpovedá povolenému zoznamu {1} v šablóne {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
+msgstr ""
+"Typ \"{0}\" člena relácie s rolou \"{1}\" nezodpovedá akceptovaným typom "
+"\"{2}\" v šablóne {3}"
 
 msgid "<empty>"
 msgstr "<prázdny>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Rola {0} je neznáma v šablónach {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr "Rola \"{0}\" je neznáma v šablónach \"{1}\""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Našla sa prázdna rola, keď bola očakávaná jedna z {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr "Našla sa prázdna rola, avšak očakávaná bola jedna z \"{0}\""
 
-msgid "Role {0} missing"
-msgstr "Úloha \"{0}\" chýba"
+msgid "Role ''{0}'' missing"
+msgstr "Rola \"{0}\" chýba"
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Počet úloh \"{0}\" je príliš nízky ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr "Počet rolí typu \"{0}\" príliš nízky ({1})"
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Počet úloh \"{0}\" je príliš vysoký ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr "Počet rolí typu \"{0}\" príliš vysoký ({1})"
 
 msgid "Self-intersecting ways"
 msgstr "Cesty pretínajúce sami seba"
@@ -5945,13 +5955,14 @@ msgid "Undecide conflict between deleted state"
 msgstr "Nevyriešené konflikty medzi vymazávaným stavom"
 
 msgid "Role"
-msgstr "Funkcia"
+msgstr "Rola"
 
 msgid "Primitive"
 msgstr "Základný objekt"
 
 msgid "Merged members not frozen yet. Cannot build resolution command"
 msgstr ""
+"Zlúčené členy ešte nie sú ustálené. Nemôžem vytvoriť príkaz vyriešenia"
 
 msgid "<undefined>"
 msgstr "<nedefinované>"
@@ -6172,7 +6183,7 @@ msgid "Not decided yet"
 msgstr "Ešte nerozhodnuté"
 
 msgid "Role:"
-msgstr "Úloha:"
+msgstr "Rola:"
 
 msgid "Enter a role for all relation memberships"
 msgstr "Vložiť úlohu pre všetkých členov relácie"
@@ -6263,10 +6274,10 @@ msgid "Relation"
 msgstr "Relácia"
 
 msgid "Old role"
-msgstr "Stará funkcia"
+msgstr "Stará rola"
 
 msgid "New role"
-msgstr "Nová funkcia"
+msgstr "Nová rola"
 
 msgid "Old key"
 msgstr "Starý kľúč"
@@ -11891,8 +11902,8 @@ msgstr "Hustota pozícií (červená = vysoká, zelená = nízka, ak je dostupn
 msgid "Track date"
 msgstr "dátum stopy"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
-msgstr ""
+msgid "Heat Map (dark = few, bright = many)"
+msgstr "Teplotná mapa (tmavé = málo, svetlé = veľa)"
 
 msgid "Single Color (can be customized for named layers)"
 msgstr "Jedna farba (môže byť prispôsobená pre pomenované vrstvy)"
@@ -11906,17 +11917,25 @@ msgstr "Bicykel"
 msgid "Foot"
 msgstr "Pešo"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr "Používateľom definovaný"
+
+msgctxt "Heat map"
 msgid "Inferno"
-msgstr ""
+msgstr "Inferno"
 
+msgctxt "Heat map"
 msgid "Viridis"
-msgstr ""
+msgstr "Viridis"
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Prírodný les"
+msgstr "Wood"
 
+msgctxt "Heat map"
 msgid "Heat"
-msgstr ""
+msgstr "Heat"
 
 msgid "Create markers when reading GPX"
 msgstr "Vytvoriť značky(markers) pri načítaní GPX"
@@ -11931,7 +11950,7 @@ msgid "Smooth GPX graphics (antialiasing)"
 msgstr "Vyhladiť GPX grafiku (antialiasing)"
 
 msgid "Draw with Opacity (alpha blending) "
-msgstr ""
+msgstr "Kresliť s priehľadnosťou (alpha blending) "
 
 msgid ""
 "Automatically make a marker layer from any waypoints when opening a GPX "
@@ -12005,6 +12024,8 @@ msgid ""
 "Apply dynamic alpha-blending and adjust width based on zoom level for all "
 "GPX lines."
 msgstr ""
+"Aplikovať dynamické zlúčenie farieb a prispôsobiť šírku podľa priblíženia "
+"pre všetky čiary GPX."
 
 msgid ""
 "All points and track segments will have the same color. Can be customized in "
@@ -12032,6 +12053,7 @@ msgstr "Vyfarbiť body a vyznačiť časovú značku segmentov."
 msgid ""
 "Collected points and track segments for a position and displayed as heat map."
 msgstr ""
+"Zozbierané body a úseky trasy pre pozíciu a zobrazené ako teplotná mapa."
 
 msgid "Allows to tune the track coloring for different average speeds."
 msgstr ""
@@ -12039,7 +12061,7 @@ msgstr ""
 "rýchlostí."
 
 msgid "Selects the color schema for heat map."
-msgstr ""
+msgstr "Zvoľte farebnú schému pre teplotnú mapu."
 
 msgid "Track and Point Coloring"
 msgstr "Farebná trať a body"
@@ -14515,9 +14537,9 @@ msgid ""
 "server. <strong>Do not use a valuable password.</strong></p></body></html>"
 msgstr ""
 "<html> <body> <p class=\"warning-body\"> <strong>Upozornenie:</strong> Heslo "
-"je uložené vo formáte obyčajného textu v JOSM súbore nastavení. Okrem toho "
-"sa prevádza <strong>nešifrované</strong> v každej žiadosti zaslanej na "
-"server OSM. <strong>Nepoužívajte cenné heslo.</strong></p></body></html>"
+"je uložené vo formáte obyčajného textu v súbore nastavení JOSM. Okrem toho "
+"sa zasiela <strong>nešifrované</strong> v každej žiadosti zaslanej na server "
+"OSM. <strong>Nepoužívajte cenné heslo.</strong></p></body></html>"
 
 msgid "Save user and password (unencrypted)"
 msgstr "Uložiť meno a heslo (nešifrovane)"
@@ -16564,6 +16586,12 @@ msgstr "Rio Mosaic 2013"
 msgid "Rio Mosaic 2015"
 msgstr "Rio Mosaic 2015"
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr "SIG Santa Catarina OrtoRGB 2012"
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Hydrografia"
 
@@ -17334,6 +17362,9 @@ msgstr "Fiez Ortofoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Kanton Basel-Stadt 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -17851,7 +17882,7 @@ msgid "Fast drawing ways by mouse"
 msgstr "Rýchle kreslenie línií pomocou myši"
 
 msgid "Finds and fixes invalid street addresses in a comfortable way."
-msgstr "Vyhľadáva a opravuje neplatné uličné adresy pohodlným spôsobom."
+msgstr "Vyhľadáva a opravuje neplatné adresy domov pohodlným spôsobom."
 
 msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
@@ -25203,6 +25234,9 @@ msgstr "Stromoradie"
 msgid "A line of trees."
 msgstr "Rad stromov."
 
+msgid "Wood"
+msgstr "Prírodný les"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Lesný porast, kde nie je hlavným účelom ťažba dreva."
 
@@ -25565,6 +25599,9 @@ msgstr "Poštové smerovacie číslo"
 msgid "Country code"
 msgstr "Kód krajiny"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Meno domu"
 
@@ -26389,8 +26426,8 @@ msgstr "{0} na bode. Malo by byť použité na ceste."
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} na bode. Malo by byť zakreslené ako oblasť."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* na bode. Malo by byť použité v relácii"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} na ceste. Malo by byť použité na bode."
@@ -26489,9 +26526,6 @@ msgstr "dočasný typ cesty"
 msgid "{0} used with {1}"
 msgstr "{0} použité s {1}"
 
-msgid "street name contains ss"
-msgstr "názov ulice obsahuje ss (Nemecko)"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 "{0} je zastaralé, použite namiesto toho {1}. Tiež pozrite podobné značky ako "
@@ -26592,6 +26626,12 @@ msgstr "neznáma moslimská \"denomination\""
 msgid "unknown jewish denomination"
 msgstr "neznáma židovská \"denomination\""
 
+msgid "street name contains ss"
+msgstr "názov ulice obsahuje ss (Nemecko)"
+
+msgid "street name contains ß"
+msgstr "názov ulice obsahuje ß"
+
 msgid "{0} is unnecessary"
 msgstr "{0} je nepotrebné"
 
@@ -30752,9 +30792,8 @@ msgid ""
 "<html>A role based relation membership was copied to all new ways.<br>You "
 "should verify this and correct it when necessary.</html>"
 msgstr ""
-"<html>Funkcia umiestnená v relačnom člene bola skopírovaná do všetkých "
-"nových ciest.<br>Mali by ste toto potvrdiť a opraviť to ak je to "
-"potrebné.</html>"
+"<html>Rola člena v relácii bola skopírovaná na všetky nové cesty.<br>Mali by "
+"ste toto overiť a opraviť ak je to potrebné.</html>"
 
 msgid ""
 "<html>A relation membership was copied to all new ways.<br>You should verify "
diff --git a/i18n/po/sl.po b/i18n/po/sl.po
index a09c4ed..ed19964 100644
--- a/i18n/po/sl.po
+++ b/i18n/po/sl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-11-07 17:38+0000\n"
 "Last-Translator: Joško Horvat <Unknown>\n"
 "Language-Team: Slovenian <sl at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
 "n%100==4 ? 3 : 0);\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:13+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:12+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: sl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2034,6 +2034,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr "Zaključi risanje."
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2058,12 +2064,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2498,6 +2498,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2566,6 +2569,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4160,29 +4166,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10842,7 +10850,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10857,15 +10865,23 @@ msgstr "Kolo"
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14972,6 +14988,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15734,6 +15756,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23447,6 +23472,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23797,6 +23825,9 @@ msgstr "Poštna številka"
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24597,7 +24628,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24693,9 +24724,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24783,6 +24811,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/sq.po b/i18n/po/sq.po
index 6aa879b..bb6bc1a 100644
--- a/i18n/po/sq.po
+++ b/i18n/po/sq.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-11-04 19:43+0000\n"
 "Last-Translator: StefanPrifti <Unknown>\n"
 "Language-Team: FLOSS Kosova\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 04:34+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 04:34+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/sr.po b/i18n/po/sr.po
index 5a52aae..22ca7cb 100644
--- a/i18n/po/sr.po
+++ b/i18n/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-02-01 15:30+0000\n"
 "Last-Translator: Slobodan Simić <Unknown>\n"
 "Language-Team: Serbian <sr at li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:11+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:10+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: sr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2021,6 +2021,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2045,12 +2051,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2485,6 +2485,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2553,6 +2556,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4137,29 +4143,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10794,7 +10802,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10809,15 +10817,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14910,6 +14926,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15672,6 +15694,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23385,6 +23410,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23735,6 +23763,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24535,7 +24566,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24631,9 +24662,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24721,6 +24749,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/sv.po b/i18n/po/sv.po
index b37cb35..1632358 100644
--- a/i18n/po/sv.po
+++ b/i18n/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-10-08 14:18+0000\n"
 "Last-Translator: Niklas Henriksson <fringillus92 at gmail.com>\n"
 "Language-Team: Swedish <sv at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:14+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:13+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: sv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2163,6 +2163,12 @@ msgstr "Vinkellåsning aktiv."
 msgid "Finish drawing."
 msgstr "Avsluta ritning."
 
+msgid "Angle snapping"
+msgstr "Vinkellåsning"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Ändra vinkelfästningsläge medan du ritar"
+
 msgid "Toggle snapping by {0}"
 msgstr "Växla länkning med {0}"
 
@@ -2187,12 +2193,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIXA"
 
-msgid "Angle snapping"
-msgstr "Vinkellåsning"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Ändra vinkelfästningsläge medan du ritar"
-
 msgid "Dual alignment"
 msgstr "Parallel linjering"
 
@@ -2672,6 +2672,9 @@ msgstr "använd parentes för att gruppera uttryck"
 msgid "objects"
 msgstr "objekt"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "alla sträckor"
 
@@ -2742,6 +2745,9 @@ msgstr "alla valda objekt"
 msgid "all incomplete objects"
 msgstr "alla ofullständiga objekt"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "liknande objekt"
 
@@ -4421,29 +4427,31 @@ msgstr "Relationstypen är okänd"
 msgid "Relation is empty"
 msgstr "Relationen är tom"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<tom>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Rollen {0} saknas"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -11266,7 +11274,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11281,15 +11289,23 @@ msgstr "Cykel"
 msgid "Foot"
 msgstr "Fotgängare"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Naturskog"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15528,6 +15544,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -16290,6 +16312,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24029,6 +24054,9 @@ msgstr "Allé"
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Naturskog"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Skog där timmerproduktion inte är huvudsakligt användningsområde."
 
@@ -24390,6 +24418,9 @@ msgstr "Postnummer"
 msgid "Country code"
 msgstr "Landskod"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Husnamn"
 
@@ -25190,7 +25221,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -25286,9 +25317,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -25378,6 +25406,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ta.po b/i18n/po/ta.po
index 758b84a..7361451 100644
--- a/i18n/po/ta.po
+++ b/i18n/po/ta.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-10-28 15:55+0000\n"
 "Last-Translator: நவலடி <navaladi at gmail.com>\n"
 "Language-Team: Tamil <ta at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:15+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:14+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "X-Poedit-Country: INDIA\n"
 "Language: ta\n"
 "X-Poedit-Language: Tamil\n"
@@ -2056,6 +2056,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2080,12 +2086,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2520,6 +2520,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2588,6 +2591,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4172,29 +4178,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10831,7 +10839,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10846,15 +10854,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14947,6 +14963,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15709,6 +15731,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23422,6 +23447,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23772,6 +23800,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24572,7 +24603,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24668,9 +24699,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24758,6 +24786,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/te.po b/i18n/po/te.po
index d0e13fe..93d3195 100644
--- a/i18n/po/te.po
+++ b/i18n/po/te.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2011-05-13 08:50+0000\n"
 "Last-Translator: Praveen Illa <mail2ipn at gmail.com>\n"
 "Language-Team: Telugu <te at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:15+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:15+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: te\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/th.po b/i18n/po/th.po
index 87d7063..b7047ad 100644
--- a/i18n/po/th.po
+++ b/i18n/po/th.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2009-03-23 02:34+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Thai <th at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:16+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:15+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: th\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/tr.po b/i18n/po/tr.po
index bbf32ad..aec53d8 100644
--- a/i18n/po/tr.po
+++ b/i18n/po/tr.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-11-16 12:04+0000\n"
 "Last-Translator: Erkin Alp Güney <Unknown>\n"
 "Language-Team: Türkçe <>\n"
@@ -17,8 +17,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:17+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:16+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2064,6 +2064,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2088,12 +2094,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2533,6 +2533,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2601,6 +2604,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4192,29 +4198,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10880,7 +10888,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10895,15 +10903,23 @@ msgstr "Bisiklet"
 msgid "Foot"
 msgstr "Ayak"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Orman"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15013,6 +15029,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15775,6 +15797,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23488,6 +23513,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr "Orman"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23838,6 +23866,9 @@ msgstr "Posta kodu"
 msgid "Country code"
 msgstr "Ülke kodu"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Ev adı"
 
@@ -24638,7 +24669,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24734,9 +24765,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24824,6 +24852,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/ug.po b/i18n/po/ug.po
index d3ae47a..c728e19 100644
--- a/i18n/po/ug.po
+++ b/i18n/po/ug.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2012-07-14 16:22+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: Uyghur <ug at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:17+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:16+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/uk.po b/i18n/po/uk.po
index 273682c..82eec39 100644
--- a/i18n/po/uk.po
+++ b/i18n/po/uk.po
@@ -7,17 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
-"PO-Revision-Date: 2017-01-06 20:19+0000\n"
-"Last-Translator: Don-vip <Unknown>\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
+"PO-Revision-Date: 2017-01-30 06:21+0000\n"
+"Last-Translator: ~Jhellico <Unknown>\n"
 "Language-Team: Ukrainian <uk at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:18+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:17+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: uk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -73,7 +73,7 @@ msgid "Initializing OSM API"
 msgstr "Ініціалізація OSM API"
 
 msgid "Initializing internal traffic data"
-msgstr "Ініціалізація даних про внутрішній правила дорожнього руху"
+msgstr "Ініціалізація даних про внутрішні правила дорожнього руху"
 
 msgid "Initializing validator"
 msgstr "Ініціалізація валідатора"
@@ -2215,6 +2215,12 @@ msgstr "Прив’язку до кутів активовано."
 msgid "Finish drawing."
 msgstr "Закінчити креслення."
 
+msgid "Angle snapping"
+msgstr "Прив’язка до кутів"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Перемикати режим прив’язки до кутів під час креслення"
+
 msgid "Toggle snapping by {0}"
 msgstr "Переключити прив’язку до {0}"
 
@@ -2239,12 +2245,6 @@ msgstr "0,30,45,60,90,…"
 msgid "FIX"
 msgstr "Фікс."
 
-msgid "Angle snapping"
-msgstr "Прив’язка до кутів"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Перемикати режим прив’язки до кутів під час креслення"
-
 msgid "Dual alignment"
 msgstr "Подвійне вирювнювання"
 
@@ -2735,6 +2735,9 @@ msgstr "використовуйте дужки для групування ви
 msgid "objects"
 msgstr "об’єкти"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "всі лінії"
 
@@ -2806,6 +2809,9 @@ msgstr "усі виділені об’єкти"
 msgid "all incomplete objects"
 msgstr "усі неповні об’єкти"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "пов’язані об’єкти"
 
@@ -4550,31 +4556,32 @@ msgstr "Тип зв’язку невідомий"
 msgid "Relation is empty"
 msgstr "Зв’язок порожній"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Роль члена не відповідає виразу {0} в шаблоні {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Роль члена типу {0} не сходиться з прийнятим переліком з {1} в шаблоні {2}"
 
 msgid "<empty>"
 msgstr "<порожньо>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Роль {0} відсутня в шаблоні {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "Знайдено незаповнений тип ролі, в той час як очікується один з {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Відсутня роль {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Кількість ролей {0} замала ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Кількість ролей {0} завелика ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "Лінії, що перетинають самі себе"
@@ -11944,7 +11951,7 @@ msgstr ""
 msgid "Track date"
 msgstr "Дата треку"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11959,15 +11966,23 @@ msgstr "Велосипед"
 msgid "Foot"
 msgstr "Пішки"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Дерева"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16608,6 +16623,12 @@ msgstr "Ріо - мозаїка 2013"
 msgid "Rio Mosaic 2015"
 msgstr "Ріо - мозаїка 2013"
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Гідрографія"
 
@@ -17383,6 +17404,9 @@ msgstr "Фієз - ортофото 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr "Кантон Базель-Штадт 2015"
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -25278,6 +25302,9 @@ msgstr "Ряд дерев"
 msgid "A line of trees."
 msgstr "Дерева в рядок."
 
+msgid "Wood"
+msgstr "Дерева"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 "Лісиста місцевість, в якій лісозаготівля не є основним видом діяльності."
@@ -25643,6 +25670,9 @@ msgstr "Поштовий індекс"
 msgid "Country code"
 msgstr "Код країни"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "Назва будинку"
 
@@ -26474,8 +26504,8 @@ msgstr "{0} на точці. Слід застосовувати до лінії
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} на точці. Слід застосовувати до полігону."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* на точці. Потрібно використовувати у зв’язку"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} на лінії, замість точки."
@@ -26576,9 +26606,6 @@ msgstr "дороги із тимчасовим типом (road)"
 msgid "{0} used with {1}"
 msgstr "{0} використаний разом з {1}"
 
-msgid "street name contains ss"
-msgstr "назва вулиці містить ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 "{0} є застарілим, використовуйте {1}. Крім того, перевірте подібні теґи, "
@@ -26678,6 +26705,12 @@ msgstr "невідоме мусульманське віросповідання
 msgid "unknown jewish denomination"
 msgstr "невідоме іудейське віросповідання"
 
+msgid "street name contains ss"
+msgstr "назва вулиці містить ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} є непотрібним"
 
diff --git a/i18n/po/ur.po b/i18n/po/ur.po
index 7314761..e0ef37a 100644
--- a/i18n/po/ur.po
+++ b/i18n/po/ur.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2010-05-13 04:15+0000\n"
 "Last-Translator: Shoaib Mirza <Unknown>\n"
 "Language-Team: Urdu <ur at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:18+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:18+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: ur\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2020,6 +2020,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2044,12 +2050,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2484,6 +2484,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2552,6 +2555,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4136,29 +4142,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10792,7 +10800,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10807,15 +10815,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14908,6 +14924,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15670,6 +15692,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23383,6 +23408,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23733,6 +23761,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24533,7 +24564,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24629,9 +24660,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24719,6 +24747,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/vi.po b/i18n/po/vi.po
index 18f5224..ae66d32 100644
--- a/i18n/po/vi.po
+++ b/i18n/po/vi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2015-05-14 20:17+0000\n"
 "Last-Translator: Mạnh <laituanmanh32 at gmail.com>\n"
 "Language-Team: Vietnamese <vi at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:19+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:18+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: vi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2150,6 +2150,12 @@ msgstr "Góc chụp hoạt động."
 msgid "Finish drawing."
 msgstr "Hoàn thành bản vẽ."
 
+msgid "Angle snapping"
+msgstr "góc chụp"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "Switch góc chụp chế độ trong khi vẽ"
+
 msgid "Toggle snapping by {0}"
 msgstr "Toggle chụp bởi {0}"
 
@@ -2174,12 +2180,6 @@ msgstr "0,30,45,60,90, ..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "góc chụp"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "Switch góc chụp chế độ trong khi vẽ"
-
 msgid "Dual alignment"
 msgstr "Dual chỉnh"
 
@@ -2651,6 +2651,9 @@ msgstr "sử dụng dấu ngoặc đơn để biểu thức nhóm"
 msgid "objects"
 msgstr "đối tượng"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "mọi cách"
 
@@ -2719,6 +2722,9 @@ msgstr "tất cả các đối tượng được chọn"
 msgid "all incomplete objects"
 msgstr "tất cả các đối tượng không đầy đủ"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "các đối tượng liên quan"
 
@@ -4393,32 +4399,32 @@ msgstr "kiểu quan hệ là không rõ"
 msgid "Relation is empty"
 msgstr "Relation là trống rỗng"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "Vai trò thành viên không phù hợp {0} biểu hiện trong mẫu {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
-"Vai trò thành viên loại {0} không phù hợp với danh sách được chấp nhận {1} "
-"trong mẫu {2}"
 
 msgid "<empty>"
 msgstr "<trống>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "Vai trò {0} không rõ trong các mẫu {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "loại vai trò rỗng được tìm thấy khi chờ đợi một trong {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "Vai trò {0} mất tích"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "Số {0} vai trò quá thấp ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "Số {0} vai trò quá cao ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "cách tự giao nhau"
@@ -11544,7 +11550,7 @@ msgstr "loãng Chức vụ (red = cao, màu xanh lá cây = thấp, nếu có)"
 msgid "Track date"
 msgstr "ngày Track"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -11559,15 +11565,23 @@ msgstr "xe đạp"
 msgid "Foot"
 msgstr "chân"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "Gỗ"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -16041,6 +16055,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr "Geobase Thủy"
 
@@ -16805,6 +16825,9 @@ msgstr "Fiez Orthophoto 2013"
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -24663,6 +24686,9 @@ msgstr "Tree Row"
 msgid "A line of trees."
 msgstr "Một hàng cây."
 
+msgid "Wood"
+msgstr "Gỗ"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr "Woodland nơi sản xuất gỗ không thống trị sử dụng."
 
@@ -25026,6 +25052,9 @@ msgstr "Mã bưu điện"
 msgid "Country code"
 msgstr "Mã quốc gia"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "House tên"
 
@@ -25843,8 +25872,8 @@ msgstr "{0} trên một nút. Nên được sử dụng trên một con đườn
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} trên một nút. nên được rút ra như là một khu vực."
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0} = * trên một nút. Nên được sử dụng trong một mối quan hệ"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} trên một cách. Nên được sử dụng trên một nút."
@@ -25939,9 +25968,6 @@ msgstr "đường cao tốc loại tạm thời"
 msgid "{0} used with {1}"
 msgstr "{0} được sử dụng với {1}"
 
-msgid "street name contains ss"
-msgstr "tên đường phố chứa ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -26034,6 +26060,12 @@ msgstr "không rõ mệnh giá muslim"
 msgid "unknown jewish denomination"
 msgstr "không rõ giáo phái Do Thái"
 
+msgid "street name contains ss"
+msgstr "tên đường phố chứa ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr "{0} là không cần thiết"
 
diff --git a/i18n/po/wae.po b/i18n/po/wae.po
index 7223aca..eff5425 100644
--- a/i18n/po/wae.po
+++ b/i18n/po/wae.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL at ADDRESS>\n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-03-09 22:17+0000\n"
 "Last-Translator: Simon Legner <Unknown>\n"
 "Language-Team: Walser <wae at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:25+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:24+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2019,6 +2019,12 @@ msgstr ""
 msgid "Finish drawing."
 msgstr ""
 
+msgid "Angle snapping"
+msgstr ""
+
+msgid "Switch angle snapping mode while drawing"
+msgstr ""
+
 msgid "Toggle snapping by {0}"
 msgstr ""
 
@@ -2043,12 +2049,6 @@ msgstr ""
 msgid "FIX"
 msgstr ""
 
-msgid "Angle snapping"
-msgstr ""
-
-msgid "Switch angle snapping mode while drawing"
-msgstr ""
-
 msgid "Dual alignment"
 msgstr ""
 
@@ -2483,6 +2483,9 @@ msgstr ""
 msgid "objects"
 msgstr ""
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr ""
 
@@ -2551,6 +2554,9 @@ msgstr ""
 msgid "all incomplete objects"
 msgstr ""
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4135,29 +4141,31 @@ msgstr ""
 msgid "Relation is empty"
 msgstr ""
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr ""
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
+msgid "Role ''{0}'' missing"
 msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
 msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
 msgstr ""
 
 msgid "Self-intersecting ways"
@@ -10791,7 +10799,7 @@ msgstr ""
 msgid "Track date"
 msgstr ""
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10806,15 +10814,23 @@ msgstr ""
 msgid "Foot"
 msgstr ""
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14907,6 +14923,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15669,6 +15691,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23382,6 +23407,9 @@ msgstr ""
 msgid "A line of trees."
 msgstr ""
 
+msgid "Wood"
+msgstr ""
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23732,6 +23760,9 @@ msgstr ""
 msgid "Country code"
 msgstr ""
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr ""
 
@@ -24532,7 +24563,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24628,9 +24659,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24718,6 +24746,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/zh_CN.po b/i18n/po/zh_CN.po
index aae26ec..af920e3 100644
--- a/i18n/po/zh_CN.po
+++ b/i18n/po/zh_CN.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2016-10-23 14:49+0000\n"
 "Last-Translator: mmyfl <Unknown>\n"
 "Language-Team: 汉语 <>\n"
@@ -18,8 +18,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:23+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:22+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: zh_CN\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2018,6 +2018,12 @@ msgstr "角度对齐活动中。"
 msgid "Finish drawing."
 msgstr "结束绘制。"
 
+msgid "Angle snapping"
+msgstr "角度对齐"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "绘制时切换角度对齐模式。"
+
 msgid "Toggle snapping by {0}"
 msgstr "切换 {0} 贴紧"
 
@@ -2042,12 +2048,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "修正"
 
-msgid "Angle snapping"
-msgstr "角度对齐"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "绘制时切换角度对齐模式。"
-
 msgid "Dual alignment"
 msgstr "双对齐"
 
@@ -2488,6 +2488,9 @@ msgstr "用括号把表达式分组"
 msgid "objects"
 msgstr "对象"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "所有路径"
 
@@ -2556,6 +2559,9 @@ msgstr "所有选定的对象"
 msgid "all incomplete objects"
 msgstr "所有不完整的对象"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr "相关对象"
 
@@ -4130,30 +4136,32 @@ msgstr "关系类型不明"
 msgid "Relation is empty"
 msgstr "关系是空白的"
 
-msgid "Role member does not match expression {0} in template {1}"
-msgstr "成员角色与模板{1}的表达式{0}不匹配"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
+msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
-msgstr "成员角色类型{0}与模板{2}中可接受的列表{1}不匹配"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
+msgstr ""
 
 msgid "<empty>"
 msgstr "<空白>"
 
-msgid "Role {0} unknown in templates {1}"
-msgstr "模板{1}中的未知角色{0}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
+msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
-msgstr "应取{0}中的一个值,但实际上未选择角色类型"
+msgid "Empty role type found when expecting one of ''{0}''"
+msgstr ""
 
-msgid "Role {0} missing"
-msgstr "缺少角色 {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} 角色的编号太低({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} 角色的编号太高({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "自我交叉的路径"
@@ -10859,7 +10867,7 @@ msgstr "位置的稀疏度(红 = 高,绿 = 低,如果可用的话)"
 msgid "Track date"
 msgstr "轨迹日期"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10874,15 +10882,23 @@ msgstr "单车"
 msgid "Foot"
 msgstr "步行"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "树林"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -15012,6 +15028,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15774,6 +15796,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23489,6 +23514,9 @@ msgstr "树排"
 msgid "A line of trees."
 msgstr "一排树。"
 
+msgid "Wood"
+msgstr "树林"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23839,6 +23867,9 @@ msgstr "邮政编号"
 msgid "Country code"
 msgstr "国家代码"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "房屋名称"
 
@@ -24639,8 +24670,8 @@ msgstr "{0} 在节点上。应用于路径上。"
 msgid "{0} on a node. Should be drawn as an area."
 msgstr "{0} 在节点上。应绘为区域。"
 
-msgid "{0}=* on a node. Should be used in a relation"
-msgstr "{0}=* 在节点上。应用于关系中。"
+msgid "{0} on a node. Should be used in a relation"
+msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
 msgstr "{0} 在路径上。应用于节点上。"
@@ -24735,9 +24766,6 @@ msgstr "临时公路类型"
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr "街道名称中含有 ss"
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24825,6 +24853,12 @@ msgstr "未知穆斯林教派"
 msgid "unknown jewish denomination"
 msgstr "未知犹太教教派"
 
+msgid "street name contains ss"
+msgstr "街道名称中含有 ss"
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/i18n/po/zh_TW.po b/i18n/po/zh_TW.po
index 2a99fea..005bbd5 100644
--- a/i18n/po/zh_TW.po
+++ b/i18n/po/zh_TW.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-07 03:43+0100\n"
+"POT-Creation-Date: 2017-01-31 03:41+0100\n"
 "PO-Revision-Date: 2017-01-01 07:07+0000\n"
 "Last-Translator: Sean Young <assanges at gmail.com>\n"
 "Language-Team: Traditional Chinese\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2017-01-07 05:22+0000\n"
-"X-Generator: Launchpad (build 18302)\n"
+"X-Launchpad-Export-Date: 2017-01-31 05:21+0000\n"
+"X-Generator: Launchpad (build 18315)\n"
 "Language: zh_TW\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2016,6 +2016,12 @@ msgstr "貼齊角度已生效。"
 msgid "Finish drawing."
 msgstr "結束繪製。"
 
+msgid "Angle snapping"
+msgstr "角度貼齊"
+
+msgid "Switch angle snapping mode while drawing"
+msgstr "繪製時切換角度貼齊模式"
+
 msgid "Toggle snapping by {0}"
 msgstr "切換依 {0} 貼齊"
 
@@ -2040,12 +2046,6 @@ msgstr "0,30,45,60,90,..."
 msgid "FIX"
 msgstr "FIX"
 
-msgid "Angle snapping"
-msgstr "角度貼齊"
-
-msgid "Switch angle snapping mode while drawing"
-msgstr "繪製時切換角度貼齊模式"
-
 msgid "Dual alignment"
 msgstr "雙向對齊"
 
@@ -2480,6 +2480,9 @@ msgstr ""
 msgid "objects"
 msgstr "物件"
 
+msgid "all nodes"
+msgstr ""
+
 msgid "all ways"
 msgstr "所有路徑"
 
@@ -2548,6 +2551,9 @@ msgstr "所有選取的物件"
 msgid "all incomplete objects"
 msgstr "所有不完整的物件"
 
+msgid "all deleted objects (checkbox <b>{0}</b> must be enabled)"
+msgstr ""
+
 msgid "related objects"
 msgstr ""
 
@@ -4123,30 +4129,32 @@ msgstr "關係類型不明"
 msgid "Relation is empty"
 msgstr "關係是空白的"
 
-msgid "Role member does not match expression {0} in template {1}"
+msgid ""
+"Role of relation member does not match expression ''{0}'' in template {1}"
 msgstr ""
 
 msgid ""
-"Role member type {0} does not match accepted list of {1} in template {2}"
+"Type ''{0}'' of relation member with role ''{1}'' does not match accepted "
+"types ''{2}'' in template {3}"
 msgstr ""
 
 msgid "<empty>"
 msgstr "<空白>"
 
-msgid "Role {0} unknown in templates {1}"
+msgid "Role ''{0}'' unknown in templates ''{1}''"
 msgstr ""
 
-msgid "Empty role type found when expecting one of {0}"
+msgid "Empty role type found when expecting one of ''{0}''"
 msgstr ""
 
-msgid "Role {0} missing"
-msgstr "缺少角色 {0}"
+msgid "Role ''{0}'' missing"
+msgstr ""
 
-msgid "Number of {0} roles too low ({1})"
-msgstr "{0} 角色的編號太低 ({1})"
+msgid "Number of ''{0}'' roles too low ({1})"
+msgstr ""
 
-msgid "Number of {0} roles too high ({1})"
-msgstr "{0} 角色的編號太高 ({1})"
+msgid "Number of ''{0}'' roles too high ({1})"
+msgstr ""
 
 msgid "Self-intersecting ways"
 msgstr "自我交叉的路徑"
@@ -10811,7 +10819,7 @@ msgstr "位置的準確誤差(紅 = 高,綠 = 低,如果可用的話)"
 msgid "Track date"
 msgstr "軌跡時間"
 
-msgid "Heat Map (dark = few tracks, bright = many tracks)"
+msgid "Heat Map (dark = few, bright = many)"
 msgstr ""
 
 msgid "Single Color (can be customized for named layers)"
@@ -10826,15 +10834,23 @@ msgstr "單車"
 msgid "Foot"
 msgstr "步行"
 
+msgctxt "Heat map"
+msgid "User"
+msgstr ""
+
+msgctxt "Heat map"
 msgid "Inferno"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Viridis"
 msgstr ""
 
+msgctxt "Heat map"
 msgid "Wood"
-msgstr "樹林"
+msgstr ""
 
+msgctxt "Heat map"
 msgid "Heat"
 msgstr ""
 
@@ -14957,6 +14973,12 @@ msgstr ""
 msgid "Rio Mosaic 2015"
 msgstr ""
 
+msgid "Londrina Ortofoto 2011"
+msgstr ""
+
+msgid "SIG Santa Catarina OrtoRGB 2012"
+msgstr ""
+
 msgid "Geobase Hydrography"
 msgstr ""
 
@@ -15719,6 +15741,9 @@ msgstr ""
 msgid "Kanton Basel-Stadt 2015"
 msgstr ""
 
+msgid "Kanton Basel-Landschaft 10cm (2015)"
+msgstr ""
+
 msgid "imagico.de OSM images for mapping: Cental Alps in late September 2016"
 msgstr ""
 
@@ -23434,6 +23459,9 @@ msgstr "一排樹"
 msgid "A line of trees."
 msgstr "一排樹"
 
+msgid "Wood"
+msgstr "樹林"
+
 msgid "Woodland where timber production does not dominate use."
 msgstr ""
 
@@ -23784,6 +23812,9 @@ msgstr "郵遞區號"
 msgid "Country code"
 msgstr "國碼"
 
+msgid "Unit/Suite"
+msgstr ""
+
 msgid "House name"
 msgstr "房屋名稱"
 
@@ -24584,7 +24615,7 @@ msgstr ""
 msgid "{0} on a node. Should be drawn as an area."
 msgstr ""
 
-msgid "{0}=* on a node. Should be used in a relation"
+msgid "{0} on a node. Should be used in a relation"
 msgstr ""
 
 msgid "{0} on a way. Should be used on a node."
@@ -24680,9 +24711,6 @@ msgstr ""
 msgid "{0} used with {1}"
 msgstr ""
 
-msgid "street name contains ss"
-msgstr ""
-
 msgid "{0} is deprecated, use {1} instead. Also check similar tags like {2}"
 msgstr ""
 
@@ -24770,6 +24798,12 @@ msgstr ""
 msgid "unknown jewish denomination"
 msgstr ""
 
+msgid "street name contains ss"
+msgstr ""
+
+msgid "street name contains ß"
+msgstr ""
+
 msgid "{0} is unnecessary"
 msgstr ""
 
diff --git a/netbeans/nbproject/project.properties b/netbeans/nbproject/project.properties
index c7ace5c..b1da894 100644
--- a/netbeans/nbproject/project.properties
+++ b/netbeans/nbproject/project.properties
@@ -30,21 +30,21 @@ dist.dir=dist
 dist.jar=${dist.dir}/josm.jar
 dist.javadoc.dir=${dist.dir}/javadoc
 endorsed.classpath=
-excludes=org/apache/commons/compress/compressors/lzma/**,org/apache/commons/compress/compressors/xz/**,org/apache/commons/compress/compressors/CompressorStreamFactory.java,org/apache/commons/compress/compressors/deflate/**,org/apache/commons/compress/compressors/gzip/**,org/apache/commons/compress/compressors/lzw/**,org/apache/commons/compress/compressors/pack200/**,org/apache/commons/compress/compressors/snappy/**,org/apache/commons/compress/compressors/z/**,org/apache/commons/jcs/admin [...]
+excludes=org/apache/commons/compress/compressors/lz4/**,org/apache/commons/compress/compressors/lz77support/**,org/apache/commons/compress/compressors/lzma/**,org/apache/commons/compress/compressors/xz/**,org/apache/commons/compress/compressors/CompressorStreamFactory.java,org/apache/commons/compress/compressors/deflate/**,org/apache/commons/compress/compressors/gzip/**,org/apache/commons/compress/compressors/lzw/**,org/apache/commons/compress/compressors/pack200/**,org/apache/commons/co [...]
 file.reference.commons-collections-3.2.2.jar=../test/lib/unitils-core/commons-collections-3.2.2.jar
 file.reference.commons-lang-2.6.jar=../test/lib/unitils-core/commons-lang-2.6.jar
 file.reference.commons-logging-1.1.3.jar=../test/lib/unitils-core/commons-logging-1.1.3.jar
 file.reference.core-src=../src
 file.reference.debug-1.0.jar=../test/lib/fest/debug-1.0.jar
-file.reference.equalsverifier-2.1.8.jar=../test/lib/equalsverifier-2.1.8.jar
+file.reference.equalsverifier-2.2.1.jar=../test/lib/equalsverifier-2.2.1.jar
 file.reference.fest-assert-1.0.jar=../test/lib/fest/fest-assert-1.0.jar
 file.reference.fest-reflect-1.1.jar=../test/lib/fest/fest-reflect-1.1.jar
 file.reference.fest-swing-1.1.jar=../test/lib/fest/fest-swing-1.1.jar
 file.reference.fest-util-1.0.jar=../test/lib/fest/fest-util-1.0.jar
 file.reference.findbugs.jar=../tools/findbugs/findbugs.jar
-file.reference.guava-19.0.jar=../test/lib/reflections/guava-19.0.jar
+file.reference.guava-21.0.jar=../test/lib/reflections/guava-21.0.jar
 file.reference.hamcrest-core-1.3.jar=../test/lib/junit/hamcrest-core-1.3.jar
-file.reference.javassist-3.20.0-GA.jar=../test/lib/reflections/javassist-3.20.0-GA.jar
+file.reference.javassist-3.21.0-GA.jar=../test/lib/reflections/javassist-3.21.0-GA.jar
 file.reference.jcip-annotations-1.0.jar=../test/lib/fest/jcip-annotations-1.0.jar
 file.reference.jfcunit.jar=../test/lib/jfcunit.jar
 file.reference.junit-4.12.jar=../test/lib/junit/junit-4.12.jar
@@ -54,7 +54,8 @@ file.reference.reflections-0.9.10.jar=../test/lib/reflections/reflections-0.9.10
 file.reference.test-functional=../test/functional
 file.reference.test-performance=../test/performance
 file.reference.test-unit=../test/unit
-file.reference.unitils-core-3.4.3.jar=../test/lib/unitils-core/unitils-core-3.4.3.jar
+file.reference.unitils-core-3.4.6.jar=../test/lib/unitils-core/unitils-core-3.4.6.jar
+file.reference.system-rules-1.16.1.jar=../test/lib/system-rules-1.16.1.jar
 includes=**/*.java
 jar.compress=false
 javac.classpath=
@@ -70,7 +71,7 @@ javac.test.classpath=\
     ${build.classes.dir}:\
     ${file.reference.junit-4.12.jar}:\
     ${file.reference.jfcunit.jar}:\
-    ${file.reference.equalsverifier-2.1.8.jar}:\
+    ${file.reference.equalsverifier-2.2.1.jar}:\
     ${file.reference.hamcrest-core-1.3.jar}:\
     ${file.reference.MRJToolkitStubs-1.0.jar}:\
     ${file.reference.debug-1.0.jar}:\
@@ -79,14 +80,15 @@ javac.test.classpath=\
     ${file.reference.fest-swing-1.1.jar}:\
     ${file.reference.fest-util-1.0.jar}:\
     ${file.reference.jcip-annotations-1.0.jar}:\
-    ${file.reference.guava-19.0.jar}:\
-    ${file.reference.javassist-3.20.0-GA.jar}:\
+    ${file.reference.guava-21.0.jar}:\
+    ${file.reference.javassist-3.21.0-GA.jar}:\
     ${file.reference.reflections-0.9.10.jar}:\
     ${file.reference.commons-collections-3.2.2.jar}:\
     ${file.reference.commons-lang-2.6.jar}:\
     ${file.reference.commons-logging-1.1.3.jar}:\
     ${file.reference.ognl-2.6.9.jar}:\
-    ${file.reference.unitils-core-3.4.3.jar}:\
+    ${file.reference.unitils-core-3.4.6.jar}:\
+    ${file.reference.system-rules-1.16.1.jar}:\
     ${file.reference.findbugs.jar}
 javac.test.processorpath=\
     ${javac.test.classpath}
diff --git a/src/org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java b/src/org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java
index 653220d..0b3d656 100644
--- a/src/org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java
+++ b/src/org/apache/commons/jcs/auxiliary/remote/AbstractRemoteAuxiliaryCache.java
@@ -26,8 +26,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
-import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
@@ -77,7 +77,7 @@ public abstract class AbstractRemoteAuxiliaryCache<K, V>
     private IRemoteCacheAttributes remoteCacheAttributes;
 
     /** A thread pool for gets if configured. */
-    private ThreadPoolExecutor pool = null;
+    private ExecutorService pool = null;
 
     /** Should we get asynchronously using a pool. */
     private boolean usePoolForGet = false;
@@ -113,15 +113,12 @@ public abstract class AbstractRemoteAuxiliaryCache<K, V>
 
         if ( getRemoteCacheAttributes().getGetTimeoutMillis() > 0 )
         {
-            pool = ThreadPoolManager.getInstance().getPool( getRemoteCacheAttributes().getThreadPoolName() );
+            pool = ThreadPoolManager.getInstance().getExecutorService( getRemoteCacheAttributes().getThreadPoolName() );
             if ( log.isDebugEnabled() )
             {
                 log.debug( "Thread Pool = " + pool );
             }
-            if ( pool != null )
-            {
-                usePoolForGet = true;
-            }
+            usePoolForGet = true;
         }
     }
 
@@ -145,7 +142,7 @@ public abstract class AbstractRemoteAuxiliaryCache<K, V>
                 getRemoteCacheListener().dispose();
             }
         }
-        catch ( Exception ex )
+        catch ( IOException ex )
         {
             log.error( "Couldn't dispose", ex );
             handleException( ex, "Failed to dispose [" + cacheName + "]", ICacheEventLogger.DISPOSE_EVENT );
@@ -573,8 +570,7 @@ public abstract class AbstractRemoteAuxiliaryCache<K, V>
 
         if ( pool != null )
         {
-            elems.add(new StatElement<Integer>( "Pool Size", Integer.valueOf(pool.getPoolSize()) ) );
-            elems.add(new StatElement<Integer>( "Maximum Pool Size", Integer.valueOf(pool.getMaximumPoolSize()) ) );
+            elems.add(new StatElement<ExecutorService>( "Pool", pool ) );
         }
 
         if ( getRemoteCacheService() instanceof ZombieCacheServiceNonLocal )
diff --git a/src/org/apache/commons/jcs/engine/AbstractCacheEventQueue.java b/src/org/apache/commons/jcs/engine/AbstractCacheEventQueue.java
index 216a94d..9f37b0c 100644
--- a/src/org/apache/commons/jcs/engine/AbstractCacheEventQueue.java
+++ b/src/org/apache/commons/jcs/engine/AbstractCacheEventQueue.java
@@ -64,9 +64,6 @@ public abstract class AbstractCacheEventQueue<K, V>
     /** in milliseconds */
     private int waitBeforeRetry;
 
-    /** this is true if there is any worker thread. */
-    private final AtomicBoolean alive = new AtomicBoolean(false);
-
     /**
      * This means that the queue is functional. If we reached the max number of failures, the queue
      * is marked as non functional and will never work again.
@@ -108,21 +105,27 @@ public abstract class AbstractCacheEventQueue<K, V>
      * If they queue has an active thread it is considered alive.
      * <p>
      * @return The alive value
+     * 
+     * @deprecated The alive-logic is not used 
      */
-    @Override
+    @Deprecated
+	@Override
     public boolean isAlive()
     {
-        return alive.get();
+        return true;
     }
 
     /**
      * Sets whether the queue is actively processing -- if there are working threads.
      * <p>
      * @param aState
+     * 
+     * @deprecated The alive-logic is not used 
      */
-    public void setAlive( boolean aState )
+    @Deprecated
+	public void setAlive( boolean aState )
     {
-        alive.set(aState);
+        // do nothing
     }
 
     /**
@@ -179,17 +182,9 @@ public abstract class AbstractCacheEventQueue<K, V>
      * @throws IOException
      */
     @Override
-    public synchronized void addPutEvent( ICacheElement<K, V> ce )
-        throws IOException
+    public void addPutEvent( ICacheElement<K, V> ce )
     {
-        if ( isWorking() )
-        {
-            put( new PutEvent( ce ) );
-        }
-        else if ( log.isWarnEnabled() )
-        {
-            log.warn( "Not enqueuing Put Event for [" + this + "] because it's non-functional." );
-        }
+        put( new PutEvent( ce ) );
     }
 
     /**
@@ -200,54 +195,28 @@ public abstract class AbstractCacheEventQueue<K, V>
      * @throws IOException
      */
     @Override
-    public synchronized void addRemoveEvent( K key )
-        throws IOException
+    public void addRemoveEvent( K key )
     {
-        if ( isWorking() )
-        {
-            put( new RemoveEvent( key ) );
-        }
-        else if ( log.isWarnEnabled() )
-        {
-            log.warn( "Not enqueuing Remove Event for [" + this + "] because it's non-functional." );
-        }
+        put( new RemoveEvent( key ) );
     }
 
     /**
      * This adds a remove all event to the queue. When it is processed, all elements will be removed
      * from the cache.
-     * <p>
-     * @throws IOException
      */
     @Override
-    public synchronized void addRemoveAllEvent()
-        throws IOException
+    public void addRemoveAllEvent()
     {
-        if ( isWorking() )
-        {
-            put( new RemoveAllEvent() );
-        }
-        else if ( log.isWarnEnabled() )
-        {
-            log.warn( "Not enqueuing RemoveAll Event for [" + this + "] because it's non-functional." );
-        }
+        put( new RemoveAllEvent() );
     }
 
     /**
-     * @throws IOException
+     * This adds a dispose event to the queue. When it is processed, the cache is shut down
      */
     @Override
-    public synchronized void addDisposeEvent()
-        throws IOException
+    public void addDisposeEvent()
     {
-        if ( isWorking() )
-        {
-            put( new DisposeEvent() );
-        }
-        else if ( log.isWarnEnabled() )
-        {
-            log.warn( "Not enqueuing Dispose Event for [" + this + "] because it's non-functional." );
-        }
+        put( new DisposeEvent() );
     }
 
     /**
@@ -293,8 +262,7 @@ public abstract class AbstractCacheEventQueue<K, V>
                         log.warn( "Error while running event from Queue: " + this
                             + ". Dropping Event and marking Event Queue as non-functional." );
                     }
-                    setWorking( false );
-                    setAlive( false );
+                    destroy();
                     return;
                 }
                 if ( log.isInfoEnabled() )
@@ -312,10 +280,7 @@ public abstract class AbstractCacheEventQueue<K, V>
                     {
                         log.warn( "Interrupted while sleeping for retry on event " + this + "." );
                     }
-                    // TODO consider if this is best. maybe we should just
-                    // destroy
-                    setWorking( false );
-                    setAlive( false );
+                    destroy();
                 }
             }
         }
@@ -342,10 +307,8 @@ public abstract class AbstractCacheEventQueue<K, V>
          * Constructor for the PutEvent object.
          * <p>
          * @param ice
-         * @throws IOException
          */
         PutEvent( ICacheElement<K, V> ice )
-            throws IOException
         {
             this.ice = ice;
         }
@@ -391,10 +354,8 @@ public abstract class AbstractCacheEventQueue<K, V>
          * Constructor for the RemoveEvent object
          * <p>
          * @param key
-         * @throws IOException
          */
         RemoveEvent( K key )
-            throws IOException
         {
             this.key = key;
         }
diff --git a/src/org/apache/commons/jcs/engine/CacheEventQueue.java b/src/org/apache/commons/jcs/engine/CacheEventQueue.java
index f4904df..bf2758f 100644
--- a/src/org/apache/commons/jcs/engine/CacheEventQueue.java
+++ b/src/org/apache/commons/jcs/engine/CacheEventQueue.java
@@ -1,9 +1,5 @@
 package org.apache.commons.jcs.engine;
 
-import java.util.ArrayList;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -24,35 +20,19 @@ import java.util.concurrent.TimeUnit;
  */
 
 import org.apache.commons.jcs.engine.behavior.ICacheListener;
-import org.apache.commons.jcs.engine.stats.StatElement;
-import org.apache.commons.jcs.engine.stats.Stats;
-import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
-import org.apache.commons.jcs.engine.stats.behavior.IStats;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy;
+import org.apache.commons.jcs.utils.threadpool.ThreadPoolManager;
 
 /**
  * An event queue is used to propagate ordered cache events to one and only one target listener.
- * <p>
- * This is a modified version of the experimental version. It should lazy initialize the processor
- * thread, and kill the thread if the queue goes empty for a specified period, now set to 1 minute.
- * If something comes in after that a new processor thread should be created.
  */
 public class CacheEventQueue<K, V>
-    extends AbstractCacheEventQueue<K, V>
+    extends PooledCacheEventQueue<K, V>
 {
-    /** The logger. */
-    private static final Log log = LogFactory.getLog( CacheEventQueue.class );
-
     /** The type of queue -- there are pooled and single */
     private static final QueueType queueType = QueueType.SINGLE;
 
-    /** the thread that works the queue. */
-    private Thread processorThread;
-
-    /** Queue implementation */
-    private LinkedBlockingQueue<AbstractCacheEvent> queue = new LinkedBlockingQueue<AbstractCacheEvent>();
-
     /**
      * Constructs with the specified listener and the cache name.
      * <p>
@@ -77,205 +57,39 @@ public class CacheEventQueue<K, V>
     public CacheEventQueue( ICacheListener<K, V> listener, long listenerId, String cacheName, int maxFailure,
                             int waitBeforeRetry )
     {
-        initialize( listener, listenerId, cacheName, maxFailure, waitBeforeRetry );
-    }
-
-    /**
-     * What type of queue is this.
-     * <p>
-     * @return queueType
-     */
-    @Override
-    public QueueType getQueueType()
-    {
-        return queueType;
-    }
-
-    /**
-     * Kill the processor thread and indicate that the queue is destroyed and no longer alive, but it
-     * can still be working.
-     */
-    protected void stopProcessing()
-    {
-        setAlive(false);
-        processorThread = null;
-    }
-
-    /**
-     * Event Q is empty.
-     * <p>
-     * Calling destroy interrupts the processor thread.
-     */
-    @Override
-    public void destroy()
-    {
-        if ( isAlive() )
-        {
-            setAlive(false);
-
-            if ( log.isInfoEnabled() )
-            {
-                log.info( "Destroying queue, stats =  " + getStatistics() );
-            }
-
-            if ( processorThread != null )
-            {
-                processorThread.interrupt();
-                processorThread = null;
-            }
-
-            if ( log.isInfoEnabled() )
-            {
-                log.info( "Cache event queue destroyed: " + this );
-            }
-        }
-        else
-        {
-            if ( log.isInfoEnabled() )
-            {
-                log.info( "Destroy was called after queue was destroyed. Doing nothing. Stats =  " + getStatistics() );
-            }
-        }
-    }
-
-    /**
-     * Adds an event to the queue.
-     * <p>
-     * @param event
-     */
-    @Override
-    protected void put( AbstractCacheEvent event )
-    {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "Event entering Queue for " + getCacheName() + ": " + event );
-        }
-
-        queue.offer(event);
-
-        if ( isWorking() )
-        {
-            if ( !isAlive() )
-            {
-                setAlive(true);
-                processorThread = new QProcessor();
-                processorThread.start();
-                if ( log.isInfoEnabled() )
-                {
-                    log.info( "Cache event queue created: " + this );
-                }
-            }
-        }
-    }
-
-    // /////////////////////////// Inner classes /////////////////////////////
-
-    /**
-     * This is the thread that works the queue.
-     * <p>
-     * @author asmuts
-     * @created January 15, 2002
-     */
-    protected class QProcessor
-        extends Thread
-    {
-        /**
-         * Constructor for the QProcessor object
-         * <p>
-         * @param aQueue the event queue to take items from.
-         */
-        QProcessor()
-        {
-            super( "CacheEventQueue.QProcessor-" + getCacheName() );
-            setDaemon( true );
-        }
-
-        /**
-         * Main processing method for the QProcessor object.
-         * <p>
-         * Waits for a specified time (waitToDieMillis) for something to come in and if no new
-         * events come in during that period the run method can exit and the thread is dereferenced.
-         */
-        @Override
-        public void run()
-        {
-
-            while ( isAlive() )
-            {
-                AbstractCacheEvent event = null;
-
-                try
-                {
-                    event = queue.poll(getWaitToDieMillis(), TimeUnit.MILLISECONDS);
-                }
-                catch (InterruptedException e)
-                {
-                    // is ok
-                }
-
-                if ( log.isDebugEnabled() )
-                {
-                    log.debug( "Event from queue = " + event );
-                }
-
-                if ( event == null )
-                {
-                    stopProcessing();
-                }
-
-                if ( event != null && isWorking() && isAlive() )
-                {
-                    event.run();
-                }
-            }
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( "QProcessor exiting for " + getCacheName() );
-            }
-        }
+        super( listener, listenerId, cacheName, maxFailure, waitBeforeRetry, null );
     }
 
     /**
-     * This method returns semi-structured data on this queue.
+     * Initializes the queue.
      * <p>
-     * @see org.apache.commons.jcs.engine.behavior.ICacheEventQueue#getStatistics()
-     * @return information on the status and history of the queue
+     * @param listener
+     * @param listenerId
+     * @param cacheName
+     * @param maxFailure
+     * @param waitBeforeRetry
+     * @param threadPoolName
      */
     @Override
-    public IStats getStatistics()
+    protected void initialize( ICacheListener<K, V> listener, long listenerId, String cacheName, int maxFailure,
+                            int waitBeforeRetry, String threadPoolName )
     {
-        IStats stats = new Stats();
-        stats.setTypeName( "Cache Event Queue" );
-
-        ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
+        super.initialize(listener, listenerId, cacheName, maxFailure, waitBeforeRetry);
 
-        elems.add(new StatElement<Boolean>( "Working", Boolean.valueOf(this.isWorking()) ) );
-        elems.add(new StatElement<Boolean>( "Alive", Boolean.valueOf(this.isAlive()) ) );
-        elems.add(new StatElement<Boolean>( "Empty", Boolean.valueOf(this.isEmpty()) ) );
-        elems.add(new StatElement<Integer>( "Size", Integer.valueOf(this.size()) ) );
-
-        stats.setStatElements( elems );
-
-        return stats;
+        // create a default pool with one worker thread to mimic the SINGLE queue behavior
+        pool = ThreadPoolManager.getInstance().createPool(
+        		new PoolConfiguration(false, 0, 1, 0, getWaitToDieMillis(), WhenBlockedPolicy.RUN, 0),
+        		"CacheEventQueue.QProcessor-" + getCacheName());
     }
 
     /**
-     * @return whether there are any items in the queue.
-     */
-    @Override
-    public boolean isEmpty()
-    {
-        return queue.isEmpty();
-    }
-
-    /**
-     * Returns the number of elements in the queue.
+     * What type of queue is this.
      * <p>
-     * @return number of items in the queue.
+     * @return queueType
      */
     @Override
-    public int size()
+    public QueueType getQueueType()
     {
-        return queue.size();
+        return queueType;
     }
 }
diff --git a/src/org/apache/commons/jcs/engine/ElementAttributes.java b/src/org/apache/commons/jcs/engine/ElementAttributes.java
index ca8547e..4fd0252 100644
--- a/src/org/apache/commons/jcs/engine/ElementAttributes.java
+++ b/src/org/apache/commons/jcs/engine/ElementAttributes.java
@@ -446,7 +446,9 @@ public class ElementAttributes
     {
         try
         {
-            return (IElementAttributes)super.clone();
+        	ElementAttributes c = (ElementAttributes) super.clone();
+        	c.setCreateTime();
+            return c;
         }
         catch (CloneNotSupportedException e)
         {
diff --git a/src/org/apache/commons/jcs/engine/PooledCacheEventQueue.java b/src/org/apache/commons/jcs/engine/PooledCacheEventQueue.java
index 81dfe23..e4b1089 100644
--- a/src/org/apache/commons/jcs/engine/PooledCacheEventQueue.java
+++ b/src/org/apache/commons/jcs/engine/PooledCacheEventQueue.java
@@ -2,6 +2,7 @@ package org.apache.commons.jcs.engine;
 
 import java.util.ArrayList;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ThreadPoolExecutor;
 
 /*
@@ -52,7 +53,10 @@ public class PooledCacheEventQueue<K, V>
     private static final QueueType queueType = QueueType.POOLED;
 
     /** The Thread Pool to execute events with. */
-    private ThreadPoolExecutor pool = null;
+    protected ExecutorService pool = null;
+
+    /** The Thread Pool queue */
+    protected BlockingQueue<Runnable> queue = null;
 
     /**
      * Constructor for the CacheEventQueue object
@@ -86,8 +90,13 @@ public class PooledCacheEventQueue<K, V>
         super.initialize(listener, listenerId, cacheName, maxFailure, waitBeforeRetry);
 
         // this will share the same pool with other event queues by default.
-        pool = ThreadPoolManager.getInstance().getPool(
+        pool = ThreadPoolManager.getInstance().getExecutorService(
                 (threadPoolName == null) ? "cache_event_queue" : threadPoolName );
+        
+        if (pool instanceof ThreadPoolExecutor)
+        {
+        	queue = ((ThreadPoolExecutor) pool).getQueue();
+        }
     }
 
     /**
@@ -105,9 +114,9 @@ public class PooledCacheEventQueue<K, V>
     @Override
     public synchronized void destroy()
     {
-        if ( isAlive() )
+        if ( isWorking() )
         {
-            setAlive(false);
+            setWorking(false);
             pool.shutdownNow();
             if ( log.isInfoEnabled() )
             {
@@ -138,20 +147,15 @@ public class PooledCacheEventQueue<K, V>
 
         ArrayList<IStatElement<?>> elems = new ArrayList<IStatElement<?>>();
 
-        elems.add(new StatElement<Boolean>( "Working", Boolean.valueOf(super.isWorking()) ) );
-        elems.add(new StatElement<Boolean>( "Alive", Boolean.valueOf(this.isAlive()) ) );
+        elems.add(new StatElement<Boolean>( "Working", Boolean.valueOf(isWorking()) ) );
         elems.add(new StatElement<Boolean>( "Empty", Boolean.valueOf(this.isEmpty()) ) );
 
-        if ( pool.getQueue() != null )
+        if ( queue != null )
         {
-            BlockingQueue<Runnable> bb = pool.getQueue();
-            elems.add(new StatElement<Integer>( "Queue Size", Integer.valueOf(bb.size()) ) );
-            elems.add(new StatElement<Integer>( "Queue Capacity", Integer.valueOf(bb.remainingCapacity()) ) );
+            elems.add(new StatElement<Integer>( "Queue Size", Integer.valueOf(queue.size()) ) );
+            elems.add(new StatElement<Integer>( "Queue Capacity", Integer.valueOf(queue.remainingCapacity()) ) );
         }
 
-        elems.add(new StatElement<Integer>( "Pool Size", Integer.valueOf(pool.getPoolSize()) ) );
-        elems.add(new StatElement<Integer>( "Maximum Pool Size", Integer.valueOf(pool.getMaximumPoolSize()) ) );
-
         stats.setStatElements( elems );
 
         return stats;
@@ -166,32 +170,25 @@ public class PooledCacheEventQueue<K, V>
     @Override
     public boolean isEmpty()
     {
-        if ( pool.getQueue() == null )
-        {
-            return true;
-        }
-        else
-        {
-            return pool.getQueue().size() == 0;
-        }
+        return size() == 0;
     }
 
     /**
      * Returns the number of elements in the queue. If the queue cannot determine the size
-     * accurately it will return 1.
+     * accurately it will return 0.
      * <p>
      * @return number of items in the queue.
      */
     @Override
     public int size()
     {
-        if ( pool.getQueue() == null )
+        if ( queue == null )
         {
             return 0;
         }
         else
         {
-            return pool.getQueue().size();
+            return queue.size();
         }
     }
 }
diff --git a/src/org/apache/commons/jcs/engine/control/CompositeCache.java b/src/org/apache/commons/jcs/engine/control/CompositeCache.java
index f1a8c8a..a046d50 100644
--- a/src/org/apache/commons/jcs/engine/control/CompositeCache.java
+++ b/src/org/apache/commons/jcs/engine/control/CompositeCache.java
@@ -1642,7 +1642,7 @@ public class CompositeCache<K, V>
                 {
                     if ( log.isDebugEnabled() )
                     {
-                        log.info( "Exceeded maxIdle: " + element.getKey() );
+                        log.debug( "Exceeded maxIdle: " + element.getKey() );
                     }
 
                     handleElementEvent( element, eventIdle );
diff --git a/src/org/apache/commons/jcs/engine/control/event/ElementEventQueue.java b/src/org/apache/commons/jcs/engine/control/event/ElementEventQueue.java
index 1a6e9bd..44ab573 100644
--- a/src/org/apache/commons/jcs/engine/control/event/ElementEventQueue.java
+++ b/src/org/apache/commons/jcs/engine/control/event/ElementEventQueue.java
@@ -20,14 +20,14 @@ package org.apache.commons.jcs.engine.control.event;
  */
 
 import java.io.IOException;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.ExecutorService;
 
 import org.apache.commons.jcs.engine.control.event.behavior.IElementEvent;
 import org.apache.commons.jcs.engine.control.event.behavior.IElementEventHandler;
 import org.apache.commons.jcs.engine.control.event.behavior.IElementEventQueue;
-import org.apache.commons.jcs.utils.threadpool.DaemonThreadFactory;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy;
+import org.apache.commons.jcs.utils.threadpool.ThreadPoolManager;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -45,20 +45,16 @@ public class ElementEventQueue
     /** shutdown or not */
     private boolean destroyed = false;
 
-    /** The event queue */
-    private LinkedBlockingQueue<Runnable> queue;
-
     /** The worker thread pool. */
-    private ThreadPoolExecutor queueProcessor;
+    private ExecutorService queueProcessor;
 
     /**
      * Constructor for the ElementEventQueue object
      */
     public ElementEventQueue()
     {
-        queue = new LinkedBlockingQueue<Runnable>();
-        queueProcessor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
-                queue, new DaemonThreadFactory(THREAD_PREFIX));
+        queueProcessor = ThreadPoolManager.getInstance().createPool(
+        		new PoolConfiguration(false, 0, 1, 1, 0, WhenBlockedPolicy.RUN, 1), THREAD_PREFIX);
 
         if ( log.isDebugEnabled() )
         {
diff --git a/src/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java b/src/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
index b1faf25..5f85104 100644
--- a/src/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
+++ b/src/org/apache/commons/jcs/engine/memory/AbstractDoubleLinkedListMemoryCache.java
@@ -20,19 +20,13 @@ package org.apache.commons.jcs.engine.memory;
  */
 
 import java.io.IOException;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.control.CompositeCache;
 import org.apache.commons.jcs.engine.control.group.GroupAttrName;
-import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.StatElement;
 import org.apache.commons.jcs.engine.stats.behavior.IStatElement;
@@ -200,74 +194,6 @@ public abstract class AbstractDoubleLinkedListMemoryCache<K, V> extends Abstract
     }
 
     /**
-     * Get an item from the cache If the item is found, it is removed from the list and added first.
-     * <p>
-     *
-     * @param key
-     *            Identifies item to find
-     * @return ICacheElement<K, V> if found, else null
-     * @throws IOException
-     */
-    @Override
-    public final ICacheElement<K, V> get(K key) throws IOException
-    {
-        ICacheElement<K, V> ce = null;
-
-        if (log.isDebugEnabled())
-        {
-            log.debug(getCacheName() + ": getting item for key " + key);
-        }
-
-        MemoryElementDescriptor<K, V> me = map.get(key);
-
-        if (me != null)
-        {
-            hitCnt.incrementAndGet();
-
-            lock.lock();
-            try
-            {
-                ce = me.getCacheElement();
-                // ABSTRACT
-                adjustListForGet(me);
-            }
-            finally
-            {
-                lock.unlock();
-            }
-
-            if (log.isDebugEnabled())
-            {
-                log.debug(getCacheName() + ": LRUMemoryCache hit for " + key);
-            }
-        }
-        else
-        {
-            missCnt.incrementAndGet();
-
-            if (log.isDebugEnabled())
-            {
-                log.debug(getCacheName() + ": LRUMemoryCache miss for " + key);
-            }
-        }
-
-        if (log.isDebugEnabled())
-        {
-            verifyCache();
-        }
-
-        return ce;
-    }
-
-    /**
-     * Adjust the list as needed for a get. This allows children to control the algorithm
-     * <p>
-     *
-     * @param me
-     */
-    protected abstract void adjustListForGet(MemoryElementDescriptor<K, V> me);
-
-    /**
      * This instructs the memory cache to remove the <i>numberToFree</i> according to its eviction
      * policy. For example, the LRUMemoryCache will remove the <i>numberToFree</i> least recently
      * used items. These will be spooled to disk if a disk auxiliary is available.
@@ -344,116 +270,61 @@ public abstract class AbstractDoubleLinkedListMemoryCache<K, V> extends Abstract
     }
 
     /**
-     * Removes an item from the cache. This method handles hierarchical removal. If the key is a
-     * String and ends with the CacheConstants.NAME_COMPONENT_DELIMITER, then all items with keys
-     * starting with the argument String will be removed.
-     * <p>
-     *
-     * @param key
-     * @return true if the removal was successful
-     * @throws IOException
+     * @see org.apache.commons.jcs.engine.memory.AbstractMemoryCache#get(java.lang.Object)
      */
     @Override
-    public boolean remove(K key) throws IOException
+    public ICacheElement<K, V> get(K key) throws IOException
     {
+        ICacheElement<K, V> ce = super.get(key);
+
         if (log.isDebugEnabled())
         {
-            log.debug("removing item for key: " + key);
+            verifyCache();
         }
 
-        boolean removed = false;
-
-        // handle partial removal
-        if (key instanceof String && ((String) key).endsWith(CacheConstants.NAME_COMPONENT_DELIMITER))
-        {
-            // remove all keys of the same name hierarchy.
-            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext();)
-            {
-                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                K k = entry.getKey();
-
-                if (k instanceof String && ((String) k).startsWith(key.toString()))
-                {
-                    lock.lock();
-                    try
-                    {
-                        list.remove(entry.getValue());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
-                }
-            }
-        }
-        else if (key instanceof GroupAttrName && ((GroupAttrName<?>) key).attrName == null)
-        {
-            // remove all keys of the same name hierarchy.
-            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext();)
-            {
-                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                K k = entry.getKey();
+        return ce;
+    }
 
-                if (k instanceof GroupAttrName && ((GroupAttrName<?>) k).groupId.equals(((GroupAttrName<?>) key).groupId))
-                {
-                    lock.lock();
-                    try
-                    {
-                        list.remove(entry.getValue());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
-                }
-            }
-        }
-        else
-        {
-            // remove single item.
-            lock.lock();
-            try
-            {
-                MemoryElementDescriptor<K, V> me = map.remove(key);
-                if (me != null)
-                {
-                    list.remove(me);
-                    removed = true;
-                }
-            }
-            finally
-            {
-                lock.unlock();
-            }
-        }
+    /**
+     * Adjust the list as needed for a get. This allows children to control the algorithm
+     * <p>
+     *
+     * @param me
+     */
+    protected abstract void adjustListForGet(MemoryElementDescriptor<K, V> me);
 
-        return removed;
+    /**
+     * Update control structures after get
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
+     */
+    @Override
+    protected void lockedGetElement(MemoryElementDescriptor<K, V> me)
+    {
+        adjustListForGet(me);
     }
 
     /**
-     * Remove all of the elements from both the Map and the linked list implementation. Overrides
-     * base class.
-     * <p>
+     * Remove element from control structure
+     * (guarded by the lock)
      *
-     * @throws IOException
+     * @param me the memory element descriptor
      */
     @Override
-    public void removeAll() throws IOException
+    protected void lockedRemoveElement(MemoryElementDescriptor<K, V> me)
     {
-        lock.lock();
-        try
-        {
-            list.removeAll();
-            map.clear();
-        }
-        finally
-        {
-            lock.unlock();
-        }
+        list.remove(me);
+    }
+
+    /**
+     * Removes all cached items from the cache control structures.
+     * (guarded by the lock)
+     */
+    @Override
+    protected void lockedRemoveAll()
+    {
+        list.removeAll();
     }
 
     // --------------------------- internal methods (linked list implementation)
@@ -470,7 +341,7 @@ public abstract class AbstractDoubleLinkedListMemoryCache<K, V> extends Abstract
         lock.lock();
         try
         {
-            MemoryElementDescriptor<K, V> me = new DefaultMemoryElementDescriptor<K, V>(ce);
+            MemoryElementDescriptor<K, V> me = new MemoryElementDescriptor<K, V>(ce);
             list.addFirst(me);
             if ( log.isDebugEnabled() )
             {
@@ -497,7 +368,7 @@ public abstract class AbstractDoubleLinkedListMemoryCache<K, V> extends Abstract
         lock.lock();
         try
         {
-            MemoryElementDescriptor<K, V> me = new DefaultMemoryElementDescriptor<K, V>(ce);
+            MemoryElementDescriptor<K, V> me = new MemoryElementDescriptor<K, V>(ce);
             list.addLast(me);
             if ( log.isDebugEnabled() )
             {
@@ -632,17 +503,6 @@ public abstract class AbstractDoubleLinkedListMemoryCache<K, V> extends Abstract
     }
 
     /**
-     * Get an Array of the keys for all elements in the memory cache
-     *
-     * @return An Object[]
-     */
-    @Override
-    public Set<K> getKeySet()
-    {
-        return new LinkedHashSet<K>(map.keySet());
-    }
-
-    /**
      * This returns semi-structured information on the memory cache, such as the size, put count,
      * hit count, and miss count.
      * <p>
diff --git a/src/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java b/src/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
index b357bbc..dc4bf5c 100644
--- a/src/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
+++ b/src/org/apache/commons/jcs/engine/memory/AbstractMemoryCache.java
@@ -22,15 +22,19 @@ package org.apache.commons.jcs.engine.memory;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
 import org.apache.commons.jcs.engine.control.CompositeCache;
+import org.apache.commons.jcs.engine.control.group.GroupAttrName;
 import org.apache.commons.jcs.engine.memory.behavior.IMemoryCache;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.StatElement;
@@ -100,28 +104,6 @@ public abstract class AbstractMemoryCache<K, V>
     public abstract Map<K, MemoryElementDescriptor<K, V>> createMap();
 
     /**
-     * Removes an item from the cache
-     * <p>
-     * @param key Identifies item to be removed
-     * @return Description of the Return Value
-     * @throws IOException Description of the Exception
-     */
-    @Override
-    public abstract boolean remove( K key )
-        throws IOException;
-
-    /**
-     * Get an item from the cache
-     * <p>
-     * @param key Description of the Parameter
-     * @return Description of the Return Value
-     * @throws IOException Description of the Exception
-     */
-    @Override
-    public abstract ICacheElement<K, V> get( K key )
-        throws IOException;
-
-    /**
      * Gets multiple items from the cache based on the given set of keys.
      * <p>
      * @param keys
@@ -194,26 +176,32 @@ public abstract class AbstractMemoryCache<K, V>
         throws IOException;
 
     /**
-     * Get a set of the keys for all elements in the memory cache
-     * <p>
-     * @return A set of the key type
-     */
-    @Override
-    public abstract Set<K> getKeySet();
-
-    /**
      * Removes all cached items from the cache.
      * <p>
      * @throws IOException
      */
     @Override
-    public void removeAll()
-        throws IOException
+    public void removeAll() throws IOException
     {
-        map.clear();
+        lock.lock();
+        try
+        {
+            lockedRemoveAll();
+            map.clear();
+        }
+        finally
+        {
+            lock.unlock();
+        }
     }
 
     /**
+     * Removes all cached items from the cache control structures.
+     * (guarded by the lock)
+     */
+    protected abstract void lockedRemoveAll();
+
+    /**
      * Prepares for shutdown. Reset statistics
      * <p>
      * @throws IOException
@@ -332,4 +320,204 @@ public abstract class AbstractMemoryCache<K, V>
     {
         return this.cache;
     }
+
+    /**
+     * Remove all keys of the same group hierarchy.
+     * @param key the key
+     * @return true if something has been removed
+     */
+    protected boolean removeByGroup(K key)
+    {
+        boolean removed = false;
+
+        // remove all keys of the same group hierarchy.
+        for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext();)
+        {
+            Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
+            K k = entry.getKey();
+
+            if (k instanceof GroupAttrName && ((GroupAttrName<?>) k).groupId.equals(((GroupAttrName<?>) key).groupId))
+            {
+                lock.lock();
+                try
+                {
+                    itr.remove();
+                    lockedRemoveElement(entry.getValue());
+                    removed = true;
+                }
+                finally
+                {
+                    lock.unlock();
+                }
+            }
+        }
+
+        return removed;
+    }
+
+    /**
+     * Remove all keys of the same name hierarchy.
+     *
+     * @param key the key
+     * @return true if something has been removed
+     */
+    protected boolean removeByHierarchy(K key)
+    {
+        boolean removed = false;
+
+        // remove all keys of the same name hierarchy.
+        for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext();)
+        {
+            Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
+            K k = entry.getKey();
+
+            if (k instanceof String && ((String) k).startsWith(key.toString()))
+            {
+                lock.lock();
+                try
+                {
+                    itr.remove();
+                    lockedRemoveElement(entry.getValue());
+                    removed = true;
+                }
+                finally
+                {
+                    lock.unlock();
+                }
+            }
+        }
+
+        return removed;
+    }
+
+    /**
+     * Remove element from control structure
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
+     */
+    protected abstract void lockedRemoveElement(MemoryElementDescriptor<K, V> me);
+
+    /**
+     * Removes an item from the cache. This method handles hierarchical removal. If the key is a
+     * String and ends with the CacheConstants.NAME_COMPONENT_DELIMITER, then all items with keys
+     * starting with the argument String will be removed.
+     * <p>
+     *
+     * @param key
+     * @return true if the removal was successful
+     * @throws IOException
+     */
+    @Override
+    public boolean remove(K key) throws IOException
+    {
+        if (log.isDebugEnabled())
+        {
+            log.debug("removing item for key: " + key);
+        }
+
+        boolean removed = false;
+
+        // handle partial removal
+        if (key instanceof String && ((String) key).endsWith(CacheConstants.NAME_COMPONENT_DELIMITER))
+        {
+            removed = removeByHierarchy(key);
+        }
+        else if (key instanceof GroupAttrName && ((GroupAttrName<?>) key).attrName == null)
+        {
+            removed = removeByGroup(key);
+        }
+        else
+        {
+            // remove single item.
+            lock.lock();
+            try
+            {
+                MemoryElementDescriptor<K, V> me = map.remove(key);
+                if (me != null)
+                {
+                    lockedRemoveElement(me);
+                    removed = true;
+                }
+            }
+            finally
+            {
+                lock.unlock();
+            }
+        }
+
+        return removed;
+    }
+
+    /**
+     * Get an Array of the keys for all elements in the memory cache
+     *
+     * @return An Object[]
+     */
+    @Override
+    public Set<K> getKeySet()
+    {
+        return new LinkedHashSet<K>(map.keySet());
+    }
+
+    /**
+     * Get an item from the cache.
+     * <p>
+     *
+     * @param key Identifies item to find
+     * @return ICacheElement<K, V> if found, else null
+     * @throws IOException
+     */
+    @Override
+    public ICacheElement<K, V> get(K key) throws IOException
+    {
+        ICacheElement<K, V> ce = null;
+
+        if (log.isDebugEnabled())
+        {
+            log.debug(getCacheName() + ": getting item for key " + key);
+        }
+
+        MemoryElementDescriptor<K, V> me = map.get(key);
+
+        if (me != null)
+        {
+            hitCnt.incrementAndGet();
+            ce = me.getCacheElement();
+
+            lock.lock();
+            try
+            {
+                lockedGetElement(me);
+            }
+            finally
+            {
+                lock.unlock();
+            }
+
+            if (log.isDebugEnabled())
+            {
+                log.debug(getCacheName() + ": MemoryCache hit for " + key);
+            }
+        }
+        else
+        {
+            missCnt.incrementAndGet();
+
+            if (log.isDebugEnabled())
+            {
+                log.debug(getCacheName() + ": MemoryCache miss for " + key);
+            }
+        }
+
+        return ce;
+    }
+
+    /**
+     * Update control structures after get
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
+     */
+    protected abstract void lockedGetElement(MemoryElementDescriptor<K, V> me);
 }
diff --git a/src/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java b/src/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
index acb3cee..2679fb7 100644
--- a/src/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
+++ b/src/org/apache/commons/jcs/engine/memory/lru/LHMLRUMemoryCache.java
@@ -21,17 +21,11 @@ package org.apache.commons.jcs.engine.memory.lru;
 
 import java.io.IOException;
 import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Set;
 
-import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.control.CompositeCache;
-import org.apache.commons.jcs.engine.control.group.GroupAttrName;
 import org.apache.commons.jcs.engine.memory.AbstractMemoryCache;
-import org.apache.commons.jcs.engine.memory.util.DefaultMemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.stats.behavior.IStats;
 import org.apache.commons.logging.Log;
@@ -80,128 +74,41 @@ public class LHMLRUMemoryCache<K, V>
         throws IOException
     {
         putCnt.incrementAndGet();
-        map.put( ce.getKey(), new DefaultMemoryElementDescriptor<K, V>(ce) );
+        map.put( ce.getKey(), new MemoryElementDescriptor<K, V>(ce) );
     }
 
     /**
-     * Get an item from the cache
-     * <p>
-     * @param key Identifies item to find
-     * @return ICacheElement<K, V> if found, else null
-     * @throws IOException
+     * Update control structures after get
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
      */
     @Override
-    public ICacheElement<K, V> get( K key )
-        throws IOException
+    protected void lockedGetElement(MemoryElementDescriptor<K, V> me)
     {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "getting item from cache " + getCacheName() + " for key " + key );
-        }
-
-        MemoryElementDescriptor<K, V> me = map.get( key );
-
-        if ( me != null )
-        {
-            hitCnt.incrementAndGet();
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( getCacheName() + ": LHMLRUMemoryCache hit for " + key );
-            }
-            return me.getCacheElement();
-        }
-        else
-        {
-            missCnt.incrementAndGet();
-            if ( log.isDebugEnabled() )
-            {
-                log.debug( getCacheName() + ": LHMLRUMemoryCache miss for " + key );
-            }
-        }
-
-        return null;
+        // empty
     }
 
     /**
-     * Removes an item from the cache. This method handles hierarchical removal. If the key is a
-     * String and ends with the CacheConstants.NAME_COMPONENT_DELIMITER, then all items with keys
-     * starting with the argument String will be removed.
-     * <p>
-     * @param key
-     * @return true if removed
-     * @throws IOException
+     * Remove element from control structure
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
      */
     @Override
-    public boolean remove( K key )
-        throws IOException
+    protected void lockedRemoveElement(MemoryElementDescriptor<K, V> me)
     {
-        if ( log.isDebugEnabled() )
-        {
-            log.debug( "removing item for key: " + key );
-        }
-
-        boolean removed = false;
-
-        // handle partial removal
-        if ( key instanceof String && ( (String) key ).endsWith( CacheConstants.NAME_COMPONENT_DELIMITER ) )
-        {
-            // remove all keys of the same name hierarchy.
-            synchronized ( map )
-            {
-                for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
-                {
-                    Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                    K k = entry.getKey();
-
-                    if ( k instanceof String && ( (String) k ).startsWith( key.toString() ) )
-                    {
-                        itr.remove();
-                        removed = true;
-                    }
-                }
-            }
-        }
-        else if ( key instanceof GroupAttrName && ((GroupAttrName<?>)key).attrName == null )
-        {
-            // remove all keys of the same name hierarchy.
-            synchronized ( map )
-            {
-                for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator(); itr.hasNext(); )
-                {
-                    Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                    K k = entry.getKey();
-
-                    if ( k instanceof GroupAttrName &&
-                        ((GroupAttrName<?>)k).groupId.equals(((GroupAttrName<?>)key).groupId) )
-                    {
-                        itr.remove();
-                        removed = true;
-                    }
-                }
-            }
-        }
-        else
-        {
-            // remove single item.
-            MemoryElementDescriptor<K, V> me = map.remove( key );
-            if ( me != null )
-            {
-                removed = true;
-            }
-        }
-
-        return removed;
+        // empty
     }
 
     /**
-     * Get an Array of the keys for all elements in the memory cache
-     * <p>
-     * @return An Object[]
+     * Removes all cached items from the cache control structures.
+     * (guarded by the lock)
      */
     @Override
-    public Set<K> getKeySet()
+    protected void lockedRemoveAll()
     {
-        return new LinkedHashSet<K>(map.keySet());
+        // empty
     }
 
     /**
diff --git a/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java b/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
index 5108c66..b5c703b 100644
--- a/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
+++ b/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
@@ -22,7 +22,6 @@ package org.apache.commons.jcs.engine.memory.soft;
 import java.io.IOException;
 import java.lang.ref.SoftReference;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -30,11 +29,9 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import org.apache.commons.jcs.engine.CacheConstants;
 import org.apache.commons.jcs.engine.behavior.ICacheElement;
 import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes;
 import org.apache.commons.jcs.engine.control.CompositeCache;
-import org.apache.commons.jcs.engine.control.group.GroupAttrName;
 import org.apache.commons.jcs.engine.memory.AbstractMemoryCache;
 import org.apache.commons.jcs.engine.memory.util.MemoryElementDescriptor;
 import org.apache.commons.jcs.engine.memory.util.SoftReferenceElementDescriptor;
@@ -147,107 +144,41 @@ public class SoftReferenceMemoryCache<K, V> extends AbstractMemoryCache<K, V>
     }
 
     /**
-     * Removes an item from the cache. This method handles hierarchical removal. If the key is a
-     * String and ends with the CacheConstants.NAME_COMPONENT_DELIMITER, then all items with keys
-     * starting with the argument String will be removed.
-     * <p>
+     * Update control structures after get
+     * (guarded by the lock)
      *
-     * @param key
-     * @return true if the removal was successful
-     * @throws IOException
+     * @param me the memory element descriptor
      */
     @Override
-    public boolean remove(K key) throws IOException
+    protected void lockedGetElement(MemoryElementDescriptor<K, V> me)
     {
-        if (log.isDebugEnabled())
-        {
-            log.debug("removing item for key: " + key);
-        }
-
-        boolean removed = false;
-
-        // handle partial removal
-        if (key instanceof String && ((String) key).endsWith(CacheConstants.NAME_COMPONENT_DELIMITER))
-        {
-            // remove all keys of the same name hierarchy.
-            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator();
-                    itr.hasNext();)
-            {
-                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                K k = entry.getKey();
+        ICacheElement<K, V> val = me.getCacheElement();
+        val.getElementAttributes().setLastAccessTimeNow();
 
-                if (k instanceof String && ((String) k).startsWith(key.toString()))
-                {
-                    lock.lock();
-                    try
-                    {
-                        strongReferences.remove(entry.getValue().getCacheElement());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
-                }
-            }
-        }
-        else if (key instanceof GroupAttrName && ((GroupAttrName<?>) key).attrName == null)
-        {
-            // remove all keys of the same name hierarchy.
-            for (Iterator<Map.Entry<K, MemoryElementDescriptor<K, V>>> itr = map.entrySet().iterator();
-                    itr.hasNext();)
-            {
-                Map.Entry<K, MemoryElementDescriptor<K, V>> entry = itr.next();
-                K k = entry.getKey();
-
-                if (k instanceof GroupAttrName && ((GroupAttrName<?>) k).groupId.equals(((GroupAttrName<?>) key).groupId))
-                {
-                    lock.lock();
-                    try
-                    {
-                        strongReferences.remove(entry.getValue().getCacheElement());
-                        itr.remove();
-                        removed = true;
-                    }
-                    finally
-                    {
-                        lock.unlock();
-                    }
-                }
-            }
-        }
-        else
-        {
-            // remove single item.
-            lock.lock();
-            try
-            {
-                MemoryElementDescriptor<K, V> me = map.remove(key);
-                if (me != null)
-                {
-                    strongReferences.remove(me.getCacheElement());
-                    removed = true;
-                }
-            }
-            finally
-            {
-                lock.unlock();
-            }
-        }
+        // update the ordering of the strong references
+        strongReferences.add(val);
+        trimStrongReferences();
+    }
 
-        return removed;
+    /**
+     * Remove element from control structure
+     * (guarded by the lock)
+     *
+     * @param me the memory element descriptor
+     */
+    @Override
+    protected void lockedRemoveElement(MemoryElementDescriptor<K, V> me)
+    {
+        strongReferences.remove(me.getCacheElement());
     }
 
     /**
-     * Removes all cached items from the cache.
-     * <p>
-     * @throws IOException
+     * Removes all cached items from the cache control structures.
+     * (guarded by the lock)
      */
     @Override
-    public void removeAll() throws IOException
+    protected void lockedRemoveAll()
     {
-        super.removeAll();
         strongReferences.clear();
     }
 
@@ -294,48 +225,6 @@ public class SoftReferenceMemoryCache<K, V> extends AbstractMemoryCache<K, V>
     }
 
     /**
-     * Get an item from the cache
-     * <p>
-     * @param key Description of the Parameter
-     * @return Description of the Return Value
-     * @throws IOException Description of the Exception
-     */
-    @Override
-    public ICacheElement<K, V> get(K key) throws IOException
-    {
-        ICacheElement<K, V> val = null;
-        lock.lock();
-
-        try
-        {
-            val = getQuiet(key);
-            if (val != null)
-            {
-                val.getElementAttributes().setLastAccessTimeNow();
-
-                // update the ordering of the strong references
-                strongReferences.add(val);
-                trimStrongReferences();
-            }
-        }
-        finally
-        {
-            lock.unlock();
-        }
-
-        if (val == null)
-        {
-            missCnt.incrementAndGet();
-        }
-        else
-        {
-            hitCnt.incrementAndGet();
-        }
-
-        return val;
-    }
-
-    /**
      * This can't be implemented.
      * <p>
      * @param numberToFree
diff --git a/src/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java b/src/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java
index d95ada1..e06b2f6 100644
--- a/src/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java
+++ b/src/org/apache/commons/jcs/engine/memory/util/DefaultMemoryElementDescriptor.java
@@ -23,16 +23,16 @@ import org.apache.commons.jcs.engine.behavior.ICacheElement;
 
 /**
  * This wrapper is needed for double linked lists.
+ *
+ * @deprecated Use MemoryElementDescriptor directly
  */
+ at Deprecated
 public class DefaultMemoryElementDescriptor<K, V>
     extends MemoryElementDescriptor<K, V>
 {
     /** Don't change */
     private static final long serialVersionUID = -1905161209035522460L;
 
-    /** The CacheElement wrapped by this descriptor */
-    private final ICacheElement<K, V> ce;
-
     /**
      * Constructs a usable MemoryElementDescriptor.
      * <p>
@@ -41,15 +41,5 @@ public class DefaultMemoryElementDescriptor<K, V>
     public DefaultMemoryElementDescriptor( ICacheElement<K, V> ce )
     {
         super( ce );
-        this.ce = ce;
-    }
-
-    /**
-     * @return the ce
-     */
-    @Override
-    public ICacheElement<K, V> getCacheElement()
-    {
-        return ce;
     }
 }
diff --git a/src/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java b/src/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
index 22d398b..613f2b5 100644
--- a/src/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
+++ b/src/org/apache/commons/jcs/engine/memory/util/MemoryElementDescriptor.java
@@ -25,7 +25,7 @@ import org.apache.commons.jcs.utils.struct.DoubleLinkedListNode;
 /**
  * This wrapper is needed for double linked lists.
  */
-public abstract class MemoryElementDescriptor<K, V>
+public class MemoryElementDescriptor<K, V>
     extends DoubleLinkedListNode<ICacheElement<K, V>>
 {
     /** Don't change */
@@ -42,8 +42,12 @@ public abstract class MemoryElementDescriptor<K, V>
     }
 
     /**
-     * Return the cache element wrapped by this descriptor
-     * @return the cache element
+     * Get the cache element
+     *
+     * @return the ce
      */
-    public abstract ICacheElement<K, V> getCacheElement();
+    public ICacheElement<K, V> getCacheElement()
+    {
+        return getPayload();
+    }
 }
diff --git a/src/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java b/src/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
index 91f42ab..32050e7 100644
--- a/src/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
+++ b/src/org/apache/commons/jcs/engine/memory/util/SoftReferenceElementDescriptor.java
@@ -42,7 +42,7 @@ public class SoftReferenceElementDescriptor<K, V>
      */
     public SoftReferenceElementDescriptor( ICacheElement<K, V> ce )
     {
-        super( ce );
+        super( null );
         this.srce = new SoftReference<ICacheElement<K, V>>(ce);
     }
 
diff --git a/src/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java b/src/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java
index e8f9cba..07a6687 100644
--- a/src/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java
+++ b/src/org/apache/commons/jcs/utils/discovery/UDPDiscoveryReceiver.java
@@ -25,14 +25,15 @@ import java.io.ObjectInputStream;
 import java.net.DatagramPacket;
 import java.net.InetAddress;
 import java.net.MulticastSocket;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.ExecutorService;
 
 import org.apache.commons.jcs.engine.CacheInfo;
 import org.apache.commons.jcs.engine.behavior.IShutdownObserver;
 import org.apache.commons.jcs.io.ObjectInputStreamClassLoaderAware;
 import org.apache.commons.jcs.utils.discovery.UDPDiscoveryMessage.BroadcastType;
-import org.apache.commons.jcs.utils.threadpool.DaemonThreadFactory;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration;
+import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy;
+import org.apache.commons.jcs.utils.threadpool.ThreadPoolManager;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -56,7 +57,7 @@ public class UDPDiscoveryReceiver
     private static final int maxPoolSize = 2;
 
     /** The processor */
-    private ThreadPoolExecutor pooledExecutor = null;
+    private ExecutorService pooledExecutor = null;
 
     /** number of messages received. For debugging and testing. */
     private int cnt = 0;
@@ -91,10 +92,9 @@ public class UDPDiscoveryReceiver
         this.multicastPort = multicastPort;
 
         // create a small thread pool to handle a barrage
-        pooledExecutor = (ThreadPoolExecutor)Executors.newFixedThreadPool(maxPoolSize,
-                new DaemonThreadFactory("JCS-UDPDiscoveryReceiver-", Thread.MIN_PRIORITY));
-        pooledExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
-        //pooledExecutor.setMinimumPoolSize(1);
+        pooledExecutor = ThreadPoolManager.getInstance().createPool(
+        		new PoolConfiguration(false, 0, maxPoolSize, maxPoolSize, 0, WhenBlockedPolicy.DISCARDOLDEST, maxPoolSize), 
+        		"JCS-UDPDiscoveryReceiver-", Thread.MIN_PRIORITY);
 
         if ( log.isInfoEnabled() )
         {
diff --git a/src/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java b/src/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
index 05f17e7..f4e886d 100644
--- a/src/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
+++ b/src/org/apache/commons/jcs/utils/threadpool/PoolConfiguration.java
@@ -27,23 +27,46 @@ package org.apache.commons.jcs.utils.threadpool;
 public final class PoolConfiguration
     implements Cloneable
 {
+    /**
+     * DEFAULT SETTINGS
+     */
+    private static final boolean DEFAULT_USE_BOUNDARY = true;
+
+    /** Default queue size limit */
+    private static final int DEFAULT_BOUNDARY_SIZE = 2000;
+
+    /** Default max size */
+    private static final int DEFAULT_MAXIMUM_POOL_SIZE = 150;
+
+    /** Default min */
+    private static final int DEFAULT_MINIMUM_POOL_SIZE = Runtime.getRuntime().availableProcessors();
+
+    /** Default keep alive */
+    private static final int DEFAULT_KEEPALIVE_TIME = 1000 * 60 * 5;
+
+    /** Default when blocked */
+    private static final WhenBlockedPolicy DEFAULT_WHEN_BLOCKED_POLICY = WhenBlockedPolicy.RUN;
+
+    /** Default startup size */
+    private static final int DEFAULT_STARTUP_SIZE = DEFAULT_MINIMUM_POOL_SIZE;
+
     /** Should we bound the queue */
-    private boolean useBoundary = true;
+    private boolean useBoundary = DEFAULT_USE_BOUNDARY;
 
     /** If the queue is bounded, how big can it get */
-    private int boundarySize = 2000;
+    private int boundarySize = DEFAULT_BOUNDARY_SIZE;
 
     /** only has meaning if a boundary is used */
-    private int maximumPoolSize = 150;
+    private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE;
 
     /**
      * the exact number that will be used in a boundless queue. If the queue has a boundary, more
      * will be created if the queue fills.
      */
-    private int minimumPoolSize = 4;
+    private int minimumPoolSize = DEFAULT_MINIMUM_POOL_SIZE;
 
     /** How long idle threads above the minimum should be kept alive. */
-    private int keepAliveTime = 1000 * 60 * 5;
+    private int keepAliveTime = DEFAULT_KEEPALIVE_TIME;
 
     public enum WhenBlockedPolicy {
         /** abort when queue is full and max threads is reached. */
@@ -63,10 +86,10 @@ public final class PoolConfiguration
     }
 
     /** should be ABORT, BLOCK, RUN, WAIT, DISCARDOLDEST, */
-    private WhenBlockedPolicy whenBlockedPolicy = WhenBlockedPolicy.RUN;
+    private WhenBlockedPolicy whenBlockedPolicy = DEFAULT_WHEN_BLOCKED_POLICY;
 
     /** The number of threads to create on startup */
-    private int startUpSize = 4;
+    private int startUpSize = DEFAULT_MINIMUM_POOL_SIZE;
 
     /**
      * @param useBoundary The useBoundary to set.
@@ -89,7 +112,9 @@ public final class PoolConfiguration
      */
     public PoolConfiguration()
     {
-        // nop
+        this( DEFAULT_USE_BOUNDARY, DEFAULT_BOUNDARY_SIZE, DEFAULT_MAXIMUM_POOL_SIZE,
+              DEFAULT_MINIMUM_POOL_SIZE, DEFAULT_KEEPALIVE_TIME,
+              DEFAULT_WHEN_BLOCKED_POLICY, DEFAULT_STARTUP_SIZE );
     }
 
     /**
diff --git a/src/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java b/src/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
index 0c9346c..93ca842 100644
--- a/src/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
+++ b/src/org/apache/commons/jcs/utils/threadpool/ThreadPoolManager.java
@@ -23,11 +23,14 @@ import java.util.ArrayList;
 import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.commons.jcs.utils.threadpool.PoolConfiguration.WhenBlockedPolicy;
+import org.apache.commons.jcs.utils.config.PropertySetter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -39,30 +42,12 @@ import org.apache.commons.logging.LogFactory;
  * This manager forces you to use a bounded queue. By default it uses the current thread for
  * execution when the buffer is full and no free threads can be created.
  * <p>
- * You can specify the props file to use or pass in a properties object prior to configuration. By
- * default it looks for configuration information in thread_pool.properties.
+ * You can specify the props file to use or pass in a properties object prior to configuration.
  * <p>
  * If set, the Properties object will take precedence.
  * <p>
- * If a value is not set for a particular pool, the hard coded defaults will be used.
- *
- * <pre>
- * int boundarySize_DEFAULT = 2000;
- *
- * int maximumPoolSize_DEFAULT = 150;
- *
- * int minimumPoolSize_DEFAULT = 4;
- *
- * int keepAliveTime_DEFAULT = 1000 * 60 * 5;
- *
- * boolean abortWhenBlocked = false;
- *
- * String whenBlockedPolicy_DEFAULT = IPoolConfiguration.POLICY_RUN;
- *
- * int startUpSize_DEFAULT = 4;
- * </pre>
- *
- * You can configure default settings by specifying a default pool in the properties, ie "cache.ccf"
+ * If a value is not set for a particular pool, the hard coded defaults in <code>PoolConfiguration</code> will be used.
+ * You can configure default settings by specifying <code>thread_pool.default</code> in the properties, ie "cache.ccf"
  * <p>
  * @author Aaron Smuts
  */
@@ -71,31 +56,8 @@ public class ThreadPoolManager
     /** The logger */
     private static final Log log = LogFactory.getLog( ThreadPoolManager.class );
 
-    /**
-     * DEFAULT SETTINGS, these are not final since they can be set via the properties file or object
-     */
-    private static boolean useBoundary_DEFAULT = true;
-
-    /** Default queue size limit */
-    private static int boundarySize_DEFAULT = 2000;
-
-    /** Default max size */
-    private static int maximumPoolSize_DEFAULT = 150;
-
-    /** Default min */
-    private static int minimumPoolSize_DEFAULT = 4;
-
-    /** Default keep alive */
-    private static int keepAliveTime_DEFAULT = 1000 * 60 * 5;
-
-    /** Default when blocked */
-    private static WhenBlockedPolicy whenBlockedPolicy_DEFAULT = WhenBlockedPolicy.RUN;
-
-    /** Default startup size */
-    private static int startUpSize_DEFAULT = 4;
-
     /** The default config, created using property defaults if present, else those above. */
-    private static PoolConfiguration defaultConfig;
+    private PoolConfiguration defaultConfig;
 
     /** the root property name */
     private static final String PROP_NAME_ROOT = "thread_pool";
@@ -103,7 +65,13 @@ public class ThreadPoolManager
     /** default property file name */
     private static final String DEFAULT_PROP_NAME_ROOT = "thread_pool.default";
 
-    /**
+    /** the scheduler root property name */
+    private static final String PROP_NAME_SCHEDULER_ROOT = "scheduler_pool";
+
+    /** default scheduler property file name */
+    private static final String DEFAULT_PROP_NAME_SCHEDULER_ROOT = "scheduler_pool.default";
+
+   /**
      * You can specify the properties to be used to configure the thread pool. Setting this post
      * initialization will have no effect.
      */
@@ -113,24 +81,42 @@ public class ThreadPoolManager
     private static ThreadPoolManager INSTANCE = null;
 
     /** Map of names to pools. */
-    private ConcurrentHashMap<String, ThreadPoolExecutor> pools;
+    private ConcurrentHashMap<String, ExecutorService> pools;
+
+    /** Map of names to scheduler pools. */
+    private ConcurrentHashMap<String, ScheduledExecutorService> schedulerPools;
 
     /**
      * No instances please. This is a singleton.
      */
     private ThreadPoolManager()
     {
-        this.pools = new ConcurrentHashMap<String, ThreadPoolExecutor>();
+        this.pools = new ConcurrentHashMap<String, ExecutorService>();
+        this.schedulerPools = new ConcurrentHashMap<String, ScheduledExecutorService>();
         configure();
     }
 
     /**
      * Creates a pool based on the configuration info.
      * <p>
-     * @param config
-     * @return A ThreadPoll wrapper
+     * @param config the pool configuration
+     * @param threadNamePrefix prefix for the thread names of the pool
+     * @return A ThreadPool wrapper
      */
-    private ThreadPoolExecutor createPool( PoolConfiguration config )
+    public ExecutorService createPool( PoolConfiguration config, String threadNamePrefix)
+    {
+    	return createPool(config, threadNamePrefix, Thread.NORM_PRIORITY);
+    }
+    
+    /**
+     * Creates a pool based on the configuration info.
+     * <p>
+     * @param config the pool configuration
+     * @param threadNamePrefix prefix for the thread names of the pool
+     * @param threadPriority the priority of the created threads
+     * @return A ThreadPool wrapper
+     */
+    public ExecutorService createPool( PoolConfiguration config, String threadNamePrefix, int threadPriority )
     {
         BlockingQueue<Runnable> queue = null;
         if ( config.isUseBoundary() )
@@ -157,7 +143,7 @@ public class ThreadPoolManager
             config.getKeepAliveTime(),
             TimeUnit.MILLISECONDS,
             queue,
-            new DaemonThreadFactory("JCS-ThreadPoolManager-"));
+            new DaemonThreadFactory(threadNamePrefix, threadPriority));
 
         // when blocked policy
         switch (config.getWhenBlockedPolicy())
@@ -187,6 +173,23 @@ public class ThreadPoolManager
     }
 
     /**
+     * Creates a scheduler pool based on the configuration info.
+     * <p>
+     * @param config the pool configuration
+     * @param threadNamePrefix prefix for the thread names of the pool
+     * @param threadPriority the priority of the created threads
+     * @return A ScheduledExecutorService
+     */
+    public ScheduledExecutorService createSchedulerPool( PoolConfiguration config, String threadNamePrefix, int threadPriority )
+    {
+    	ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(
+    			config.getMaximumPoolSize(), 
+    			new DaemonThreadFactory(threadNamePrefix, threadPriority));
+
+        return scheduler;
+    }
+    
+    /**
      * Returns a configured instance of the ThreadPoolManger To specify a configuration file or
      * Properties object to use call the appropriate setter prior to calling getInstance.
      * <p>
@@ -208,34 +211,46 @@ public class ThreadPoolManager
     {
         if ( INSTANCE != null )
         {
-            for ( String poolName : INSTANCE.getPoolNames())
+            for ( ExecutorService pool : INSTANCE.pools.values() )
             {
                 try
                 {
-                    INSTANCE.getPool(poolName).shutdownNow();
+                    pool.shutdownNow();
                 }
                 catch (Throwable t)
                 {
-                    log.warn("Failed to close pool " + poolName, t);
+                    log.warn("Failed to close pool " + pool, t);
                 }
             }
-
+            
+            for ( ScheduledExecutorService pool : INSTANCE.schedulerPools.values() )
+            {
+                try
+                {
+                    pool.shutdownNow();
+                }
+                catch (Throwable t)
+                {
+                    log.warn("Failed to close pool " + pool, t);
+                }
+            }
+            
             INSTANCE = null;
         }
     }
 
     /**
-     * Returns a pool by name. If a pool by this name does not exist in the configuration file or
+     * Returns an executor service by name. If a service by this name does not exist in the configuration file or
      * properties, one will be created using the default values.
      * <p>
-     * Pools are lazily created.
+     * Services are lazily created.
      * <p>
      * @param name
-     * @return The thread pool configured for the name.
+     * @return The executor service configured for the name.
      */
-    public ThreadPoolExecutor getPool( String name )
+    public ExecutorService getExecutorService( String name )
     {
-        ThreadPoolExecutor pool = pools.get( name );
+    	ExecutorService pool = pools.get( name );
 
         if ( pool == null )
         {
@@ -245,12 +260,17 @@ public class ThreadPoolManager
             }
 
             PoolConfiguration config = loadConfig( PROP_NAME_ROOT + "." + name );
-            pool = createPool( config );
-            ThreadPoolExecutor _pool = pools.putIfAbsent( name, pool );
-            if (_pool != null)
+            ExecutorService _pool = createPool( config, "JCS-ThreadPoolManager-" + name + "-" );
+            pool = pools.putIfAbsent( name, _pool );
+            if (pool == null)
             {
                 pool = _pool;
             }
+            else
+            {
+            	// already created in another thread
+            	_pool.shutdownNow();
+            }
 
             if ( log.isDebugEnabled() )
             {
@@ -260,6 +280,61 @@ public class ThreadPoolManager
 
         return pool;
     }
+    
+    /**
+     * Returns a pool by name. If a pool by this name does not exist in the configuration file or
+     * properties, one will be created using the default values.
+     * <p>
+     * Pools are lazily created.
+     * <p>
+     * @param name
+     * @return The thread pool configured for the name.
+     * 
+     * @deprecated Use getExecutorService() instead
+     */
+    @Deprecated
+	public ThreadPoolExecutor getPool( String name )
+    {
+    	return (ThreadPoolExecutor) getExecutorService(name);
+    }
+
+    /**
+     * Returns a scheduler pool by name. If a pool by this name does not exist in the configuration file or
+     * properties, one will be created using the default values.
+     * <p>
+     * Pools are lazily created.
+     * <p>
+     * @param name
+     * @return The scheduler pool configured for the name.
+     */
+    public ScheduledExecutorService getSchedulerPool( String name )
+    {
+    	ScheduledExecutorService pool = schedulerPools.get( name );
+
+        if ( pool == null )
+        {
+            if ( log.isDebugEnabled() )
+            {
+                log.debug( "Creating scheduler pool for name [" + name + "]" );
+            }
+
+            PoolConfiguration defaultSchedulerConfig = loadConfig( DEFAULT_PROP_NAME_SCHEDULER_ROOT );
+            PoolConfiguration config = loadConfig( PROP_NAME_SCHEDULER_ROOT + "." + name, defaultSchedulerConfig );
+            ScheduledExecutorService _pool = createSchedulerPool( config, "JCS-ThreadPoolManager-" + name + "-", Thread.NORM_PRIORITY );
+            pool = schedulerPools.putIfAbsent( name, _pool );
+            if (pool == null)
+            {
+                pool = _pool;
+            }
+            else
+            {
+            	// already created in another thread
+            	_pool.shutdownNow();
+            }
+        }
+
+        return pool;
+    }
 
     /**
      * Returns the names of all configured pools.
@@ -285,7 +360,7 @@ public class ThreadPoolManager
     /**
      * Initialize the ThreadPoolManager and create all the pools defined in the configuration.
      */
-    private static void configure()
+    private void configure()
     {
         if ( log.isDebugEnabled() )
         {
@@ -300,88 +375,36 @@ public class ThreadPoolManager
 
         // set intial default and then override if new
         // settings are available
-        defaultConfig = new PoolConfiguration( useBoundary_DEFAULT, boundarySize_DEFAULT, maximumPoolSize_DEFAULT,
-                                               minimumPoolSize_DEFAULT, keepAliveTime_DEFAULT,
-                                               whenBlockedPolicy_DEFAULT, startUpSize_DEFAULT );
-
+        defaultConfig = new PoolConfiguration();
         defaultConfig = loadConfig( DEFAULT_PROP_NAME_ROOT );
     }
 
     /**
-     * Configures the default PoolConfiguration settings.
+     * Configures the PoolConfiguration settings.
      * <p>
-     * @param root
+     * @param root the configuration key prefix
      * @return PoolConfiguration
      */
-    private static PoolConfiguration loadConfig( String root )
+    private PoolConfiguration loadConfig( String root )
     {
-        PoolConfiguration config = defaultConfig.clone();
-
-        try
-        {
-            config.setUseBoundary( Boolean.parseBoolean( props.getProperty( root + ".useBoundary", "false" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "useBoundary not a boolean.", nfe );
-        }
-
-        // load default if they exist
-        try
-        {
-            config.setBoundarySize( Integer.parseInt( props.getProperty( root + ".boundarySize", "2000" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "boundarySize not a number.", nfe );
-        }
-
-        // maximum pool size
-        try
-        {
-            config.setMaximumPoolSize( Integer.parseInt( props.getProperty( root + ".maximumPoolSize", "150" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "maximumPoolSize not a number.", nfe );
-        }
-
-        // minimum pool size
-        try
-        {
-            config.setMinimumPoolSize( Integer.parseInt( props.getProperty( root + ".minimumPoolSize", "4" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "minimumPoolSize not a number.", nfe );
-        }
-
-        // keep alive
-        try
-        {
-            config.setKeepAliveTime( Integer.parseInt( props.getProperty( root + ".keepAliveTime", "300000" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "keepAliveTime not a number.", nfe );
-        }
-
-        // when blocked
-        config.setWhenBlockedPolicy( props.getProperty( root + ".whenBlockedPolicy", "RUN" ) );
-
-        // startupsize
-        try
-        {
-            config.setStartUpSize( Integer.parseInt( props.getProperty( root + ".startUpSize", "4" ) ) );
-        }
-        catch ( NumberFormatException nfe )
-        {
-            log.error( "startUpSize not a number.", nfe );
-        }
+    	return loadConfig(root, defaultConfig);
+    }
+    
+    /**
+     * Configures the PoolConfiguration settings.
+     * <p>
+     * @param root the configuration key prefix
+     * @param defaultPoolConfiguration the default configuration
+     * @return PoolConfiguration
+     */
+    private PoolConfiguration loadConfig( String root, PoolConfiguration defaultPoolConfiguration )
+    {
+        PoolConfiguration config = defaultPoolConfiguration.clone();
+        PropertySetter.setProperties( config, props, root + "." );
 
-        if ( log.isInfoEnabled() )
+        if ( log.isDebugEnabled() )
         {
-            log.info( root + " PoolConfiguration = " + config );
+            log.debug( root + " PoolConfiguration = " + config );
         }
 
         return config;
diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index 6a52025..ed25c52 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -579,9 +579,7 @@ public abstract class Main {
      * Called once at startup to initialize the main window content.
      * Should set {@link #menu}
      */
-    protected void initializeMainWindow() {
-        // can be implementd by subclasses
-    }
+    protected abstract void initializeMainWindow();
 
     private static class InitializationTask implements Callable<Void> {
 
diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index 50af06c..af45329 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -413,7 +413,7 @@ public class JoinAreasAction extends JosmAction {
                      candidatePrevNode = candidateWay.way.getNode(candidateWay.way.getNodesCount() - 2);
                 } else
                     continue;
-                if (candidateWay.equals(lastWay) && candidateComingToHead)
+                if (candidateComingToHead && candidateWay.equals(lastWay))
                     continue;
 
                 double candidateAngle = getAngle(headNode, candidatePrevNode, prevNode);
diff --git a/src/org/openstreetmap/josm/actions/MergeNodesAction.java b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
index 7581c41..831a0cf 100644
--- a/src/org/openstreetmap/josm/actions/MergeNodesAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
@@ -110,7 +110,8 @@ public class MergeNodesAction extends JosmAction {
         case 0:
             return candidates.get(size - 1);
         case 1:
-            double east1 = 0, north1 = 0;
+            double east1 = 0;
+            double north1 = 0;
             for (final Node n : candidates) {
                 EastNorth en = n.getEastNorth();
                 east1 += en.east();
@@ -131,7 +132,9 @@ public class MergeNodesAction extends JosmAction {
                 }
             }
 
-            double east2 = 0, north2 = 0, weight = 0;
+            double east2 = 0;
+            double north2 = 0;
+            double weight = 0;
             for (int i = 0; i < size; i++) {
                 final EastNorth en = candidates.get(i).getEastNorth();
                 final double w = weights[i];
@@ -140,6 +143,9 @@ public class MergeNodesAction extends JosmAction {
                 weight += w;
             }
 
+            if (weight == 0) // to avoid division by 0
+                return candidates.get(0);
+
             return new Node(new EastNorth(east2 / weight, north2 / weight));
         default:
             throw new IllegalStateException("unacceptable merge-nodes.mode");
diff --git a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
index fe79107..57a7bf8 100644
--- a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
+++ b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
@@ -144,6 +144,9 @@ public final class ShowStatusReportAction extends JosmAction {
                     // Hide some parameters for privacy concerns
                     if (param[0].toLowerCase(Locale.ENGLISH).startsWith("-dproxy")) {
                         it.set(param[0]+"=xxx");
+                    } else if ("-Djnlpx.vmargs".equals(param[0])) {
+                        // Remove jnlpx.vmargs (base64 encoded copy of VM arguments already included in clear)
+                        it.remove();
                     } else {
                         // Replace some paths for readability and privacy concerns
                         String val = paramCleanup(param[1]);
diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
index 6aa90eb..dff5e17 100644
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -17,6 +17,7 @@ import java.util.List;
 import java.util.Set;
 
 import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
@@ -54,12 +55,14 @@ public class SimplifyWayAction extends JosmAction {
     }
 
     protected void alertSelectAtLeastOneWay() {
-        new Notification(
-                tr("Please select at least one way to simplify."))
-                .setIcon(JOptionPane.WARNING_MESSAGE)
-                .setDuration(Notification.TIME_SHORT)
-                .setHelpTopic(ht("/Action/SimplifyWay#SelectAWayToSimplify"))
-                .show();
+        SwingUtilities.invokeLater(() ->
+            new Notification(
+                    tr("Please select at least one way to simplify."))
+                    .setIcon(JOptionPane.WARNING_MESSAGE)
+                    .setDuration(Notification.TIME_SHORT)
+                    .setHelpTopic(ht("/Action/SimplifyWay#SelectAWayToSimplify"))
+                    .show()
+        );
     }
 
     protected boolean confirmSimplifyManyWays(int numWays) {
diff --git a/src/org/openstreetmap/josm/actions/SplitWayAction.java b/src/org/openstreetmap/josm/actions/SplitWayAction.java
index d4c029a..b0024e7 100644
--- a/src/org/openstreetmap/josm/actions/SplitWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SplitWayAction.java
@@ -251,7 +251,7 @@ public class SplitWayAction extends JosmAction {
             list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
             list.addListSelectionListener(e -> {
                 final Way selected = list.getSelectedValue();
-                if (Main.isDisplayingMapView() && selected != null && selected.getNodesCount() > 1) {
+                if (selected != null && Main.isDisplayingMapView() && selected.getNodesCount() > 1) {
                     final Collection<WaySegment> segments = new ArrayList<>(selected.getNodesCount() - 1);
                     final Iterator<Node> it = selected.getNodes().iterator();
                     Node previousNode = it.next();
diff --git a/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java b/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
index e755507..e41f1c0 100644
--- a/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
+++ b/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
@@ -35,7 +35,7 @@ public class AudioPlayPauseAction extends JosmAction {
     public void actionPerformed(ActionEvent e) {
         URL url = AudioPlayer.url();
         try {
-            if (AudioPlayer.paused() && url != null) {
+            if (url != null && AudioPlayer.paused()) {
                 AudioPlayer.play(url);
             } else if (AudioPlayer.playing()) {
                 if (!Utils.equalsEpsilon(AudioPlayer.speed(), 1.0))
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index e623b70..9216b71 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -14,12 +14,9 @@ import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -27,13 +24,11 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.stream.DoubleStream;
 
 import javax.swing.AbstractAction;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
@@ -44,7 +39,6 @@ import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -61,18 +55,14 @@ import org.openstreetmap.josm.data.preferences.StrokeProperty;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapViewState;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.draw.MapPath2D;
-import org.openstreetmap.josm.gui.draw.MapViewPath;
-import org.openstreetmap.josm.gui.draw.SymbolShape;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.gui.util.ModifierListener;
-import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Pair;
@@ -88,42 +78,42 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
 
     private static final ArrowPaintHelper START_WAY_INDICATOR = new ArrowPaintHelper(Math.toRadians(90), 8);
 
-    private static final CachingProperty<Boolean> USE_REPEATED_SHORTCUT
+    static final CachingProperty<Boolean> USE_REPEATED_SHORTCUT
             = new BooleanProperty("draw.anglesnap.toggleOnRepeatedA", true).cached();
-    private static final CachingProperty<BasicStroke> RUBBER_LINE_STROKE
+    static final CachingProperty<BasicStroke> RUBBER_LINE_STROKE
             = new StrokeProperty("draw.stroke.helper-line", "3").cached();
 
-    private static final CachingProperty<BasicStroke> HIGHLIGHT_STROKE
+    static final CachingProperty<BasicStroke> HIGHLIGHT_STROKE
             = new StrokeProperty("draw.anglesnap.stroke.highlight", "10").cached();
-    private static final CachingProperty<BasicStroke> HELPER_STROKE
+    static final CachingProperty<BasicStroke> HELPER_STROKE
             = new StrokeProperty("draw.anglesnap.stroke.helper", "1 4").cached();
 
-    private static final CachingProperty<Double> SNAP_ANGLE_TOLERANCE
+    static final CachingProperty<Double> SNAP_ANGLE_TOLERANCE
             = new DoubleProperty("draw.anglesnap.tolerance", 5.0).cached();
-    private static final CachingProperty<Boolean> DRAW_CONSTRUCTION_GEOMETRY
+    static final CachingProperty<Boolean> DRAW_CONSTRUCTION_GEOMETRY
             = new BooleanProperty("draw.anglesnap.drawConstructionGeometry", true).cached();
-    private static final CachingProperty<Boolean> SHOW_PROJECTED_POINT
+    static final CachingProperty<Boolean> SHOW_PROJECTED_POINT
             = new BooleanProperty("draw.anglesnap.drawProjectedPoint", true).cached();
-    private static final CachingProperty<Boolean> SNAP_TO_PROJECTIONS
+    static final CachingProperty<Boolean> SNAP_TO_PROJECTIONS
             = new BooleanProperty("draw.anglesnap.projectionsnap", true).cached();
 
-    private static final CachingProperty<Boolean> SHOW_ANGLE
+    static final CachingProperty<Boolean> SHOW_ANGLE
             = new BooleanProperty("draw.anglesnap.showAngle", true).cached();
 
-    private static final CachingProperty<Color> SNAP_HELPER_COLOR
+    static final CachingProperty<Color> SNAP_HELPER_COLOR
             = new ColorProperty(marktr("draw angle snap"), Color.ORANGE).cached();
 
-    private static final CachingProperty<Color> HIGHLIGHT_COLOR
+    static final CachingProperty<Color> HIGHLIGHT_COLOR
             = new ColorProperty(marktr("draw angle snap highlight"), ORANGE_TRANSPARENT).cached();
 
-    private static final AbstractToStringProperty<Color> RUBBER_LINE_COLOR
+    static final AbstractToStringProperty<Color> RUBBER_LINE_COLOR
             = PaintColors.SELECTED.getProperty().getChildColor(marktr("helper line"));
 
-    private static final CachingProperty<Boolean> DRAW_HELPER_LINE
+    static final CachingProperty<Boolean> DRAW_HELPER_LINE
             = new BooleanProperty("draw.helper-line", true).cached();
-    private static final CachingProperty<Boolean> DRAW_TARGET_HIGHLIGHT
+    static final CachingProperty<Boolean> DRAW_TARGET_HIGHLIGHT
             = new BooleanProperty("draw.target-highlight", true).cached();
-    private static final CachingProperty<Double> SNAP_TO_INTERSECTION_THRESHOLD
+    static final CachingProperty<Double> SNAP_TO_INTERSECTION_THRESHOLD
             = new DoubleProperty("edit.snap-intersection-threshold", 10).cached();
 
     private final Cursor cursorJoinNode;
@@ -150,7 +140,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     private transient Node previousNode;
     private EastNorth currentMouseEastNorth;
 
-    private final transient SnapHelper snapHelper = new SnapHelper();
+    private final transient DrawSnapHelper snapHelper = new DrawSnapHelper(this);
 
     private final transient Shortcut backspaceShortcut;
     private final BackSpaceAction backspaceAction;
@@ -228,7 +218,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
 
         // update selection to reflect which way being modified
         OsmDataLayer editLayer = getLayerManager().getEditLayer();
-        if (getCurrentBaseNode() != null && editLayer != null && !editLayer.data.selectionEmpty()) {
+        if (editLayer != null && getCurrentBaseNode() != null && !editLayer.data.selectionEmpty()) {
             DataSet currentDataSet = editLayer.data;
             Way continueFrom = getWayForNode(getCurrentBaseNode());
             if (alt && continueFrom != null && (!getCurrentBaseNode().isSelected() || continueFrom.isSelected())) {
@@ -872,7 +862,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         // status bar was filled by snapHelper
     }
 
-    private static void showStatusInfo(double angle, double hdg, double distance, boolean activeFlag) {
+    static void showStatusInfo(double angle, double hdg, double distance, boolean activeFlag) {
         Main.map.statusLine.setAngle(angle);
         Main.map.statusLine.activateAnglePanel(activeFlag);
         Main.map.statusLine.setHeading(hdg);
@@ -1123,7 +1113,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         }
 
         // This happens when nothing is selected, but we still want to highlight the "target node"
-        if (mouseOnExistingNode == null && getLayerManager().getEditDataSet().selectionEmpty() && mousePos != null) {
+        if (mouseOnExistingNode == null && mousePos != null && getLayerManager().getEditDataSet().selectionEmpty()) {
             mouseOnExistingNode = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive::isSelectable);
         }
 
@@ -1160,7 +1150,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         // sanity checks
         if (Main.map.mapView == null || mousePos == null
                 // don't draw line if we don't know where from or where to
-                || getCurrentBaseNode() == null || currentMouseEastNorth == null
+                || currentMouseEastNorth == null || getCurrentBaseNode() == null
                 // don't draw line if mouse is outside window
                 || !Main.map.mapView.getBounds().contains(mousePos))
             return;
@@ -1237,7 +1227,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         /*
          * Check whether a connection will be made
          */
-        if (getCurrentBaseNode() != null && !wayIsFinished) {
+        if (!wayIsFinished && getCurrentBaseNode() != null) {
             if (alt) {
                 rv.append(' ').append(tr("Start new way from last node."));
             } else {
@@ -1341,459 +1331,6 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         }
     }
 
-    private class SnapHelper {
-        private static final String DRAW_ANGLESNAP_ANGLES = "draw.anglesnap.angles";
-
-        private final class AnglePopupMenu extends JPopupMenu {
-
-            private final JCheckBoxMenuItem repeatedCb = new JCheckBoxMenuItem(
-                    new AbstractAction(tr("Toggle snapping by {0}", getShortcut().getKeyText())) {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                    USE_REPEATED_SHORTCUT.put(sel);
-                }
-            });
-
-            private final JCheckBoxMenuItem helperCb = new JCheckBoxMenuItem(
-                    new AbstractAction(tr("Show helper geometry")) {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                    DRAW_CONSTRUCTION_GEOMETRY.put(sel);
-                    SHOW_PROJECTED_POINT.put(sel);
-                    SHOW_ANGLE.put(sel);
-                    enableSnapping();
-                }
-            });
-
-            private final JCheckBoxMenuItem projectionCb = new JCheckBoxMenuItem(
-                    new AbstractAction(tr("Snap to node projections")) {
-                @Override
-                public void actionPerformed(ActionEvent e) {
-                    boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
-                    SNAP_TO_PROJECTIONS.put(sel);
-                    enableSnapping();
-                }
-            });
-
-            private AnglePopupMenu() {
-                helperCb.setState(DRAW_CONSTRUCTION_GEOMETRY.get());
-                projectionCb.setState(SNAP_TO_PROJECTIONS.get());
-                repeatedCb.setState(USE_REPEATED_SHORTCUT.get());
-                add(repeatedCb);
-                add(helperCb);
-                add(projectionCb);
-                add(new AbstractAction(tr("Disable")) {
-                    @Override public void actionPerformed(ActionEvent e) {
-                        saveAngles("180");
-                        init();
-                        enableSnapping();
-                    }
-                });
-                add(new AbstractAction(tr("0,90,...")) {
-                    @Override public void actionPerformed(ActionEvent e) {
-                        saveAngles("0", "90", "180");
-                        init();
-                        enableSnapping();
-                    }
-                });
-                add(new AbstractAction(tr("0,45,90,...")) {
-                    @Override public void actionPerformed(ActionEvent e) {
-                        saveAngles("0", "45", "90", "135", "180");
-                        init();
-                        enableSnapping();
-                    }
-                });
-                add(new AbstractAction(tr("0,30,45,60,90,...")) {
-                    @Override public void actionPerformed(ActionEvent e) {
-                        saveAngles("0", "30", "45", "60", "90", "120", "135", "150", "180");
-                        init();
-                        enableSnapping();
-                    }
-                });
-            }
-        }
-
-        private boolean snapOn; // snapping is turned on
-
-        private boolean active; // snapping is active for current mouse position
-        private boolean fixed; // snap angle is fixed
-        private boolean absoluteFix; // snap angle is absolute
-
-        private EastNorth dir2;
-        private EastNorth projected;
-        private String labelText;
-        private double lastAngle;
-
-        private double customBaseHeading = -1; // angle of base line, if not last segment)
-        private EastNorth segmentPoint1; // remembered first point of base segment
-        private EastNorth segmentPoint2; // remembered second point of base segment
-        private EastNorth projectionSource; // point that we are projecting to the line
-
-        private double[] snapAngles;
-
-        private double pe, pn; // (pe, pn) - direction of snapping line
-        private double e0, n0; // (e0, n0) - origin of snapping line
-
-        private final String fixFmt = "%d "+tr("FIX");
-
-        private JCheckBoxMenuItem checkBox;
-
-        private final MouseListener anglePopupListener = new PopupMenuLauncher(new AnglePopupMenu()) {
-            @Override
-            public void mouseClicked(MouseEvent e) {
-                super.mouseClicked(e);
-                if (e.getButton() == MouseEvent.BUTTON1) {
-                    toggleSnapping();
-                    updateStatusLine();
-                }
-            }
-        };
-
-        /**
-         * Set the initial state
-         */
-        public void init() {
-            snapOn = false;
-            checkBox.setState(snapOn);
-            fixed = false;
-            absoluteFix = false;
-
-            computeSnapAngles();
-            Main.pref.addWeakKeyPreferenceChangeListener(DRAW_ANGLESNAP_ANGLES, e -> this.computeSnapAngles());
-        }
-
-        private void computeSnapAngles() {
-            snapAngles = Main.pref.getCollection(DRAW_ANGLESNAP_ANGLES,
-                    Arrays.asList("0", "30", "45", "60", "90", "120", "135", "150", "180"))
-                    .stream()
-                    .mapToDouble(this::parseSnapAngle)
-                    .flatMap(s -> DoubleStream.of(s, 360-s))
-                    .toArray();
-        }
-
-        private double parseSnapAngle(String string) {
-            try {
-                return Double.parseDouble(string);
-            } catch (NumberFormatException e) {
-                Main.warn("Incorrect number in draw.anglesnap.angles preferences: {0}", string);
-                return 0;
-            }
-        }
-
-        /**
-         * Save the snap angles
-         * @param angles The angles
-         */
-        public void saveAngles(String ... angles) {
-            Main.pref.putCollection(DRAW_ANGLESNAP_ANGLES, Arrays.asList(angles));
-        }
-
-        public void setMenuCheckBox(JCheckBoxMenuItem checkBox) {
-            this.checkBox = checkBox;
-        }
-
-        /**
-         * Draw the snap hint line.
-         * @param g2 graphics
-         * @param mv MapView state
-         * @since 10874
-         */
-        public void drawIfNeeded(Graphics2D g2, MapViewState mv) {
-            if (!snapOn || !active)
-                return;
-            MapViewPoint p1 = mv.getPointFor(getCurrentBaseNode());
-            MapViewPoint p2 = mv.getPointFor(dir2);
-            MapViewPoint p3 = mv.getPointFor(projected);
-            if (DRAW_CONSTRUCTION_GEOMETRY.get()) {
-                g2.setColor(SNAP_HELPER_COLOR.get());
-                g2.setStroke(HELPER_STROKE.get());
-
-                MapViewPath b = new MapViewPath(mv);
-                b.moveTo(p2);
-                if (absoluteFix) {
-                    b.lineTo(p2.interpolate(p1, 2)); // bi-directional line
-                } else {
-                    b.lineTo(p3);
-                }
-                g2.draw(b);
-            }
-            if (projectionSource != null) {
-                g2.setColor(SNAP_HELPER_COLOR.get());
-                g2.setStroke(HELPER_STROKE.get());
-                MapViewPath b = new MapViewPath(mv);
-                b.moveTo(p3);
-                b.lineTo(projectionSource);
-                g2.draw(b);
-            }
-
-            if (customBaseHeading >= 0) {
-                g2.setColor(HIGHLIGHT_COLOR.get());
-                g2.setStroke(HIGHLIGHT_STROKE.get());
-                MapViewPath b = new MapViewPath(mv);
-                b.moveTo(segmentPoint1);
-                b.lineTo(segmentPoint2);
-                g2.draw(b);
-            }
-
-            g2.setColor(RUBBER_LINE_COLOR.get());
-            g2.setStroke(RUBBER_LINE_STROKE.get());
-            MapViewPath b = new MapViewPath(mv);
-            b.moveTo(p1);
-            b.lineTo(p3);
-            g2.draw(b);
-
-            g2.drawString(labelText, (int) p3.getInViewX()-5, (int) p3.getInViewY()+20);
-            if (SHOW_PROJECTED_POINT.get()) {
-                g2.setStroke(RUBBER_LINE_STROKE.get());
-                g2.draw(new MapViewPath(mv).shapeAround(p3, SymbolShape.CIRCLE, 10)); // projected point
-            }
-
-            g2.setColor(SNAP_HELPER_COLOR.get());
-            g2.setStroke(HELPER_STROKE.get());
-        }
-
-        /**
-         * If mouse position is close to line at 15-30-45-... angle, remembers this direction
-         * @param currentEN Current position
-         * @param baseHeading The heading
-         * @param curHeading The current mouse heading
-         */
-        public void checkAngleSnapping(EastNorth currentEN, double baseHeading, double curHeading) {
-            EastNorth p0 = getCurrentBaseNode().getEastNorth();
-            EastNorth snapPoint = currentEN;
-            double angle = -1;
-
-            double activeBaseHeading = (customBaseHeading >= 0) ? customBaseHeading : baseHeading;
-
-            if (snapOn && (activeBaseHeading >= 0)) {
-                angle = curHeading - activeBaseHeading;
-                if (angle < 0) {
-                    angle += 360;
-                }
-                if (angle > 360) {
-                    angle = 0;
-                }
-
-                double nearestAngle;
-                if (fixed) {
-                    nearestAngle = lastAngle; // if direction is fixed use previous angle
-                    active = true;
-                } else {
-                    nearestAngle = getNearestAngle(angle);
-                    if (getAngleDelta(nearestAngle, angle) < SNAP_ANGLE_TOLERANCE.get()) {
-                        active = customBaseHeading >= 0 || Math.abs(nearestAngle - 180) > 1e-3;
-                        // if angle is to previous segment, exclude 180 degrees
-                        lastAngle = nearestAngle;
-                    } else {
-                        active = false;
-                    }
-                }
-
-                if (active) {
-                    double phi;
-                    e0 = p0.east();
-                    n0 = p0.north();
-                    buildLabelText((nearestAngle <= 180) ? nearestAngle : (nearestAngle-360));
-
-                    phi = (nearestAngle + activeBaseHeading) * Math.PI / 180;
-                    // (pe,pn) - direction of snapping line
-                    pe = Math.sin(phi);
-                    pn = Math.cos(phi);
-                    double scale = 20 * Main.map.mapView.getDist100Pixel();
-                    dir2 = new EastNorth(e0 + scale * pe, n0 + scale * pn);
-                    snapPoint = getSnapPoint(currentEN);
-                } else {
-                    noSnapNow();
-                }
-            }
-
-            // find out the distance, in metres, between the base point and projected point
-            LatLon mouseLatLon = Main.map.mapView.getProjection().eastNorth2latlon(snapPoint);
-            double distance = getCurrentBaseNode().getCoor().greatCircleDistance(mouseLatLon);
-            double hdg = Math.toDegrees(p0.heading(snapPoint));
-            // heading of segment from current to calculated point, not to mouse position
-
-            if (baseHeading >= 0) { // there is previous line segment with some heading
-                angle = hdg - baseHeading;
-                if (angle < 0) {
-                    angle += 360;
-                }
-                if (angle > 360) {
-                    angle = 0;
-                }
-            }
-            showStatusInfo(angle, hdg, distance, isSnapOn());
-        }
-
-        private void buildLabelText(double nearestAngle) {
-            if (SHOW_ANGLE.get()) {
-                if (fixed) {
-                    if (absoluteFix) {
-                        labelText = "=";
-                    } else {
-                        labelText = String.format(fixFmt, (int) nearestAngle);
-                    }
-                } else {
-                    labelText = String.format("%d", (int) nearestAngle);
-                }
-            } else {
-                if (fixed) {
-                    if (absoluteFix) {
-                        labelText = "=";
-                    } else {
-                        labelText = String.format(tr("FIX"), 0);
-                    }
-                } else {
-                    labelText = "";
-                }
-            }
-        }
-
-        /**
-         * Gets a snap point close to p. Stores the result for display.
-         * @param p The point
-         * @return The snap point close to p.
-         */
-        public EastNorth getSnapPoint(EastNorth p) {
-            if (!active)
-                return p;
-            double de = p.east()-e0;
-            double dn = p.north()-n0;
-            double l = de*pe+dn*pn;
-            double delta = Main.map.mapView.getDist100Pixel()/20;
-            if (!absoluteFix && l < delta) {
-                active = false;
-                return p;
-            } //  do not go backward!
-
-            projectionSource = null;
-            if (SNAP_TO_PROJECTIONS.get()) {
-                DataSet ds = getLayerManager().getEditDataSet();
-                Collection<Way> selectedWays = ds.getSelectedWays();
-                if (selectedWays.size() == 1) {
-                    Way w = selectedWays.iterator().next();
-                    Collection<EastNorth> pointsToProject = new ArrayList<>();
-                    if (w.getNodesCount() < 1000) {
-                        for (Node n: w.getNodes()) {
-                            pointsToProject.add(n.getEastNorth());
-                        }
-                    }
-                    if (customBaseHeading >= 0) {
-                        pointsToProject.add(segmentPoint1);
-                        pointsToProject.add(segmentPoint2);
-                    }
-                    EastNorth enOpt = null;
-                    double dOpt = 1e5;
-                    for (EastNorth en: pointsToProject) { // searching for besht projection
-                        double l1 = (en.east()-e0)*pe+(en.north()-n0)*pn;
-                        double d1 = Math.abs(l1-l);
-                        if (d1 < delta && d1 < dOpt) {
-                            l = l1;
-                            enOpt = en;
-                            dOpt = d1;
-                        }
-                    }
-                    if (enOpt != null) {
-                        projectionSource = enOpt;
-                    }
-                }
-            }
-            projected = new EastNorth(e0+l*pe, n0+l*pn);
-            return projected;
-        }
-
-        /**
-         * Disables snapping
-         */
-        public void noSnapNow() {
-            active = false;
-            dir2 = null;
-            projected = null;
-            labelText = null;
-        }
-
-        public void setBaseSegment(WaySegment seg) {
-            if (seg == null) return;
-            segmentPoint1 = seg.getFirstNode().getEastNorth();
-            segmentPoint2 = seg.getSecondNode().getEastNorth();
-
-            double hdg = segmentPoint1.heading(segmentPoint2);
-            hdg = Math.toDegrees(hdg);
-            if (hdg < 0) {
-                hdg += 360;
-            }
-            if (hdg > 360) {
-                hdg -= 360;
-            }
-            customBaseHeading = hdg;
-        }
-
-        /**
-         * Enable snapping.
-         */
-        private void enableSnapping() {
-            snapOn = true;
-            checkBox.setState(snapOn);
-            customBaseHeading = -1;
-            unsetFixedMode();
-        }
-
-        private void toggleSnapping() {
-            snapOn = !snapOn;
-            checkBox.setState(snapOn);
-            customBaseHeading = -1;
-            unsetFixedMode();
-        }
-
-        public void setFixedMode() {
-            if (active) {
-                fixed = true;
-            }
-        }
-
-        public void unsetFixedMode() {
-            fixed = false;
-            absoluteFix = false;
-            lastAngle = 0;
-            active = false;
-        }
-
-        public boolean isActive() {
-            return active;
-        }
-
-        public boolean isSnapOn() {
-            return snapOn;
-        }
-
-        private double getNearestAngle(double angle) {
-            double bestAngle = DoubleStream.of(snapAngles).boxed()
-                    .min(Comparator.comparing(snapAngle -> getAngleDelta(angle, snapAngle))).orElse(0.0);
-            if (Math.abs(bestAngle-360) < 1e-3) {
-                bestAngle = 0;
-            }
-            return bestAngle;
-        }
-
-        private double getAngleDelta(double a, double b) {
-            double delta = Math.abs(a-b);
-            if (delta > 180)
-                return 360-delta;
-            else
-                return delta;
-        }
-
-        private void unFixOrTurnOff() {
-            if (absoluteFix) {
-                unsetFixedMode();
-            } else {
-                toggleSnapping();
-            }
-        }
-    }
-
     private class SnapChangeAction extends JosmAction {
         /**
          * Constructs a new {@code SnapChangeAction}.
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java b/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java
new file mode 100644
index 0000000..5020d25
--- /dev/null
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java
@@ -0,0 +1,563 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions.mapmode;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Graphics2D;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.stream.DoubleStream;
+
+import javax.swing.AbstractAction;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JPopupMenu;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.gui.MapViewState;
+import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+import org.openstreetmap.josm.gui.draw.MapViewPath;
+import org.openstreetmap.josm.gui.draw.SymbolShape;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+
+class DrawSnapHelper {
+
+    private final DrawAction drawAction;
+
+    /**
+     * Constructs a new {@code SnapHelper}.
+     * @param drawAction enclosing DrawAction
+     */
+    DrawSnapHelper(DrawAction drawAction) {
+        this.drawAction = drawAction;
+        this.anglePopupListener = new PopupMenuLauncher(new AnglePopupMenu(this)) {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                super.mouseClicked(e);
+                if (e.getButton() == MouseEvent.BUTTON1) {
+                    toggleSnapping();
+                    drawAction.updateStatusLine();
+                }
+            }
+        };
+    }
+
+    private static final String DRAW_ANGLESNAP_ANGLES = "draw.anglesnap.angles";
+
+    private static final class RepeatedAction extends AbstractAction {
+        RepeatedAction(DrawSnapHelper snapHelper) {
+            super(tr("Toggle snapping by {0}", snapHelper.drawAction.getShortcut().getKeyText()));
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+            DrawAction.USE_REPEATED_SHORTCUT.put(sel);
+        }
+    }
+
+    private static final class HelperAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        HelperAction(DrawSnapHelper snapHelper) {
+            super(tr("Show helper geometry"));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+            DrawAction.DRAW_CONSTRUCTION_GEOMETRY.put(sel);
+            DrawAction.SHOW_PROJECTED_POINT.put(sel);
+            DrawAction.SHOW_ANGLE.put(sel);
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class ProjectionAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        ProjectionAction(DrawSnapHelper snapHelper) {
+            super(tr("Snap to node projections"));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+            DrawAction.SNAP_TO_PROJECTIONS.put(sel);
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class DisableAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        DisableAction(DrawSnapHelper snapHelper) {
+            super(tr("Disable"));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            snapHelper.saveAngles("180");
+            snapHelper.init();
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class Snap90DegreesAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        Snap90DegreesAction(DrawSnapHelper snapHelper) {
+            super(tr("0,90,..."));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            snapHelper.saveAngles("0", "90", "180");
+            snapHelper.init();
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class Snap45DegreesAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        Snap45DegreesAction(DrawSnapHelper snapHelper) {
+            super(tr("0,45,90,..."));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            snapHelper.saveAngles("0", "45", "90", "135", "180");
+            snapHelper.init();
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class Snap30DegreesAction extends AbstractAction {
+        private final transient DrawSnapHelper snapHelper;
+
+        Snap30DegreesAction(DrawSnapHelper snapHelper) {
+            super(tr("0,30,45,60,90,..."));
+            this.snapHelper = snapHelper;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            snapHelper.saveAngles("0", "30", "45", "60", "90", "120", "135", "150", "180");
+            snapHelper.init();
+            snapHelper.enableSnapping();
+        }
+    }
+
+    private static final class AnglePopupMenu extends JPopupMenu {
+
+        private final JCheckBoxMenuItem repeatedCb;
+        private final JCheckBoxMenuItem helperCb;
+        private final JCheckBoxMenuItem projectionCb;
+
+        private AnglePopupMenu(final DrawSnapHelper snapHelper) {
+            repeatedCb = new JCheckBoxMenuItem(new RepeatedAction(snapHelper));
+            helperCb = new JCheckBoxMenuItem(new HelperAction(snapHelper));
+            projectionCb = new JCheckBoxMenuItem(new ProjectionAction(snapHelper));
+
+            helperCb.setState(DrawAction.DRAW_CONSTRUCTION_GEOMETRY.get());
+            projectionCb.setState(DrawAction.SNAP_TO_PROJECTIONS.get());
+            repeatedCb.setState(DrawAction.USE_REPEATED_SHORTCUT.get());
+            add(repeatedCb);
+            add(helperCb);
+            add(projectionCb);
+            add(new DisableAction(snapHelper));
+            add(new Snap90DegreesAction(snapHelper));
+            add(new Snap45DegreesAction(snapHelper));
+            add(new Snap30DegreesAction(snapHelper));
+        }
+    }
+
+    private boolean snapOn; // snapping is turned on
+
+    private boolean active; // snapping is active for current mouse position
+    private boolean fixed; // snap angle is fixed
+    private boolean absoluteFix; // snap angle is absolute
+
+    EastNorth dir2;
+    private EastNorth projected;
+    private String labelText;
+    private double lastAngle;
+
+    private double customBaseHeading = -1; // angle of base line, if not last segment)
+    private EastNorth segmentPoint1; // remembered first point of base segment
+    private EastNorth segmentPoint2; // remembered second point of base segment
+    private EastNorth projectionSource; // point that we are projecting to the line
+
+    private double[] snapAngles;
+
+    private double pe, pn; // (pe, pn) - direction of snapping line
+    private double e0, n0; // (e0, n0) - origin of snapping line
+
+    private final String fixFmt = "%d "+tr("FIX");
+
+    private JCheckBoxMenuItem checkBox;
+
+    final MouseListener anglePopupListener;
+
+    /**
+     * Set the initial state
+     */
+    public void init() {
+        snapOn = false;
+        checkBox.setState(snapOn);
+        fixed = false;
+        absoluteFix = false;
+
+        computeSnapAngles();
+        Main.pref.addWeakKeyPreferenceChangeListener(DRAW_ANGLESNAP_ANGLES, e -> this.computeSnapAngles());
+    }
+
+    private void computeSnapAngles() {
+        snapAngles = Main.pref.getCollection(DRAW_ANGLESNAP_ANGLES,
+                Arrays.asList("0", "30", "45", "60", "90", "120", "135", "150", "180"))
+                .stream()
+                .mapToDouble(DrawSnapHelper::parseSnapAngle)
+                .flatMap(s -> DoubleStream.of(s, 360-s))
+                .toArray();
+    }
+
+    private static double parseSnapAngle(String string) {
+        try {
+            return Double.parseDouble(string);
+        } catch (NumberFormatException e) {
+            Main.warn("Incorrect number in draw.anglesnap.angles preferences: {0}", string);
+            return 0;
+        }
+    }
+
+    /**
+     * Save the snap angles
+     * @param angles The angles
+     */
+    public void saveAngles(String ... angles) {
+        Main.pref.putCollection(DRAW_ANGLESNAP_ANGLES, Arrays.asList(angles));
+    }
+
+    /**
+     * Sets the menu checkbox.
+     * @param checkBox menu checkbox
+     */
+    public void setMenuCheckBox(JCheckBoxMenuItem checkBox) {
+        this.checkBox = checkBox;
+    }
+
+    /**
+     * Draw the snap hint line.
+     * @param g2 graphics
+     * @param mv MapView state
+     * @since 10874
+     */
+    public void drawIfNeeded(Graphics2D g2, MapViewState mv) {
+        if (!snapOn || !active)
+            return;
+        MapViewPoint p1 = mv.getPointFor(drawAction.getCurrentBaseNode());
+        MapViewPoint p2 = mv.getPointFor(dir2);
+        MapViewPoint p3 = mv.getPointFor(projected);
+        if (DrawAction.DRAW_CONSTRUCTION_GEOMETRY.get()) {
+            g2.setColor(DrawAction.SNAP_HELPER_COLOR.get());
+            g2.setStroke(DrawAction.HELPER_STROKE.get());
+
+            MapViewPath b = new MapViewPath(mv);
+            b.moveTo(p2);
+            if (absoluteFix) {
+                b.lineTo(p2.interpolate(p1, 2)); // bi-directional line
+            } else {
+                b.lineTo(p3);
+            }
+            g2.draw(b);
+        }
+        if (projectionSource != null) {
+            g2.setColor(DrawAction.SNAP_HELPER_COLOR.get());
+            g2.setStroke(DrawAction.HELPER_STROKE.get());
+            MapViewPath b = new MapViewPath(mv);
+            b.moveTo(p3);
+            b.lineTo(projectionSource);
+            g2.draw(b);
+        }
+
+        if (customBaseHeading >= 0) {
+            g2.setColor(DrawAction.HIGHLIGHT_COLOR.get());
+            g2.setStroke(DrawAction.HIGHLIGHT_STROKE.get());
+            MapViewPath b = new MapViewPath(mv);
+            b.moveTo(segmentPoint1);
+            b.lineTo(segmentPoint2);
+            g2.draw(b);
+        }
+
+        g2.setColor(DrawAction.RUBBER_LINE_COLOR.get());
+        g2.setStroke(DrawAction.RUBBER_LINE_STROKE.get());
+        MapViewPath b = new MapViewPath(mv);
+        b.moveTo(p1);
+        b.lineTo(p3);
+        g2.draw(b);
+
+        g2.drawString(labelText, (int) p3.getInViewX()-5, (int) p3.getInViewY()+20);
+        if (DrawAction.SHOW_PROJECTED_POINT.get()) {
+            g2.setStroke(DrawAction.RUBBER_LINE_STROKE.get());
+            g2.draw(new MapViewPath(mv).shapeAround(p3, SymbolShape.CIRCLE, 10)); // projected point
+        }
+
+        g2.setColor(DrawAction.SNAP_HELPER_COLOR.get());
+        g2.setStroke(DrawAction.HELPER_STROKE.get());
+    }
+
+    /**
+     * If mouse position is close to line at 15-30-45-... angle, remembers this direction
+     * @param currentEN Current position
+     * @param baseHeading The heading
+     * @param curHeading The current mouse heading
+     */
+    public void checkAngleSnapping(EastNorth currentEN, double baseHeading, double curHeading) {
+        EastNorth p0 = drawAction.getCurrentBaseNode().getEastNorth();
+        EastNorth snapPoint = currentEN;
+        double angle = -1;
+
+        double activeBaseHeading = (customBaseHeading >= 0) ? customBaseHeading : baseHeading;
+
+        if (snapOn && (activeBaseHeading >= 0)) {
+            angle = curHeading - activeBaseHeading;
+            if (angle < 0) {
+                angle += 360;
+            }
+            if (angle > 360) {
+                angle = 0;
+            }
+
+            double nearestAngle;
+            if (fixed) {
+                nearestAngle = lastAngle; // if direction is fixed use previous angle
+                active = true;
+            } else {
+                nearestAngle = getNearestAngle(angle);
+                if (getAngleDelta(nearestAngle, angle) < DrawAction.SNAP_ANGLE_TOLERANCE.get()) {
+                    active = customBaseHeading >= 0 || Math.abs(nearestAngle - 180) > 1e-3;
+                    // if angle is to previous segment, exclude 180 degrees
+                    lastAngle = nearestAngle;
+                } else {
+                    active = false;
+                }
+            }
+
+            if (active) {
+                double phi;
+                e0 = p0.east();
+                n0 = p0.north();
+                buildLabelText((nearestAngle <= 180) ? nearestAngle : (nearestAngle-360));
+
+                phi = (nearestAngle + activeBaseHeading) * Math.PI / 180;
+                // (pe,pn) - direction of snapping line
+                pe = Math.sin(phi);
+                pn = Math.cos(phi);
+                double scale = 20 * Main.map.mapView.getDist100Pixel();
+                dir2 = new EastNorth(e0 + scale * pe, n0 + scale * pn);
+                snapPoint = getSnapPoint(currentEN);
+            } else {
+                noSnapNow();
+            }
+        }
+
+        // find out the distance, in metres, between the base point and projected point
+        LatLon mouseLatLon = Main.map.mapView.getProjection().eastNorth2latlon(snapPoint);
+        double distance = this.drawAction.getCurrentBaseNode().getCoor().greatCircleDistance(mouseLatLon);
+        double hdg = Math.toDegrees(p0.heading(snapPoint));
+        // heading of segment from current to calculated point, not to mouse position
+
+        if (baseHeading >= 0) { // there is previous line segment with some heading
+            angle = hdg - baseHeading;
+            if (angle < 0) {
+                angle += 360;
+            }
+            if (angle > 360) {
+                angle = 0;
+            }
+        }
+        DrawAction.showStatusInfo(angle, hdg, distance, isSnapOn());
+    }
+
+    private void buildLabelText(double nearestAngle) {
+        if (DrawAction.SHOW_ANGLE.get()) {
+            if (fixed) {
+                if (absoluteFix) {
+                    labelText = "=";
+                } else {
+                    labelText = String.format(fixFmt, (int) nearestAngle);
+                }
+            } else {
+                labelText = String.format("%d", (int) nearestAngle);
+            }
+        } else {
+            if (fixed) {
+                if (absoluteFix) {
+                    labelText = "=";
+                } else {
+                    labelText = String.format(tr("FIX"), 0);
+                }
+            } else {
+                labelText = "";
+            }
+        }
+    }
+
+    /**
+     * Gets a snap point close to p. Stores the result for display.
+     * @param p The point
+     * @return The snap point close to p.
+     */
+    public EastNorth getSnapPoint(EastNorth p) {
+        if (!active)
+            return p;
+        double de = p.east()-e0;
+        double dn = p.north()-n0;
+        double l = de*pe+dn*pn;
+        double delta = Main.map.mapView.getDist100Pixel()/20;
+        if (!absoluteFix && l < delta) {
+            active = false;
+            return p;
+        } //  do not go backward!
+
+        projectionSource = null;
+        if (DrawAction.SNAP_TO_PROJECTIONS.get()) {
+            DataSet ds = drawAction.getLayerManager().getEditDataSet();
+            Collection<Way> selectedWays = ds.getSelectedWays();
+            if (selectedWays.size() == 1) {
+                Way w = selectedWays.iterator().next();
+                Collection<EastNorth> pointsToProject = new ArrayList<>();
+                if (w.getNodesCount() < 1000) {
+                    for (Node n: w.getNodes()) {
+                        pointsToProject.add(n.getEastNorth());
+                    }
+                }
+                if (customBaseHeading >= 0) {
+                    pointsToProject.add(segmentPoint1);
+                    pointsToProject.add(segmentPoint2);
+                }
+                EastNorth enOpt = null;
+                double dOpt = 1e5;
+                for (EastNorth en: pointsToProject) { // searching for besht projection
+                    double l1 = (en.east()-e0)*pe+(en.north()-n0)*pn;
+                    double d1 = Math.abs(l1-l);
+                    if (d1 < delta && d1 < dOpt) {
+                        l = l1;
+                        enOpt = en;
+                        dOpt = d1;
+                    }
+                }
+                if (enOpt != null) {
+                    projectionSource = enOpt;
+                }
+            }
+        }
+        projected = new EastNorth(e0+l*pe, n0+l*pn);
+        return projected;
+    }
+
+    /**
+     * Disables snapping
+     */
+    void noSnapNow() {
+        active = false;
+        dir2 = null;
+        projected = null;
+        labelText = null;
+    }
+
+    void setBaseSegment(WaySegment seg) {
+        if (seg == null) return;
+        segmentPoint1 = seg.getFirstNode().getEastNorth();
+        segmentPoint2 = seg.getSecondNode().getEastNorth();
+
+        double hdg = segmentPoint1.heading(segmentPoint2);
+        hdg = Math.toDegrees(hdg);
+        if (hdg < 0) {
+            hdg += 360;
+        }
+        if (hdg > 360) {
+            hdg -= 360;
+        }
+        customBaseHeading = hdg;
+    }
+
+    /**
+     * Enable snapping.
+     */
+    void enableSnapping() {
+        snapOn = true;
+        checkBox.setState(snapOn);
+        customBaseHeading = -1;
+        unsetFixedMode();
+    }
+
+    void toggleSnapping() {
+        snapOn = !snapOn;
+        checkBox.setState(snapOn);
+        customBaseHeading = -1;
+        unsetFixedMode();
+    }
+
+    void setFixedMode() {
+        if (active) {
+            fixed = true;
+        }
+    }
+
+    void unsetFixedMode() {
+        fixed = false;
+        absoluteFix = false;
+        lastAngle = 0;
+        active = false;
+    }
+
+    boolean isActive() {
+        return active;
+    }
+
+    boolean isSnapOn() {
+        return snapOn;
+    }
+
+    private double getNearestAngle(double angle) {
+        double bestAngle = DoubleStream.of(snapAngles).boxed()
+                .min(Comparator.comparing(snapAngle -> getAngleDelta(angle, snapAngle))).orElse(0.0);
+        if (Math.abs(bestAngle-360) < 1e-3) {
+            bestAngle = 0;
+        }
+        return bestAngle;
+    }
+
+    private static double getAngleDelta(double a, double b) {
+        double delta = Math.abs(a-b);
+        if (delta > 180)
+            return 360-delta;
+        else
+            return delta;
+    }
+
+    void unFixOrTurnOff() {
+        if (absoluteFix) {
+            unsetFixedMode();
+        } else {
+            toggleSnapping();
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
index c99c7a8..11f48f1 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
@@ -269,9 +269,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
                 rv = new StringBuilder(tr("Move a segment along its normal, then release the mouse button."));
             else if (mode == Mode.translate_node)
                 rv = new StringBuilder(tr("Move the node along one of the segments, then release the mouse button."));
-            else if (mode == Mode.extrude)
-                rv = new StringBuilder(tr("Draw a rectangle of the desired size, then release the mouse button."));
-            else if (mode == Mode.create_new)
+            else if (mode == Mode.extrude || mode == Mode.create_new)
                 rv = new StringBuilder(tr("Draw a rectangle of the desired size, then release the mouse button."));
             else {
                 Main.warn("Extrude: unknown mode " + mode);
diff --git a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
index 2fd2d9c..8d758f5 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
@@ -585,7 +585,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             selectionManager.unregister(mv);
 
             // Select Draw Tool if no selection has been made
-            if (getLayerManager().getEditDataSet().selectionEmpty() && !cancelDrawMode) {
+            if (!cancelDrawMode && getLayerManager().getEditDataSet().selectionEmpty()) {
                 Main.map.selectDrawTool(true);
                 updateStatusLine();
                 return;
@@ -638,8 +638,8 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
 
     @Override
     public void doKeyPressed(KeyEvent e) {
-        if (!Main.isDisplayingMapView() ||
-                !repeatedKeySwitchLassoOption || !getShortcut().isEvent(e)) return;
+        if (!repeatedKeySwitchLassoOption || !Main.isDisplayingMapView() || !getShortcut().isEvent(e))
+            return;
         if (Main.isDebugEnabled()) {
             Main.debug(getClass().getName()+" consuming event "+e);
         }
diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
index 09c3c43..68144ab 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchAction.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchAction.java
@@ -431,7 +431,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         if (Main.pref.getBoolean("expert", false)) {
             right.add(new SearchKeywordRow(hcbSearchString)
                 .addTitle(tr("objects"))
-                .addKeyword("type:node", "type:node ", tr("all ways"))
+                .addKeyword("type:node", "type:node ", tr("all nodes"))
                 .addKeyword("type:way", "type:way ", tr("all ways"))
                 .addKeyword("type:relation", "type:relation ", tr("all relations"))
                 .addKeyword("closed", "closed ", tr("all closed ways"))
@@ -461,7 +461,8 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
                 .addKeyword("modified", "modified ", tr("all modified objects"))
                 .addKeyword("new", "new ", tr("all new objects"))
                 .addKeyword("selected", "selected ", tr("all selected objects"))
-                .addKeyword("incomplete", "incomplete ", tr("all incomplete objects")),
+                .addKeyword("incomplete", "incomplete ", tr("all incomplete objects"))
+                .addKeyword("deleted", "deleted ", tr("all deleted objects (checkbox <b>{0}</b> must be enabled)", tr("all objects"))),
                 GBC.eol());
             right.add(new SearchKeywordRow(hcbSearchString)
                 .addTitle(tr("related objects"))
@@ -774,8 +775,8 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
                     regexSearch == that.regexSearch &&
                     mapCSSSearch == that.mapCSSSearch &&
                     allElements == that.allElements &&
-                    Objects.equals(text, that.text) &&
-                    mode == that.mode;
+                    mode == that.mode &&
+                    Objects.equals(text, that.text);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
index 2a12bb3..7a7056e 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
@@ -7,6 +7,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.io.PushbackReader;
 import java.io.StringReader;
 import java.text.Normalizer;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -111,7 +112,7 @@ public class SearchCompiler {
 
     public class CoreSimpleMatchFactory implements SimpleMatchFactory {
         private final Collection<String> keywords = Arrays.asList("id", "version", "type", "user", "role",
-                "changeset", "nodes", "ways", "tags", "areasize", "waylength", "modified", "selected",
+                "changeset", "nodes", "ways", "tags", "areasize", "waylength", "modified", "deleted", "selected",
                 "incomplete", "untagged", "closed", "new", "indownloadedarea",
                 "allindownloadedarea", "inview", "allinview", "timestamp", "nth", "nth%", "hasRole");
 
@@ -120,6 +121,8 @@ public class SearchCompiler {
             switch(keyword) {
             case "modified":
                 return new Modified();
+            case "deleted":
+                return new Deleted();
             case "selected":
                 return new Selected();
             case "incomplete":
@@ -1036,7 +1039,7 @@ public class SearchCompiler {
             this((int) tokenizer.readNumber(tr("Positive integer expected")), modulo);
         }
 
-        private Nth(int nth, boolean modulo) throws ParseError {
+        private Nth(int nth, boolean modulo) {
             this.nth = nth;
             this.modulo = modulo;
         }
@@ -1255,6 +1258,21 @@ public class SearchCompiler {
     }
 
     /**
+     * Matches all objects that have been deleted
+     */
+    private static class Deleted extends Match {
+        @Override
+        public boolean match(OsmPrimitive osm) {
+            return osm.isDeleted();
+        }
+
+        @Override
+        public String toString() {
+            return "deleted";
+        }
+    }
+
+    /**
      * Matches all objects currently selected
      */
     private static class Selected extends Match {
@@ -1614,52 +1632,81 @@ public class SearchCompiler {
     }
 
     /**
-     * Parse expression. This is a recursive method.
+     * Parse expression.
      *
      * @return match determined by parsing expression
-     * @throws org.openstreetmap.josm.actions.search.SearchCompiler.ParseError if search expression cannot be parsed
+     * @throws ParseError if search expression cannot be parsed
      */
     private Match parseExpression() throws ParseError {
-        Match factor = parseFactor();
-        if (factor == null)
-            // empty search string
-            return null;
-        if (tokenizer.readIfEqual(Token.OR))
-            return new Or(factor, parseExpression(tr("Missing parameter for OR")));
-        else if (tokenizer.readIfEqual(Token.XOR))
-            return new Xor(factor, parseExpression(tr("Missing parameter for XOR")));
-        else {
-            Match expression = parseExpression();
-            if (expression == null)
-                // reached end of search string, no more recursive calls
-                return factor;
-            else
-                // the default operator is AND
-                return new And(factor, expression);
-        }
+        // Step 1: parse the whole expression and build a list of factors and logical tokens
+        List<Object> list = parseExpressionStep1();
+        // Step 2: iterate the list in reverse order to build the logical expression
+        // This iterative approach avoids StackOverflowError for long expressions (see #14217)
+        return parseExpressionStep2(list);
     }
 
-    /**
-     * Parse expression, showing the specified error message if parsing fails.
-     *
-     * @param errorMessage to display if parsing error occurs
-     * @return match determined by parsing expression
-     * @throws org.openstreetmap.josm.actions.search.SearchCompiler.ParseError if search expression cannot be parsed
-     * @see #parseExpression()
-     */
-    private Match parseExpression(String errorMessage) throws ParseError {
-        Match expression = parseExpression();
-        if (expression == null)
-            throw new ParseError(errorMessage);
-        else
-            return expression;
+    private List<Object> parseExpressionStep1() throws ParseError {
+        Match factor;
+        String token = null;
+        String errorMessage = null;
+        List<Object> list = new ArrayList<>();
+        do {
+            factor = parseFactor();
+            if (factor != null) {
+                if (token != null) {
+                    list.add(token);
+                }
+                list.add(factor);
+                if (tokenizer.readIfEqual(Token.OR)) {
+                    token = "OR";
+                    errorMessage = tr("Missing parameter for OR");
+                } else if (tokenizer.readIfEqual(Token.XOR)) {
+                    token = "XOR";
+                    errorMessage = tr("Missing parameter for XOR");
+                } else {
+                    token = "AND";
+                    errorMessage = null;
+                }
+            } else if (errorMessage != null) {
+                throw new ParseError(errorMessage);
+            }
+        } while (factor != null);
+        return list;
+    }
+
+    private Match parseExpressionStep2(List<Object> list) {
+        Match result = null;
+        for (int i = list.size() - 1; i >= 0; i--) {
+            Object o = list.get(i);
+            if (o instanceof Match && result == null) {
+                result = (Match) o;
+            } else if (o instanceof String && i > 0) {
+                Match factor = (Match) list.get(i-1);
+                switch ((String) o) {
+                case "OR":
+                    result = new Or(factor, result);
+                    break;
+                case "XOR":
+                    result = new Xor(factor, result);
+                    break;
+                case "AND":
+                    result = new And(factor, result);
+                    break;
+                default: throw new IllegalStateException(tr("Unexpected token: {0}", o));
+                }
+                i--;
+            } else {
+                throw new IllegalStateException("i=" + i + "; o=" + o);
+            }
+        }
+        return result;
     }
 
     /**
      * Parse next factor (a search operator or search term).
      *
      * @return match determined by parsing factor string
-     * @throws org.openstreetmap.josm.actions.search.SearchCompiler.ParseError if search expression cannot be parsed
+     * @throws ParseError if search expression cannot be parsed
      */
     private Match parseFactor() throws ParseError {
         if (tokenizer.readIfEqual(Token.LEFT_PARENT)) {
diff --git a/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java b/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java
index 26e5a4c..2892893 100644
--- a/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java
@@ -85,7 +85,6 @@ public class CoordinateConflictResolveCommand extends ConflictResolveCommand {
         if (obj == null || getClass() != obj.getClass()) return false;
         if (!super.equals(obj)) return false;
         CoordinateConflictResolveCommand that = (CoordinateConflictResolveCommand) obj;
-        return Objects.equals(conflict, that.conflict) &&
-                decision == that.decision;
+        return decision == that.decision && Objects.equals(conflict, that.conflict);
     }
 }
diff --git a/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java b/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java
index 0eac1e1..44cef38 100644
--- a/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java
@@ -100,7 +100,6 @@ public class DeletedStateConflictResolveCommand extends ConflictResolveCommand {
         if (obj == null || getClass() != obj.getClass()) return false;
         if (!super.equals(obj)) return false;
         DeletedStateConflictResolveCommand that = (DeletedStateConflictResolveCommand) obj;
-        return Objects.equals(conflict, that.conflict) &&
-                decision == that.decision;
+        return decision == that.decision && Objects.equals(conflict, that.conflict);
     }
 }
diff --git a/src/org/openstreetmap/josm/data/Preferences.java b/src/org/openstreetmap/josm/data/Preferences.java
index 2bc37ef..9fa9ad4 100644
--- a/src/org/openstreetmap/josm/data/Preferences.java
+++ b/src/org/openstreetmap/josm/data/Preferences.java
@@ -29,8 +29,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.MissingResourceException;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.SortedMap;
@@ -67,6 +67,7 @@ import org.openstreetmap.josm.data.preferences.PreferencesReader;
 import org.openstreetmap.josm.data.preferences.PreferencesWriter;
 import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.data.preferences.StringSetting;
+import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorTagCheckerRulesPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorTagCheckerRulesPreference.RulePrefHelper;
 import org.openstreetmap.josm.io.OfflineAccessException;
@@ -442,7 +443,7 @@ public class Preferences {
         addPossibleResourceDir(locations, System.getProperty("josm.resources"));
         if (Main.isPlatformWindows()) {
             String appdata = System.getenv("APPDATA");
-            if (System.getenv("ALLUSERSPROFILE") != null && appdata != null
+            if (appdata != null && System.getenv("ALLUSERSPROFILE") != null
                     && appdata.lastIndexOf(File.separator) != -1) {
                 appdata = appdata.substring(appdata.lastIndexOf(File.separator));
                 locations.add(new File(new File(System.getenv("ALLUSERSPROFILE"),
@@ -611,7 +612,7 @@ public class Preferences {
         File backupFile = new File(prefFile + "_backup");
 
         // Backup old preferences if there are old preferences
-        if (prefFile.exists() && prefFile.length() > 0 && initSuccessful) {
+        if (initSuccessful && prefFile.exists() && prefFile.length() > 0) {
             Utils.copyFile(prefFile, backupFile);
         }
 
@@ -1423,12 +1424,13 @@ public class Preferences {
         Utils.updateSystemProperty("user.language", get("language"));
         // Workaround to fix a Java bug. This ugly hack comes from Sun bug database: https://bugs.openjdk.java.net/browse/JDK-6292739
         // Force AWT toolkit to update its internal preferences (fix #6345).
+        // Does not work anymore with Java 9, to remove with Java 9 migration
         if (!GraphicsEnvironment.isHeadless()) {
             try {
                 Field field = Toolkit.class.getDeclaredField("resources");
                 Utils.setObjectsAccessible(field);
                 field.set(null, ResourceBundle.getBundle("sun.awt.resources.awt"));
-            } catch (ReflectiveOperationException | MissingResourceException e) {
+            } catch (ReflectiveOperationException | RuntimeException e) {
                 Main.warn(e);
             }
         }
@@ -1581,9 +1583,12 @@ public class Preferences {
         Setting<?> setting = settingsMap.get(key);
         if (setting instanceof MapListSetting) {
             List<Map<String, String>> l = new ArrayList<>(((MapListSetting) setting).getValue());
-            if (l.stream().noneMatch(x -> x.values().contains(url))) {
+            if (l.stream().noneMatch(x -> x.containsValue(url))) {
                 RulePrefHelper helper = ValidatorTagCheckerRulesPreference.RulePrefHelper.INSTANCE;
-                l.add(helper.serialize(helper.getDefault().stream().filter(x -> url.equals(x.url)).findFirst().get()));
+                Optional<ExtendedSourceEntry> val = helper.getDefault().stream().filter(x -> url.equals(x.url)).findFirst();
+                if (val.isPresent()) {
+                    l.add(helper.serialize(val.get()));
+                }
                 putListOfStructs(key, l);
             }
         }
diff --git a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
index 6e60757..cd215f8 100644
--- a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
+++ b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
@@ -224,7 +224,7 @@ public class SystemOfMeasurement {
      */
     public String getDistText(final double dist, final NumberFormat format, final double threshold) {
         double a = dist / aValue;
-        if (!Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false) && a > bValue / aValue)
+        if (a > bValue / aValue && !Main.pref.getBoolean("system_of_measurement.use_only_lower_unit", false))
             return formatText(dist / bValue, bName, format);
         else if (a < threshold)
             return "< " + formatText(threshold, aName, format);
diff --git a/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java b/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
index 3c25ec9..de0b1bc 100644
--- a/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
+++ b/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
@@ -8,6 +8,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.Semaphore;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
 import org.openstreetmap.josm.Main;
@@ -32,6 +33,12 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
     private final Map<String, Semaphore> hostSemaphores = new ConcurrentHashMap<>();
     private final int hostLimit;
 
+    private ThreadPoolExecutor executor;
+
+    private int corePoolSize;
+
+    private int maximumPoolSize;
+
     /**
      * Creates an unbounded queue
      * @param hostLimit how many parallel calls to host to allow
@@ -76,7 +83,14 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
         }
         job = pollFirst(timeout, unit);
         if (job != null) {
-            acquireSemaphore(job);
+            try {
+                boolean gotLock = tryAcquireSemaphore(job, timeout, unit);
+                return gotLock ? job : null;
+            } catch (InterruptedException e) {
+                // acquire my got interrupted, first offer back what was taken
+                offer(job);
+                throw e;
+            }
         }
         return job;
     }
@@ -88,10 +102,47 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
             return job;
         }
         job = takeFirst();
-        acquireSemaphore(job);
+        try {
+            acquireSemaphore(job);
+        } catch (InterruptedException e) {
+            // acquire my got interrupted, first offer back what was taken
+            offer(job);
+            throw e;
+        }
         return job;
     }
 
+    /**
+     * Set the executor for which this queue works. It's needed to spawn new threads.
+     * See: http://stackoverflow.com/questions/9622599/java-threadpoolexecutor-strategy-direct-handoff-with-queue#
+     *
+     * @param executor executor for which this queue works
+     */
+    public void setExecutor(ThreadPoolExecutor executor) {
+        this.executor = executor;
+        this.maximumPoolSize = executor.getMaximumPoolSize();
+        this.corePoolSize = executor.getCorePoolSize();
+    }
+
+    @Override
+    public boolean offer(Runnable e) {
+        if (!super.offer(e)) {
+            return false;
+        }
+
+        if (executor != null) {
+            // See: http://stackoverflow.com/questions/9622599/java-threadpoolexecutor-strategy-direct-handoff-with-queue#
+            // force spawn of a thread if not reached maximum
+            int currentPoolSize = executor.getPoolSize();
+            if (currentPoolSize < maximumPoolSize
+                    && currentPoolSize >= corePoolSize) {
+                executor.setCorePoolSize(currentPoolSize + 1);
+                executor.setCorePoolSize(corePoolSize);
+            }
+        }
+        return true;
+    }
+
     private Semaphore getSemaphore(JCSCachedTileLoaderJob<?, ?> job) {
         String host;
         try {
@@ -133,6 +184,21 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
         return ret;
     }
 
+    private boolean tryAcquireSemaphore(Runnable job, long timeout, TimeUnit unit) throws InterruptedException {
+        boolean ret = true;
+        if (job instanceof JCSCachedTileLoaderJob) {
+            final JCSCachedTileLoaderJob<?, ?> jcsJob = (JCSCachedTileLoaderJob<?, ?>) job;
+            Semaphore limit = getSemaphore(jcsJob);
+            if (limit != null) {
+                ret = limit.tryAcquire(timeout, unit);
+                if (ret) {
+                    jcsJob.setFinishedTask(() -> releaseSemaphore(jcsJob));
+                }
+            }
+        }
+        return ret;
+    }
+
     private void releaseSemaphore(JCSCachedTileLoaderJob<?, ?> job) {
         Semaphore limit = getSemaphore(job);
         if (limit != null) {
diff --git a/src/org/openstreetmap/josm/data/coor/CoordinateFormat.java b/src/org/openstreetmap/josm/data/coor/CoordinateFormat.java
index 3a727ea..3f12879 100644
--- a/src/org/openstreetmap/josm/data/coor/CoordinateFormat.java
+++ b/src/org/openstreetmap/josm/data/coor/CoordinateFormat.java
@@ -5,7 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 /**
  * An enumeration  of coordinate formats
- *
+ * @since 1990
  */
 public enum CoordinateFormat {
 
@@ -29,7 +29,8 @@ public enum CoordinateFormat {
      */
     EAST_NORTH(tr("Projected Coordinates"));
 
-    private String displayName;
+    private final String displayName;
+
     CoordinateFormat(String displayName) {
         this.displayName = displayName;
     }
diff --git a/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java b/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
index 593d6c6..3c5a335 100644
--- a/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.data.imagery;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -13,6 +14,7 @@ import org.openstreetmap.gui.jmapviewer.tilesources.TileSourceInfo;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.CacheCustomContent;
+import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.xml.sax.InputSource;
 
@@ -57,6 +59,16 @@ public class CachedAttributionBingAerialTileSource extends BingAerialTileSource
             Main.info("Successfully loaded Bing attribution data.");
             return r.getBytes("UTF-8");
         }
+
+        @Override
+        protected void checkOfflineAccess() {
+            try {
+                String attributionUrl = getAttributionUrl().toExternalForm();
+                OnlineResource.ALL.checkOfflineAccess(attributionUrl, attributionUrl);
+            } catch (MalformedURLException e) {
+                Main.error(e);
+            }
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java b/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java
index f8e1e8e..6569598 100644
--- a/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java
+++ b/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java
@@ -1,7 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.imagery;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -74,10 +73,9 @@ public final class GetCapabilitiesParseHelper {
     /**
      * @param in InputStream with pointing to GetCapabilities XML stream
      * @return safe XMLStreamReader, that is not validating external entities, nor loads DTD's
-     * @throws IOException if any I/O error occurs
      * @throws XMLStreamException if any XML stream error occurs
      */
-    public static XMLStreamReader getReader(InputStream in) throws IOException, XMLStreamException {
+    public static XMLStreamReader getReader(InputStream in) throws XMLStreamException {
         XMLInputFactory factory = XMLInputFactory.newFactory();
         // do not try to load external entities, nor validate the XML
         factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
diff --git a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
index c0c2493..a97eaad 100644
--- a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
+++ b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoader.java
@@ -1,7 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.imagery;
 
-import java.io.IOException;
 import java.util.Map;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -59,10 +58,9 @@ public class TMSCachedTileLoader implements TileLoader, CachedTileLoader {
      * @param connectTimeout    to remote resource
      * @param readTimeout       to remote resource
      * @param headers           HTTP headers to be sent along with request
-     * @throws IOException      when cache initialization fails
      */
     public TMSCachedTileLoader(TileLoaderListener listener, ICacheAccess<String, BufferedImageCacheEntry> cache,
-            int connectTimeout, int readTimeout, Map<String, String> headers) throws IOException {
+            int connectTimeout, int readTimeout, Map<String, String> headers) {
         CheckParameterUtil.ensureParameterNotNull(cache, "cache");
         this.cache = cache;
         this.connectTimeout = connectTimeout;
@@ -77,14 +75,17 @@ public class TMSCachedTileLoader implements TileLoader, CachedTileLoader {
      * @return new ThreadPoolExecutor that will use a @see HostLimitQueue based queue
      */
     public static ThreadPoolExecutor getNewThreadPoolExecutor(String nameFormat, int workers) {
-        return new ThreadPoolExecutor(
-                workers, // keep the thread number constant
+        HostLimitQueue workQueue = new HostLimitQueue(HOST_LIMIT.get().intValue());
+        ThreadPoolExecutor executor = new ThreadPoolExecutor(
+                0, // 0 so for unused thread pools threads will eventually die, freeing also the threadpool
                 workers, // do not this number of threads
-                30, // keepalive for thread
+                300, // keepalive for thread
                 TimeUnit.SECONDS,
-                new HostLimitQueue(HOST_LIMIT.get().intValue()),
+                workQueue,
                 Utils.newThreadFactory(nameFormat, Thread.NORM_PRIORITY)
                 );
+        workQueue.setExecutor(executor);
+        return executor;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
index 2027f99..3ebd394 100644
--- a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
+++ b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
@@ -182,7 +182,7 @@ public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, Buffe
                 case SUCCESS:
                     handleNoTileAtZoom();
                     int httpStatusCode = attributes.getResponseCode();
-                    if (!isNoTileAtZoom() && httpStatusCode >= 400) {
+                    if (httpStatusCode >= 400 && !isNoTileAtZoom()) {
                         if (attributes.getErrorMessage() == null) {
                             tile.setError(tr("HTTP error {0} when loading tiles", httpStatusCode));
                         } else {
diff --git a/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java b/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java
index 419e760..91ecb3e 100644
--- a/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java
+++ b/src/org/openstreetmap/josm/data/imagery/WMSCachedTileLoader.java
@@ -1,7 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.imagery;
 
-import java.io.IOException;
 import java.util.Map;
 
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
@@ -9,6 +8,7 @@ import org.openstreetmap.gui.jmapviewer.Tile;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileJob;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
 
 /**
  * Tileloader for WMS based imagery. It is separate to use different ThreadPoolExecutor, as we want
@@ -20,6 +20,11 @@ import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
 public class WMSCachedTileLoader extends TMSCachedTileLoader {
 
     /**
+     * overrides the THREAD_LIMIT in superclass, as we want to have separate limit and pool for WMS
+     */
+    public static final IntegerProperty THREAD_LIMIT = new IntegerProperty("imagery.wms.loader.maxjobs", 3);
+
+    /**
      * Creates a TileLoader with separate WMS downloader.
      *
      * @param listener that will be notified when tile is loaded
@@ -27,10 +32,9 @@ public class WMSCachedTileLoader extends TMSCachedTileLoader {
      * @param connectTimeout to tile source
      * @param readTimeout from tile source
      * @param headers to be sent with requests
-     * @throws IOException when there is a problem creating cache repository
      */
     public WMSCachedTileLoader(TileLoaderListener listener, ICacheAccess<String, BufferedImageCacheEntry> cache,
-            int connectTimeout, int readTimeout, Map<String, String> headers) throws IOException {
+            int connectTimeout, int readTimeout, Map<String, String> headers) {
 
         super(listener, cache, connectTimeout, readTimeout, headers);
         setDownloadExecutor(TMSCachedTileLoader.getNewThreadPoolExecutor("WMS-downloader-%d", THREAD_LIMIT.get()));
diff --git a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
index d1670d0..bf86ebf 100644
--- a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
@@ -212,11 +212,6 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
                                 throw new IllegalArgumentException();
                             }
                         }
-
-                        @Override
-                        public boolean isCellEditable(int row, int column) {
-                            return false;
-                        }
                     });
             this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
             this.list.setRowSelectionAllowed(true);
@@ -728,21 +723,11 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
     }
 
     @Override
-    public int getTileXMin(int zoom) {
-        return 0;
-    }
-
-    @Override
     public int getTileYMax(int zoom) {
         return getTileYMax(zoom, Main.getProjection());
     }
 
     @Override
-    public int getTileYMin(int zoom) {
-        return 0;
-    }
-
-    @Override
     public Point latLonToXY(double lat, double lon, int zoom) {
         TileMatrix matrix = getTileMatrix(zoom);
         if (matrix == null) {
diff --git a/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java b/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
index d26f39e..9a34aa6 100644
--- a/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
+++ b/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
@@ -107,7 +107,7 @@ public final class SignpostAdapters {
         }
 
         @Override
-        public InputStream getMessagePayload() throws IOException {
+        public InputStream getMessagePayload() {
             return null;
         }
 
@@ -135,12 +135,12 @@ public final class SignpostAdapters {
         }
 
         @Override
-        public int getStatusCode() throws IOException {
+        public int getStatusCode() {
             return response.getResponseCode();
         }
 
         @Override
-        public String getReasonPhrase() throws Exception {
+        public String getReasonPhrase() {
             return response.getResponseMessage();
         }
 
diff --git a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
index 5f5e28e..c2083ab 100644
--- a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
@@ -295,7 +295,7 @@ public abstract class AbstractPrimitive implements IPrimitive {
             return;
         if (changesetId < 0)
             throw new IllegalArgumentException(MessageFormat.format("Parameter ''{0}'' >= 0 expected, got {1}", "changesetId", changesetId));
-        if (isNew() && changesetId > 0)
+        if (changesetId > 0 && isNew())
             throw new IllegalStateException(tr("Cannot assign a changesetId > 0 to a new primitive. Value of changesetId is {0}", changesetId));
 
         this.changesetId = changesetId;
@@ -379,7 +379,7 @@ public abstract class AbstractPrimitive implements IPrimitive {
 
     @Override
     public void setVisible(boolean visible) {
-        if (isNew() && !visible)
+        if (!visible && isNew())
             throw new IllegalStateException(tr("A primitive with ID = 0 cannot be invisible."));
         updateFlags(FLAG_VISIBLE, visible);
     }
@@ -537,7 +537,7 @@ public abstract class AbstractPrimitive implements IPrimitive {
     @Override
     public void put(String key, String value) {
         Map<String, String> originalKeys = getKeys();
-        if (key == null || Utils.strip(key).isEmpty())
+        if (key == null || Utils.isStripEmpty(key))
             return;
         else if (value == null) {
             remove(key);
diff --git a/src/org/openstreetmap/josm/data/osm/BBox.java b/src/org/openstreetmap/josm/data/osm/BBox.java
index 39a10f2..54e24d5 100644
--- a/src/org/openstreetmap/josm/data/osm/BBox.java
+++ b/src/org/openstreetmap/josm/data/osm/BBox.java
@@ -312,7 +312,7 @@ public class BBox {
      * @since 11269
      */
     public boolean isInWorld() {
-        return isValid() && xmin >= -180.0 && xmax <= 180.0 && ymin >= -90.0 && ymax <= 90.0;
+        return xmin >= -180.0 && xmax <= 180.0 && ymin >= -90.0 && ymax <= 90.0 && isValid();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
index f5caec5..e92e858 100644
--- a/src/org/openstreetmap/josm/data/osm/DataSet.java
+++ b/src/org/openstreetmap/josm/data/osm/DataSet.java
@@ -977,7 +977,7 @@ public final class DataSet implements Data, ProjectionChangeListener {
         Set<Way> result = new HashSet<>();
         beginUpdate();
         try {
-            for (Way way: ways) {
+            for (Way way : OsmPrimitive.getFilteredList(node.getReferrers(), Way.class)) {
                 List<Node> wayNodes = way.getNodes();
                 if (wayNodes.remove(node)) {
                     if (wayNodes.size() < 2) {
diff --git a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
index 2630ff1..7c642fc 100644
--- a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
@@ -61,7 +61,15 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
     static {
         String reversedDirectionDefault = "oneway=\"-1\"";
 
-        String directionDefault = "oneway? | (aerialway=* -aerialway=station) | "+
+        String directionDefault = "oneway? | "+
+                "(aerialway=chair_lift & -oneway=no) | "+
+                "(aerialway=rope_tow & -oneway=no) | "+
+                "(aerialway=magic_carpet & -oneway=no) | "+
+                "(aerialway=zip_line & -oneway=no) | "+
+                "(aerialway=drag_lift & -oneway=no) | "+
+                "(aerialway=t-bar & -oneway=no) | "+
+                "(aerialway=j-bar & -oneway=no) | "+
+                "(aerialway=platter & -oneway=no) | "+
                 "waterway=stream | waterway=river | waterway=ditch | waterway=drain | "+
                 "(\"piste:type\"=downhill & -area=yes) | (\"piste:type\"=sled & -area=yes) | (man_made=\"piste:halfpipe\" & -area=yes) | "+
                 "junction=roundabout | (highway=motorway & -oneway=no & -oneway=reversible) | "+
@@ -1169,15 +1177,14 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
      * @return true if this primitive and other are equal with respect to their technical attributes
      */
     public boolean hasEqualTechnicalAttributes(OsmPrimitive other) {
-        if (other == null) return false;
-
-        return isDeleted() == other.isDeleted()
-                && isModified() == other.isModified()
-                && timestamp == other.timestamp
-                && version == other.version
-                && isVisible() == other.isVisible()
-                && Objects.equals(user, other.user)
-                && changesetId == other.changesetId;
+        return other != null
+            && timestamp == other.timestamp
+            && version == other.version
+            && changesetId == other.changesetId
+            && isDeleted() == other.isDeleted()
+            && isModified() == other.isModified()
+            && isVisible() == other.isVisible()
+            && Objects.equals(user, other.user);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/osm/QuadBuckets.java b/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
index 0c6a594..99ad642 100644
--- a/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
+++ b/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
@@ -273,7 +273,7 @@ public class QuadBuckets<T extends OsmPrimitive> implements Collection<T> {
                 }
             }
             doAddContent(o);
-            if (isLeaf() && content.size() > MAX_OBJECTS_PER_NODE && level < QuadTiling.NR_LEVELS) {
+            if (level < QuadTiling.NR_LEVELS && isLeaf() && content.size() > MAX_OBJECTS_PER_NODE) {
                 doSplit();
             }
         }
diff --git a/src/org/openstreetmap/josm/data/osm/RelationMemberData.java b/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
index 9f18cc5..ff312b1 100644
--- a/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
+++ b/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
@@ -106,7 +106,7 @@ public class RelationMemberData implements PrimitiveId, Serializable {
         if (obj == null || getClass() != obj.getClass()) return false;
         RelationMemberData that = (RelationMemberData) obj;
         return memberId == that.memberId &&
-                Objects.equals(role, that.role) &&
-                memberType == that.memberType;
+               memberType == that.memberType &&
+               Objects.equals(role, that.role);
     }
 }
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java b/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
index 65943dd..1754d0c 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
@@ -54,7 +54,7 @@ public class MergeSourceBuildingVisitor extends AbstractVisitor {
     }
 
     protected boolean isAlreadyRemembered(OsmPrimitive primitive) {
-        return mappedPrimitives.keySet().contains(primitive);
+        return mappedPrimitives.containsKey(primitive);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
index d8cbb26..135c6e2 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
@@ -1088,7 +1088,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
                     }
                 } else if (m.isNode()) {
                     Node n = m.getNode();
-                    if ("via".equals(m.getRole()) && via == null) {
+                    if (via == null && "via".equals(m.getRole())) {
                         via = n;
                     }
                 }
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
index 6835a30..68ea2b8 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
@@ -296,7 +296,7 @@ public class WireframeMapRenderer extends AbstractMapRenderer implements Visitor
         boolean showThisDirectionArrow = ds.isSelected(w) || showDirectionArrow;
         /* head only takes over control if the option is true,
            the direction should be shown at all and not only because it's selected */
-        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && !ds.isSelected(w) && showHeadArrowOnly;
+        boolean showOnlyHeadArrowOnly = showThisDirectionArrow && showHeadArrowOnly && !ds.isSelected(w);
         Color wayColor;
 
         if (isInactiveMode || w.isDisabled()) {
diff --git a/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java b/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java
index 9da9719..12421cf 100644
--- a/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java
+++ b/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java
@@ -86,7 +86,6 @@ public abstract class AbstractProperty<T> {
      */
     public static class ValueChangeEvent<T> {
         private final PreferenceChangeEvent base;
-
         private final AbstractProperty<T> source;
 
         ValueChangeEvent(PreferenceChangeEvent base, AbstractProperty<T> source) {
@@ -95,6 +94,15 @@ public abstract class AbstractProperty<T> {
         }
 
         /**
+         * Get the base event.
+         * @return the base event
+         * @since 11496
+         */
+        public final PreferenceChangeEvent getBaseEvent() {
+            return base;
+        }
+
+        /**
          * Get the property that was changed
          * @return The property.
          */
diff --git a/src/org/openstreetmap/josm/data/preferences/MapListSetting.java b/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
index 9b1a6bf..e3a1972 100644
--- a/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
+++ b/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
@@ -40,9 +40,9 @@ public class MapListSetting extends AbstractSetting<List<Map<String, String>>> {
         if (value.contains(null))
             throw new IllegalArgumentException("Error: Null as list element in preference setting");
         for (Map<String, String> map : value) {
-            if (map.keySet().contains(null))
+            if (map.containsKey(null))
                 throw new IllegalArgumentException("Error: Null as map key in preference setting");
-            if (map.values().contains(null))
+            if (map.containsValue(null))
                 throw new IllegalArgumentException("Error: Null as map value in preference setting");
         }
     }
diff --git a/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java b/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
index 4000b92..743e530 100644
--- a/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
+++ b/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
@@ -51,10 +51,8 @@ public class PreferencesReader {
      * @param file the file
      * @param defaults true when reading from the cache file for default preferences,
      * false for the regular preferences config file
-     * @throws IOException if any I/O error occurs
-     * @throws XMLStreamException if any XML stream error occurs
      */
-    public PreferencesReader(File file, boolean defaults) throws IOException, XMLStreamException {
+    public PreferencesReader(File file, boolean defaults) {
         this.defaults = defaults;
         this.reader = null;
         this.file = file;
@@ -65,9 +63,8 @@ public class PreferencesReader {
      * @param reader the {@link Reader}
      * @param defaults true when reading from the cache file for default preferences,
      * false for the regular preferences config file
-     * @throws XMLStreamException if any XML stream error occurs
      */
-    public PreferencesReader(Reader reader, boolean defaults) throws XMLStreamException {
+    public PreferencesReader(Reader reader, boolean defaults) {
         this.defaults = defaults;
         this.reader = reader;
         this.file = null;
diff --git a/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java b/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
index 36fff38..5667b63 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
@@ -462,7 +462,7 @@ public class UrlValidator extends AbstractValidator {
         }
 
         int slash2Count = countToken("//", path);
-        if (isOff(ALLOW_2_SLASHES) && (slash2Count > 0)) {
+        if (slash2Count > 0 && isOff(ALLOW_2_SLASHES)) {
             return false;
         }
 
diff --git a/src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java b/src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java
index 7bd1eee..9e7384c 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/DuplicateRelation.java
@@ -64,8 +64,8 @@ public class DuplicateRelation extends Test {
             if (obj == null || getClass() != obj.getClass()) return false;
             RelMember relMember = (RelMember) obj;
             return relId == relMember.relId &&
-                    Objects.equals(role, relMember.role) &&
                     type == relMember.type &&
+                    Objects.equals(role, relMember.role) &&
                     Objects.equals(tags, relMember.tags) &&
                     Objects.equals(coor, relMember.coor);
         }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
index 9c73f94..25037ba 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
@@ -318,20 +318,20 @@ public class MapCSSTagChecker extends Test.TagTest {
                             CheckParameterUtil.ensureThat(!(ai.val instanceof String) || !(val != null && val.contains("=")),
                                     "Unexpected '='. Please only specify the key to remove!");
                             check.fixCommands.add(FixCommand.fixRemove(ai.val));
-                        } else if ("fixChangeKey".equals(ai.key) && val != null) {
+                        } else if (val != null && "fixChangeKey".equals(ai.key)) {
                             CheckParameterUtil.ensureThat(val.contains("=>"), "Separate old from new key by '=>'!");
                             final String[] x = val.split("=>", 2);
                             check.fixCommands.add(FixCommand.fixChangeKey(Tag.removeWhiteSpaces(x[0]), Tag.removeWhiteSpaces(x[1])));
-                        } else if ("fixDeleteObject".equals(ai.key) && val != null) {
+                        } else if (val != null && "fixDeleteObject".equals(ai.key)) {
                             CheckParameterUtil.ensureThat("this".equals(val), "fixDeleteObject must be followed by 'this'");
                             check.deletion = true;
-                        } else if ("suggestAlternative".equals(ai.key) && val != null) {
+                        } else if (val != null && "suggestAlternative".equals(ai.key)) {
                             check.alternatives.add(val);
-                        } else if ("assertMatch".equals(ai.key) && val != null) {
+                        } else if (val != null && "assertMatch".equals(ai.key)) {
                             check.assertions.put(val, Boolean.TRUE);
-                        } else if ("assertNoMatch".equals(ai.key) && val != null) {
+                        } else if (val != null && "assertNoMatch".equals(ai.key)) {
                             check.assertions.put(val, Boolean.FALSE);
-                        } else if ("group".equals(ai.key) && val != null) {
+                        } else if (val != null && "group".equals(ai.key)) {
                             check.group = val;
                         } else {
                             throw new IllegalDataException("Cannot add instruction " + ai.key + ": " + ai.val + '!');
diff --git a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
index 6d2aa6a..4f0881e 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
@@ -9,7 +9,6 @@ import java.util.Collection;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -58,33 +57,15 @@ public class PowerLines extends Test {
     public void visit(Way w) {
         if (w.isUsable()) {
             if (isPowerLine(w) && !w.hasTag("location", "underground")) {
-                String fixValue = null;
-                TestError.Builder error = null;
-                Node errorNode = null;
-                boolean canFix = false;
                 for (Node n : w.getNodes()) {
-                    if (!isPowerTower(n)) {
-                        if (!isPowerAllowed(n) && IN_DOWNLOADED_AREA.test(n) && (!w.isFirstLastNode(n) || !isPowerStation(n))) {
-                            error = TestError.builder(this, Severity.WARNING, POWER_LINES)
-                                    .message(tr("Missing power tower/pole within power line"))
-                                    .primitives(n);
-                            errorNode = n;
-                        }
-                    } else if (fixValue == null) {
-                        // First tower/pole tag found, remember it
-                        fixValue = n.get("power");
-                        canFix = true;
-                    } else if (!fixValue.equals(n.get("power"))) {
-                        // The power line contains both "tower" and "pole" -> cannot fix this error
-                        canFix = false;
+                    if (!isPowerTower(n) && !isPowerAllowed(n) && IN_DOWNLOADED_AREA.test(n)
+                        && (!w.isFirstLastNode(n) || !isPowerStation(n))) {
+                        potentialErrors.add(TestError.builder(this, Severity.WARNING, POWER_LINES)
+                                .message(tr("Missing power tower/pole within power line"))
+                                .primitives(n)
+                                .build());
                     }
                 }
-                if (error != null && canFix) {
-                    final ChangePropertyCommand fix = new ChangePropertyCommand(errorNode, "power", fixValue);
-                    potentialErrors.add(error.fix(() -> fix).build());
-                } else if (error != null) {
-                    potentialErrors.add(error.build());
-                }
             } else if (w.isClosed() && isPowerStation(w)) {
                 powerStations.add(w);
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
index efb32ac..42134e0 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
@@ -28,7 +28,6 @@ import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles.Role;
-import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -75,7 +74,7 @@ public class RelationChecker extends Test {
         initializePresets();
     }
 
-    private static Collection<TaggingPreset> relationpresets = new LinkedList<>();
+    private static final Collection<TaggingPreset> relationpresets = new LinkedList<>();
 
     /**
      * Reads the presets data.
@@ -237,7 +236,7 @@ public class RelationChecker extends Test {
                             // but stash the error in case no better reason will be found later
                             possibleMatchError = TestError.builder(this, Severity.WARNING, WRONG_TYPE)
                                     .message(ROLE_VERIF_PROBLEM_MSG,
-                                            marktr("Role member does not match expression {0} in template {1}"),
+                                            marktr("Role of relation member does not match expression ''{0}'' in template {1}"),
                                             r.memberExpression, rolePreset.name)
                                     .primitives(member.getMember().isUsable() ? member.getMember() : n)
                                     .build();
@@ -271,8 +270,8 @@ public class RelationChecker extends Test {
 
             errors.add(TestError.builder(this, Severity.WARNING, WRONG_TYPE)
                     .message(ROLE_VERIF_PROBLEM_MSG,
-                            marktr("Role member type {0} does not match accepted list of {1} in template {2}"),
-                            member.getType(), typesStr, rolePreset.name)
+                            marktr("Type ''{0}'' of relation member with role ''{1}'' does not match accepted types ''{2}'' in template {3}"),
+                            member.getType(), member.getRole(), typesStr, rolePreset.name)
                     .primitives(member.getMember().isUsable() ? member.getMember() : n)
                     .build());
         }
@@ -307,17 +306,17 @@ public class RelationChecker extends Test {
         // verify unwanted members
         for (String key : map.keySet()) {
             if (!allroles.containsKey(key)) {
-                String templates = allroles.keySet().stream().map(I18n::tr).collect(Collectors.joining("/"));
+                String templates = allroles.keySet().stream().collect(Collectors.joining("/"));
 
                 if (!key.isEmpty()) {
 
                     errors.add(TestError.builder(this, Severity.WARNING, ROLE_UNKNOWN)
-                            .message(ROLE_VERIF_PROBLEM_MSG, marktr("Role {0} unknown in templates {1}"), key, templates)
+                            .message(ROLE_VERIF_PROBLEM_MSG, marktr("Role ''{0}'' unknown in templates ''{1}''"), key, templates)
                             .primitives(n)
                             .build());
                 } else {
                     errors.add(TestError.builder(this, Severity.WARNING, ROLE_EMPTY)
-                            .message(ROLE_VERIF_PROBLEM_MSG, marktr("Empty role type found when expecting one of {0}"), templates)
+                            .message(ROLE_VERIF_PROBLEM_MSG, marktr("Empty role type found when expecting one of ''{0}''"), templates)
                             .primitives(n)
                             .build());
                 }
@@ -331,17 +330,17 @@ public class RelationChecker extends Test {
         if (count != vc) {
             if (count == 0) {
                 errors.add(TestError.builder(this, Severity.WARNING, ROLE_MISSING)
-                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Role {0} missing"), keyname)
+                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Role ''{0}'' missing"), keyname)
                         .primitives(n)
                         .build());
             } else if (vc > count) {
                 errors.add(TestError.builder(this, Severity.WARNING, LOW_COUNT)
-                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Number of {0} roles too low ({1})"), keyname, count)
+                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Number of ''{0}'' roles too low ({1})"), keyname, count)
                         .primitives(n)
                         .build());
             } else {
                 errors.add(TestError.builder(this, Severity.WARNING, HIGH_COUNT)
-                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Number of {0} roles too high ({1})"), keyname, count)
+                        .message(ROLE_VERIF_PROBLEM_MSG, marktr("Number of ''{0}'' roles too high ({1})"), keyname, count)
                         .primitives(n)
                         .build());
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java b/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java
index ff51edd..12e4846 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWay.java
@@ -30,16 +30,32 @@ public class SelfIntersectingWay extends Test {
 
     @Override
     public void visit(Way w) {
+        int last = w.getNodesCount();
+        if (last < 2)
+            return;
         Set<Node> nodes = new HashSet<>();
-        for (int i = 1; i < w.getNodesCount() - 1; i++) {
+        nodes.add(w.firstNode());
+        int countFirst = 0;
+        int countLast = 0;
+        for (int i = 1; i < last; i++) {
             Node n = w.getNode(i);
             if (nodes.contains(n)) {
-                errors.add(TestError.builder(this, Severity.WARNING, SELF_INTERSECT)
-                        .message(tr("Self-intersecting ways"))
-                        .primitives(w)
-                        .highlight(n)
-                        .build());
-                break;
+                boolean ok = false;
+                if (n == w.firstNode()) {
+                    if (countFirst++ == 0)
+                        ok = true;
+                } else if (i + 1 == last) {
+                    if (countLast++ == 0)
+                        ok = true;
+                }
+                if (!ok || countFirst + countLast > 1) {
+                    errors.add(TestError.builder(this, Severity.WARNING, SELF_INTERSECT)
+                            .message(tr("Self-intersecting ways"))
+                            .primitives(w)
+                            .highlight(n)
+                            .build());
+                    break;
+                }
             } else {
                 nodes.add(n);
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java b/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
index 71e42d9..18d2707 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
@@ -210,7 +210,7 @@ public abstract class UnconnectedWays extends Test {
                 if (en.isConnectedTo(s.w.getNodes(), 3 /* hops */, null)) {
                     continue;
                 }
-                if (endnodesHighway.contains(en) && !s.highway && !s.w.concernsArea()) {
+                if (!s.highway && endnodesHighway.contains(en) && !s.w.concernsArea()) {
                     map.put(en, s.w);
                 } else if (endnodes.contains(en) && !s.w.concernsArea()) {
                     map.put(en, s.w);
diff --git a/src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java b/src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java
index d696d1a..fdcda25 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/WayConnectedToArea.java
@@ -62,9 +62,8 @@ public class WayConnectedToArea extends Test {
     }
 
     private void testForError(Way w, Node wayNode, OsmPrimitive p) {
-        if (wayNode.isOutsideDownloadArea()) {
-            return;
-        } else if (wayNode.getReferrers().stream().anyMatch(p1 -> p1.hasTag("route", "ferry"))) {
+        if (wayNode.isOutsideDownloadArea()
+                || wayNode.getReferrers().stream().anyMatch(p1 -> p1.hasTag("route", "ferry"))) {
             return;
         } else if (isArea(p)) {
             addPossibleError(w, wayNode, p, p);
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index e037ada..df50f36 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -11,9 +11,7 @@ import java.io.InputStream;
 import java.net.Authenticator;
 import java.net.Inet6Address;
 import java.net.InetAddress;
-import java.net.InetSocketAddress;
 import java.net.ProxySelector;
-import java.net.Socket;
 import java.net.URL;
 import java.security.AllPermission;
 import java.security.CodeSource;
@@ -35,6 +33,7 @@ import java.util.logging.Level;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import javax.net.ssl.SSLSocketFactory;
 import javax.swing.JOptionPane;
 import javax.swing.RepaintManager;
 import javax.swing.SwingUtilities;
@@ -283,7 +282,7 @@ public class MainApplication extends Main {
             CustomConfigurator.XMLCommandProcessor config = new CustomConfigurator.XMLCommandProcessor(Main.pref);
             for (String i : args.get(Option.LOAD_PREFERENCES)) {
                 info("Reading preferences from " + i);
-                try (InputStream is = HttpClient.create(new URL(i)).connect().getContent()) {
+                try (InputStream is = openStream(new URL(i))) {
                     config.openAndReadXML(is);
                 } catch (IOException ex) {
                     throw BugReport.intercept(ex).put("file", i);
@@ -385,6 +384,14 @@ public class MainApplication extends Main {
         }
     }
 
+    private static InputStream openStream(URL url) throws IOException {
+        if ("file".equals(url.getProtocol())) {
+            return url.openStream();
+        } else {
+            return HttpClient.create(url).connect().getContent();
+        }
+    }
+
     static Collection<PluginInformation> updateAndLoadEarlyPlugins(SplashScreen splash, SplashProgressMonitor monitor) {
         Collection<PluginInformation> pluginsToLoad;
         pluginsToLoad = PluginHandler.buildListOfPluginsToLoad(splash, monitor.createSubTaskMonitor(1, false));
@@ -447,9 +454,7 @@ public class MainApplication extends Main {
                         if (a instanceof Inet6Address) {
                             if (a.isReachable(1000)) {
                                 /* be sure it REALLY works */
-                                Socket s = new Socket();
-                                s.connect(new InetSocketAddress(a, 80), 1000);
-                                s.close();
+                                SSLSocketFactory.getDefault().createSocket(a, 443).close();
                                 Utils.updateSystemProperty("java.net.preferIPv6Addresses", "true");
                                 if (!wasv6) {
                                     Main.info(tr("Detected useable IPv6 network, prefering IPv6 over IPv4 after next restart."));
diff --git a/src/org/openstreetmap/josm/gui/MapViewState.java b/src/org/openstreetmap/josm/gui/MapViewState.java
index 67d06a6..7003750 100644
--- a/src/org/openstreetmap/josm/gui/MapViewState.java
+++ b/src/org/openstreetmap/josm/gui/MapViewState.java
@@ -383,6 +383,22 @@ public final class MapViewState implements Serializable {
     }
 
     /**
+     * Check if this MapViewState equals another one, disregarding the position
+     * of the JOSM window on screen.
+     * @param other the other MapViewState
+     * @return true if the other MapViewState has the same size, scale, position and projection,
+     * false otherwise
+     */
+    public boolean equalsInWindow(MapViewState other) {
+        return other != null &&
+                this.viewWidth == other.viewWidth &&
+                this.viewHeight == other.viewHeight &&
+                this.scale == other.scale &&
+                Objects.equals(this.topLeft, other.topLeft) &&
+                Objects.equals(this.projecting, other.projecting);
+    }
+
+    /**
      * A class representing a point in the map view. It allows to convert between the different coordinate systems.
      * @author Michael Zangl
      */
diff --git a/src/org/openstreetmap/josm/gui/MenuScroller.java b/src/org/openstreetmap/josm/gui/MenuScroller.java
index 4084751..2029fd5 100644
--- a/src/org/openstreetmap/josm/gui/MenuScroller.java
+++ b/src/org/openstreetmap/josm/gui/MenuScroller.java
@@ -47,7 +47,6 @@ public class MenuScroller {
     private MenuScrollItem downItem;
     private final MenuScrollListener menuListener = new MenuScrollListener();
     private final MouseWheelListener mouseWheelListener = new MouseScrollListener();
-    private int interval;
     private int topFixedCount;
     private int firstIndex;
 
@@ -259,9 +258,8 @@ public class MenuScroller {
             throw new IllegalArgumentException("topFixedCount cannot be negative");
         }
 
-        upItem = new MenuScrollItem(MenuIcon.UP, -1);
-        downItem = new MenuScrollItem(MenuIcon.DOWN, +1);
-        setInterval(interval);
+        upItem = new MenuScrollItem(MenuIcon.UP, -1, interval);
+        downItem = new MenuScrollItem(MenuIcon.DOWN, +1, interval);
         setTopFixedCount(topFixedCount);
 
         this.menu = menu;
@@ -270,30 +268,6 @@ public class MenuScroller {
     }
 
     /**
-     * Returns the scroll interval in milliseconds
-     *
-     * @return the scroll interval in milliseconds
-     */
-    public int getInterval() {
-        return interval;
-    }
-
-    /**
-     * Sets the scroll interval in milliseconds
-     *
-     * @param interval the scroll interval in milliseconds
-     * @throws IllegalArgumentException if interval is 0 or negative
-     */
-    public void setInterval(int interval) {
-        if (interval <= 0) {
-            throw new IllegalArgumentException("interval must be greater than 0");
-        }
-        upItem.setInterval(interval);
-        downItem.setInterval(interval);
-        this.interval = interval;
-    }
-
-    /**
      * Returns the number of items fixed at the top of the menu or popup menu.
      *
      * @return the number of items
@@ -444,17 +418,13 @@ public class MenuScroller {
 
         private final MenuScrollTimer timer;
 
-        MenuScrollItem(MenuIcon icon, int increment) {
+        MenuScrollItem(MenuIcon icon, int increment, int interval) {
             setIcon(icon);
             setDisabledIcon(icon);
             timer = new MenuScrollTimer(increment, interval);
             addChangeListener(this);
         }
 
-        public void setInterval(int interval) {
-            timer.setDelay(interval);
-        }
-
         @Override
         public void stateChanged(ChangeEvent e) {
             if (isArmed() && !timer.isRunning()) {
diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
index df3a2f8..5f005bf 100644
--- a/src/org/openstreetmap/josm/gui/NavigatableComponent.java
+++ b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
@@ -324,7 +324,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     /**
      * Changes the projection settings used for this map view.
      * <p>
-     * Made public temporarely, will be made private later.
+     * Made public temporarily, will be made private later.
      */
     public void fixProjection() {
         state = state.usingProjection(Main.getProjection());
@@ -615,7 +615,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
             double dm = ll1.greatCircleDistance(ll2);
             double den = 100 * getScale();
             double scaleMin = 0.01 * den / dm / 100;
-            if (!Double.isInfinite(scaleMin) && newScale < scaleMin) {
+            if (newScale < scaleMin && !Double.isInfinite(scaleMin)) {
                 newScale = scaleMin;
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
index 014e02f..9959c58 100644
--- a/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
+++ b/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
@@ -129,8 +129,8 @@ public class SlippyMapControler extends MouseAdapter {
 
     @Override
     public void mouseDragged(MouseEvent e) {
-        if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == MouseEvent.BUTTON1_DOWN_MASK &&
-                !(Main.isPlatformOsx() && e.getModifiersEx() == MAC_MOUSE_BUTTON3_MASK) && iStartSelectionPoint != null) {
+        if (iStartSelectionPoint != null && (e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) == MouseEvent.BUTTON1_DOWN_MASK
+                && !(Main.isPlatformOsx() && e.getModifiersEx() == MAC_MOUSE_BUTTON3_MASK)) {
             iEndSelectionPoint = e.getPoint();
             iSlippyMapChooser.setSelection(iStartSelectionPoint, iEndSelectionPoint);
             isSelecting = true;
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java b/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
index f57207b..baed7f8 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
@@ -30,7 +30,7 @@ public enum ComparePairType {
 
     /** the localized display name */
     private final String displayName;
-    private ListRole[] participatingRoles;
+    private final ListRole[] participatingRoles;
 
     ComparePairType(String displayName, ListRole ... participatingRoles) {
         this.displayName = displayName;
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
index b8bc626..8afb420 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
@@ -82,10 +82,10 @@ public class RelationMemberConflictDecision {
         if (obj == null || getClass() != obj.getClass()) return false;
         RelationMemberConflictDecision that = (RelationMemberConflictDecision) obj;
         return pos == that.pos &&
-                Objects.equals(relation, that.relation) &&
-                Objects.equals(originalPrimitive, that.originalPrimitive) &&
-                Objects.equals(role, that.role) &&
-                decision == that.decision;
+               decision == that.decision &&
+               Objects.equals(relation, that.relation) &&
+               Objects.equals(originalPrimitive, that.originalPrimitive) &&
+               Objects.equals(role, that.role);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
index d83b326..058881a 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
@@ -243,11 +243,8 @@ public class RelationMemberConflictResolverModel extends DefaultTableModel {
                         roles.add(decision.getRole());
                         indices.add(decision.getPos());
                     }
-                    if (roles.size() != 1) {
-                        // roles to not patch, leave undecided
-                        continue;
-                    } else if (!isCollectionOfConsecutiveNumbers(indices)) {
-                        // not consecutive members in relation, leave undecided
+                    if (roles.size() != 1 || !isCollectionOfConsecutiveNumbers(indices)) {
+                        // roles do not match or not consecutive members in relation, leave undecided
                         continue;
                     }
                     decisions.get(0).decide(RelationMemberConflictDecisionType.KEEP);
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/ClipboardUtils.java b/src/org/openstreetmap/josm/gui/datatransfer/ClipboardUtils.java
index e4e847f..a677e6d 100644
--- a/src/org/openstreetmap/josm/gui/datatransfer/ClipboardUtils.java
+++ b/src/org/openstreetmap/josm/gui/datatransfer/ClipboardUtils.java
@@ -140,10 +140,10 @@ public final class ClipboardUtils {
         return GuiHelper.runInEDTAndWaitAndReturn(() -> {
             try {
                 getClipboard().setContents(transferable, new DoNothingClipboardOwner());
-                return true;
+                return Boolean.TRUE;
             } catch (IllegalStateException ex) {
                 Main.error(ex);
-                return false;
+                return Boolean.FALSE;
             }
         });
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
index 88d0a46..b22a161 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
@@ -245,7 +245,7 @@ public class DialogsPanel extends JPanel implements Destroyable {
             int dp = 0;        // available space from the large dialogs
             for (int i = 0; i < n; ++i) {
                 final ToggleDialog dlg = allDialogs.get(i);
-                if (dlg.isDialogInDefaultView() && dlg != triggeredBy) {
+                if (dlg != triggeredBy && dlg.isDialogInDefaultView()) {
                     final int ha = dlg.getSize().height;                              // current
                     final int h0 = ha * r / sumA;                                     // proportional shrinking
                     final int he = dlg.getPreferredHeight() * s2 / (sumP + hpTrig);  // fair share
@@ -260,7 +260,7 @@ public class DialogsPanel extends JPanel implements Destroyable {
             /** adjust, without changing the sum */
             for (int i = 0; i < n; ++i) {
                 final ToggleDialog dlg = allDialogs.get(i);
-                if (dlg.isDialogInDefaultView() && dlg != triggeredBy) {
+                if (dlg != triggeredBy && dlg.isDialogInDefaultView()) {
                     final int ha = dlg.getHeight();
                     final int h0 = ha * r / sumA;
                     final int he = dlg.getPreferredHeight() * s2 / (sumP + hpTrig);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
index a12170c..04b9545 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
@@ -117,7 +117,7 @@ public class FilterTableModel extends AbstractTableModel {
             }
         }
 
-        if (Main.isDisplayingMapView() && changed) {
+        if (changed && Main.isDisplayingMapView()) {
             Main.map.mapView.repaint();
             Main.map.filterDialog.updateDialogHeader();
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
index 8f5b453..6991451 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
@@ -158,7 +158,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
             if (!sc1.equals(sc2)) {
                 txtMappaint.append(tr("The 2 selected objects have different style caches."));
             }
-            if (sc1.equals(sc2) && sc1 != sc2) {
+            if (sc1 != sc2 && sc1.equals(sc2)) {
                 txtMappaint.append(tr("Warning: The 2 selected objects have equal, but not identical style caches."));
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
index ce20fbc..2e2b92f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MenuItemSearchDialog.java
@@ -9,7 +9,6 @@ import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.Optional;
 
-import javax.swing.DefaultListCellRenderer;
 import javax.swing.JList;
 import javax.swing.JMenuItem;
 import javax.swing.ListCellRenderer;
@@ -88,8 +87,6 @@ public final class MenuItemSearchDialog extends ExtendedDialog {
 
     private static class CellRenderer implements ListCellRenderer<JMenuItem> {
 
-        private final DefaultListCellRenderer def = new DefaultListCellRenderer();
-
         @Override
         public Component getListCellRendererComponent(JList<? extends JMenuItem> list, JMenuItem value, int index,
                                                       boolean isSelected, boolean cellHasFocus) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
index f0c7dd5..85a22e6 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
@@ -54,7 +54,7 @@ public class MinimapDialog extends ToggleDialog implements NavigatableComponent.
 
     @Override
     public void zoomChanged() {
-        if (Main.isDisplayingMapView() && !skipEvents) {
+        if (!skipEvents && Main.isDisplayingMapView()) {
             MapView mv = Main.map.mapView;
             final Bounds currentBounds = new Bounds(
                     mv.getLatLon(0, mv.getHeight()),
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
index 83a8ab7..d324d16 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
@@ -70,7 +70,7 @@ public final class DuplicateAction extends AbstractAction implements IEnabledSta
     @Override
     public void updateEnabledState() {
         if (layer == null) {
-            if (model.getSelectedLayers().size() == 1) {
+            if (model != null && model.getSelectedLayers().size() == 1) {
                 setEnabled(model.getSelectedLayers().get(0) instanceof OsmDataLayer);
             } else {
                 setEnabled(false);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerListTransferHandler.java b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerListTransferHandler.java
index f363ed4..1948f76 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerListTransferHandler.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerListTransferHandler.java
@@ -95,7 +95,7 @@ public class LayerListTransferHandler extends TransferHandler {
 
             boolean isSameLayerManager = tableModel.getLayerManager() == layers.getManager();
 
-            if (support.getDropAction() == MOVE && isSameLayerManager) {
+            if (isSameLayerManager && support.getDropAction() == MOVE) {
                 for (Layer layer : layers.getLayers()) {
                     boolean wasBeforeInsert = layers.getManager().getLayers().indexOf(layer) <= dropLocation;
                     if (wasBeforeInsert) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
index be55747..1b3ca34 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
@@ -213,8 +213,7 @@ public final class LayerVisibilityAction extends AbstractAction implements IEnab
             setValue(Utils.clamp((int) destinationValue, getMinimum(), getMaximum()));
         }
 
-        protected void applyValueToLayer(T layer) {
-        }
+        abstract void applyValueToLayer(T layer);
 
         protected double getRealValue() {
             return convertToRealValue(getValue());
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index 398f749..5c7293c 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -1206,7 +1206,7 @@ implements SelectionChangedListener, ActiveLayerChangeListener, DataSetListenerA
                          *  page using index.php and the direct-link method gives slightly different
                          *  content lengths, so we have to be fuzzy.. (this is UGLY, recode if u know better)
                          */
-                        if (conn.getContentLength() != -1 && osize > -1 && Math.abs(conn.getContentLength() - osize) > 200) {
+                        if (osize > -1 && conn.getContentLength() != -1 && Math.abs(conn.getContentLength() - osize) > 200) {
                             Main.info("{0} is a mediawiki redirect", u);
                             conn.disconnect();
                         } else {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index 07b751b..d9dcce2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -271,17 +271,23 @@ public class GenericRelationEditor extends RelationEditor {
                 getRootPane(), memberTable, selectionTable);
         // CHECKSTYLE.ON: LineLength
 
-        registerCopyPasteAction(new PasteMembersAction(memberTable, getLayer(), this) {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                super.actionPerformed(e);
-                tfRole.requestFocusInWindow();
-            }
-        }, "PASTE_MEMBERS", Shortcut.getPasteKeyStroke(), getRootPane(), memberTable, selectionTable);
-
-        registerCopyPasteAction(new CopyMembersAction(memberTableModel, getLayer(), this),
-                "COPY_MEMBERS", Shortcut.getCopyKeyStroke(), getRootPane(), memberTable, selectionTable);
-
+        KeyStroke key = Shortcut.getPasteKeyStroke();
+        if (key != null) {
+            // handle uncommon situation, that user has no keystroke assigned to paste
+            registerCopyPasteAction(new PasteMembersAction(memberTable, getLayer(), this) {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    super.actionPerformed(e);
+                    tfRole.requestFocusInWindow();
+                }
+            }, "PASTE_MEMBERS", key, getRootPane(), memberTable, selectionTable);
+        }
+        key = Shortcut.getCopyKeyStroke();
+        if (key != null) {
+            // handle uncommon situation, that user has no keystroke assigned to copy
+            registerCopyPasteAction(new CopyMembersAction(memberTableModel, getLayer(), this),
+                    "COPY_MEMBERS", key, getRootPane(), memberTable, selectionTable);
+        }
         tagEditorPanel.setNextFocusComponent(memberTable);
         selectionTable.setFocusable(false);
         memberTableModel.setSelectedMembers(selectedMembers);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
index 7f492f7..3f36752 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
@@ -149,8 +149,7 @@ public class RelationDialogManager extends WindowAdapter implements LayerChangeL
     public boolean isOpenInEditor(OsmDataLayer layer, Relation relation) {
         if (relation == null) return false;
         DialogContext context = new DialogContext(layer, relation);
-        return openDialogs.keySet().contains(context);
-
+        return openDialogs.containsKey(context);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
index 33af48c..ab488ff 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
@@ -97,7 +97,7 @@ public class WayConnectionTypeCalculator {
                 }
             }
 
-            if (!RelationSortUtils.isOneway(m) && lastWct != null) {
+            if (lastWct != null && !RelationSortUtils.isOneway(m)) {
                 wct.direction = determineDirection(i-1, lastWct.direction, i);
                 wct.linkPrev = wct.direction != NONE;
             }
@@ -306,7 +306,7 @@ public class WayConnectionTypeCalculator {
                     else
                         return FORWARD;
                 }
-                if (n == RelationNodeMap.lastOnewayNode(m) && reversed) {
+                if (reversed && n == RelationNodeMap.lastOnewayNode(m)) {
                     if (RelationSortUtils.isBackward(m))
                         return FORWARD;
                     else
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
index e1a9cd4..af125c8 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
@@ -87,7 +87,7 @@ public final class HistoryBrowserDialogManager implements LayerChangeListener {
     }
 
     private void show(long id, HistoryBrowserDialog dialog) {
-        if (dialogs.values().contains(dialog)) {
+        if (dialogs.containsValue(dialog)) {
             show(id);
         } else {
             placeOnScreen(dialog);
@@ -97,7 +97,7 @@ public final class HistoryBrowserDialogManager implements LayerChangeListener {
     }
 
     private void show(long id) {
-        if (dialogs.keySet().contains(id)) {
+        if (dialogs.containsKey(id)) {
             dialogs.get(id).toFront();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
index ab9cc84..25694f1 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
@@ -273,7 +273,7 @@ public class VersionInfoPanel extends JPanel implements ChangeListener {
         final String text = cs != null ? cs.get(attr) : null;
         // Update text, hide prefixing label if empty
         if (label != null) {
-            label.setVisible(text != null && !Utils.strip(text).isEmpty());
+            label.setVisible(text != null && !Utils.isStripEmpty(text));
         }
         textArea.setText(text);
         // Hide container if values of both versions are empty
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
index 8d5e22e..e6aef0c 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
@@ -694,7 +694,7 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
     }
 
     @Override
-    public void tableChanged(TableModelEvent arg0) {
+    public void tableChanged(TableModelEvent e) {
         boolean dis = model.getLayersToSave().isEmpty() && model.getLayersToUpload().isEmpty();
         if (saveAndProceedActionButton != null) {
             saveAndProceedActionButton.setEnabled(!dis);
diff --git a/src/org/openstreetmap/josm/gui/io/UploadDialog.java b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
index 0687169..9e52253 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
@@ -642,8 +642,8 @@ public class UploadDialog extends AbstractUploadDialog implements PropertyChange
     private static String getLastChangesetTagFromHistory(String historyKey, List<String> def) {
         Collection<String> history = Main.pref.getCollection(historyKey, def);
         int age = (int) (System.currentTimeMillis() / 1000 - Main.pref.getInteger(BasicUploadSettingsPanel.HISTORY_LAST_USED_KEY, 0));
-        if (age < Main.pref.getLong(BasicUploadSettingsPanel.HISTORY_MAX_AGE_KEY, TimeUnit.HOURS.toMillis(4))
-                && history != null && !history.isEmpty()) {
+        if (history != null && age < Main.pref.getLong(BasicUploadSettingsPanel.HISTORY_MAX_AGE_KEY, TimeUnit.HOURS.toMillis(4))
+                && !history.isEmpty()) {
             return history.iterator().next();
         } else {
             return null;
diff --git a/src/org/openstreetmap/josm/gui/io/UploadStrategy.java b/src/org/openstreetmap/josm/gui/io/UploadStrategy.java
index 27cf19f..f6505d0 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadStrategy.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadStrategy.java
@@ -21,7 +21,7 @@ public enum UploadStrategy {
      */
     SINGLE_REQUEST_STRATEGY("singlerequest");
 
-    private String preferenceValue;
+    private final String preferenceValue;
 
     UploadStrategy(String preferenceValue) {
         this.preferenceValue = preferenceValue;
diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
index 99fb347..87cccd7 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
@@ -1583,7 +1583,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi
             }
             List<Tile> newlyMissedTiles = new LinkedList<>();
             for (Tile missed : missedTiles) {
-                if ("no-tile".equals(missed.getValue("tile-info")) && zoomOffset > 0) {
+                if (zoomOffset > 0 && "no-tile".equals(missed.getValue("tile-info"))) {
                     // Don't try to paint from higher zoom levels when tile is overzoomed
                     newlyMissedTiles.add(missed);
                     continue;
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
index 2f0b36d..cf3b409 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
@@ -539,7 +539,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
     }
 
     @Override
-    public void actionPerformed(ActionEvent arg0) {
+    public void actionPerformed(ActionEvent ae) {
         // Construct the list of loaded GPX tracks
         Collection<Layer> layerLst = Main.getLayerManager().getLayers();
         GpxDataWrapper defaultItem = null;
@@ -1070,7 +1070,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 continue;
             }
 
-            if (e.isTagged() && e.getExifCoor() == null && !tagged) {
+            if (!tagged && e.isTagged() && e.getExifCoor() == null) {
                 continue;
             }
 
@@ -1201,7 +1201,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 break;
             }
 
-            if (curImg.tmp.getPos() == null && prevWp != null) {
+            if (prevWp != null && curImg.tmp.getPos() == null) {
                 // The values of timeDiff are between 0 and 1, it is not seconds but a dimensionless variable
                 double timeDiff = (double) (imgTime - prevWpTime) / interval;
                 curImg.tmp.setPos(prevWp.getCoor().interpolate(curWp.getCoor(), timeDiff));
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
index e6e6a8d..130c3e4 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
@@ -16,6 +16,7 @@ import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
 import java.awt.image.BufferedImage;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -97,8 +98,20 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
     boolean updateOffscreenBuffer = true;
 
     private MouseAdapter mouseAdapter;
+    private MouseMotionAdapter mouseMotionAdapter;
     private MapModeChangeListener mapModeListener;
 
+    /** Mouse position where the last image was selected. */
+    private Point lastSelPos;
+
+    /**
+     * Image cycle mode flag.
+     * It is possible that a mouse button release triggers multiple mouseReleased() events.
+     * To prevent the cycling in such a case we wait for the next mouse button press event
+     * before it is cycled to the next image.
+     */
+    private boolean cycleModeArmed;
+
     /**
      * Constructs a new {@code GeoImageLayer}.
      * @param data The list of images to display
@@ -467,6 +480,33 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                 (int) Math.round(f * thumb.getHeight(null)));
     }
 
+    /**
+     * Paint one image.
+     * @param e Image to be painted
+     * @param mv Map view
+     * @param clip Bounding rectangle of the current clipping area
+     * @param tempG Temporary offscreen buffer
+     */
+    private void paintImage(ImageEntry e, MapView mv, Rectangle clip, Graphics2D tempG) {
+        if (e.getPos() == null) {
+            return;
+        }
+        Point p = mv.getPoint(e.getPos());
+        if (e.hasThumbnail()) {
+            Dimension d = scaledDimension(e.getThumbnail());
+            if (d != null) {
+                Rectangle target = new Rectangle(p.x - d.width / 2, p.y - d.height / 2, d.width, d.height);
+                if (clip.intersects(target)) {
+                    tempG.drawImage(e.getThumbnail(), target.x, target.y, target.width, target.height, null);
+                }
+            }
+        } else { // thumbnail not loaded yet
+            icon.paintIcon(mv, tempG,
+                p.x - icon.getIconWidth() / 2,
+                p.y - icon.getIconHeight() / 2);
+        }
+    }
+
     @Override
     public void paint(Graphics2D g, MapView mv, Bounds bounds) {
         int width = mv.getWidth();
@@ -494,23 +534,11 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
 
                 if (data != null) {
                     for (ImageEntry e : data) {
-                        if (e.getPos() == null) {
-                            continue;
-                        }
-                        Point p = mv.getPoint(e.getPos());
-                        if (e.hasThumbnail()) {
-                            Dimension d = scaledDimension(e.getThumbnail());
-                            if (d != null) {
-                                Rectangle target = new Rectangle(p.x - d.width / 2, p.y - d.height / 2, d.width, d.height);
-                                if (clip.intersects(target)) {
-                                    tempG.drawImage(e.getThumbnail(), target.x, target.y, target.width, target.height, null);
-                                }
-                            }
-                        } else { // thumbnail not loaded yet
-                            icon.paintIcon(mv, tempG,
-                                    p.x - icon.getIconWidth() / 2,
-                                    p.y - icon.getIconHeight() / 2);
-                        }
+                        paintImage(e, mv, clip, tempG);
+                    }
+                    if (currentPhoto >= 0 && currentPhoto < data.size()) {
+                        // Make sure the selected image is on top in case multiple images overlap.
+                        paintImage(data.get(currentPhoto), mv, clip, tempG);
                     }
                 }
                 updateOffscreenBuffer = false;
@@ -601,6 +629,20 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
     }
 
     /**
+     * Show current photo on map and in image viewer.
+     */
+    public void showCurrentPhoto() {
+        clearOtherCurrentPhotos();
+        if (currentPhoto >= 0) {
+            ImageViewerDialog.showImage(this, data.get(currentPhoto));
+        } else {
+            ImageViewerDialog.showImage(this, null);
+        }
+        updateOffscreenBuffer = true;
+        Main.map.repaint();
+    }
+
+    /**
      * Shows next photo.
      */
     public void showNextPhoto() {
@@ -609,11 +651,10 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
             if (currentPhoto >= data.size()) {
                 currentPhoto = data.size() - 1;
             }
-            ImageViewerDialog.showImage(this, data.get(currentPhoto));
         } else {
             currentPhoto = -1;
         }
-        Main.map.repaint();
+        showCurrentPhoto();
     }
 
     /**
@@ -625,11 +666,10 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
             if (currentPhoto < 0) {
                 currentPhoto = 0;
             }
-            ImageViewerDialog.showImage(this, data.get(currentPhoto));
         } else {
             currentPhoto = -1;
         }
-        Main.map.repaint();
+        showCurrentPhoto();
     }
 
     /**
@@ -638,11 +678,10 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
     public void showFirstPhoto() {
         if (data != null && !data.isEmpty()) {
             currentPhoto = 0;
-            ImageViewerDialog.showImage(this, data.get(currentPhoto));
         } else {
             currentPhoto = -1;
         }
-        Main.map.repaint();
+        showCurrentPhoto();
     }
 
     /**
@@ -651,11 +690,10 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
     public void showLastPhoto() {
         if (data != null && !data.isEmpty()) {
             currentPhoto = data.size() - 1;
-            ImageViewerDialog.showImage(this, data.get(currentPhoto));
         } else {
             currentPhoto = -1;
         }
-        Main.map.repaint();
+        showCurrentPhoto();
     }
 
     public void checkPreviousNextButtons() {
@@ -669,13 +707,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
             if (currentPhoto >= data.size()) {
                 currentPhoto = data.size() - 1;
             }
-            if (currentPhoto >= 0) {
-                ImageViewerDialog.showImage(this, data.get(currentPhoto));
-            } else {
-                ImageViewerDialog.showImage(this, null);
-            }
-            updateOffscreenBuffer = true;
-            Main.map.repaint();
+            showCurrentPhoto();
         }
     }
 
@@ -702,11 +734,6 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                 if (currentPhoto >= data.size()) {
                     currentPhoto = data.size() - 1;
                 }
-                if (currentPhoto >= 0) {
-                    ImageViewerDialog.showImage(this, data.get(currentPhoto));
-                } else {
-                    ImageViewerDialog.showImage(this, null);
-                }
 
                 if (Utils.deleteFile(toDelete.getFile())) {
                     Main.info("File "+toDelete.getFile()+" deleted. ");
@@ -719,8 +746,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                             );
                 }
 
-                updateOffscreenBuffer = true;
-                Main.map.repaint();
+                showCurrentPhoto();
             }
         }
     }
@@ -743,38 +769,105 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
     }
 
     /**
-     * Returns the image that matches the position of the mouse event.
+     * Check if the position of the mouse event is within the rectangle of the photo icon or thumbnail.
+     * @param idx Image index, range 0 .. size-1
      * @param evt Mouse event
-     * @return Image at mouse position, or {@code null} if there is no image at the mouse position
-     * @since 6392
+     * @return {@code true} if the photo matches the mouse position, {@code false} otherwise
      */
-    public ImageEntry getPhotoUnderMouse(MouseEvent evt) {
-        if (data != null) {
-            for (int idx = data.size() - 1; idx >= 0; --idx) {
-                ImageEntry img = data.get(idx);
-                if (img.getPos() == null) {
-                    continue;
-                }
-                Point p = Main.map.mapView.getPoint(img.getPos());
-                Rectangle r;
+    private boolean isPhotoIdxUnderMouse(int idx, MouseEvent evt) {
+        if (idx >= 0 && data != null && idx < data.size()) {
+            ImageEntry img = data.get(idx);
+            if (img.getPos() != null) {
+                Point imgCenter = Main.map.mapView.getPoint(img.getPos());
+                Rectangle imgRect;
                 if (useThumbs && img.hasThumbnail()) {
-                    Dimension d = scaledDimension(img.getThumbnail());
-                    if (d != null)
-                        r = new Rectangle(p.x - d.width / 2, p.y - d.height / 2, d.width, d.height);
-                    else
-                        r = null;
+                    Dimension imgDim = scaledDimension(img.getThumbnail());
+                    if (imgDim != null) {
+                        imgRect = new Rectangle(imgCenter.x - imgDim.width / 2,
+                                                imgCenter.y - imgDim.height / 2,
+                                                imgDim.width, imgDim.height);
+                    } else {
+                        imgRect = null;
+                    }
                 } else {
-                    r = new Rectangle(p.x - icon.getIconWidth() / 2,
-                                      p.y - icon.getIconHeight() / 2,
-                                      icon.getIconWidth(),
-                                      icon.getIconHeight());
+                    imgRect = new Rectangle(imgCenter.x - icon.getIconWidth() / 2,
+                                            imgCenter.y - icon.getIconHeight() / 2,
+                                            icon.getIconWidth(), icon.getIconHeight());
                 }
-                if (r != null && r.contains(evt.getPoint())) {
-                    return img;
+                if (imgRect != null && imgRect.contains(evt.getPoint())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns index of the image that matches the position of the mouse event.
+     * @param evt    Mouse event
+     * @param cycle  Set to {@code true} to cycle through the photos at the
+     *               current mouse position if multiple icons or thumbnails overlap.
+     *               If set to {@code false} the topmost photo will be used.
+     * @return       Image index at mouse position, range 0 .. size-1,
+     *               or {@code -1} if there is no image at the mouse position
+     */
+    private int getPhotoIdxUnderMouse(MouseEvent evt, boolean cycle) {
+        if (data != null) {
+            if (cycle && currentPhoto >= 0) {
+                // Cycle loop is forward as that is the natural order.
+                // Loop 1: One after current photo up to last one.
+                for (int idx = currentPhoto + 1; idx < data.size(); ++idx) {
+                    if (isPhotoIdxUnderMouse(idx, evt)) {
+                        return idx;
+                    }
+                }
+                // Loop 2: First photo up to current one.
+                for (int idx = 0; idx <= currentPhoto; ++idx) {
+                    if (isPhotoIdxUnderMouse(idx, evt)) {
+                        return idx;
+                    }
+                }
+            } else {
+                // Check for current photo first, i.e. keep it selected if it is under the mouse.
+                if (currentPhoto >= 0 && isPhotoIdxUnderMouse(currentPhoto, evt)) {
+                    return currentPhoto;
+                }
+                // Loop from last to first to prefer topmost image.
+                for (int idx = data.size() - 1; idx >= 0; --idx) {
+                    if (isPhotoIdxUnderMouse(idx, evt)) {
+                        return idx;
+                    }
                 }
             }
         }
-        return null;
+        return -1;
+    }
+
+    /**
+     * Returns index of the image that matches the position of the mouse event.
+     * The topmost photo is picked if multiple icons or thumbnails overlap.
+     * @param evt Mouse event
+     * @return Image index at mouse position, range 0 .. size-1,
+     *         or {@code -1} if there is no image at the mouse position
+     */
+    private int getPhotoIdxUnderMouse(MouseEvent evt) {
+        return getPhotoIdxUnderMouse(evt, false);
+    }
+
+    /**
+     * Returns the image that matches the position of the mouse event.
+     * The topmost photo is picked of multiple icons or thumbnails overlap.
+     * @param evt Mouse event
+     * @return Image at mouse position, or {@code null} if there is no image at the mouse position
+     * @since 6392
+     */
+    public ImageEntry getPhotoUnderMouse(MouseEvent evt) {
+        int idx = getPhotoIdxUnderMouse(evt);
+        if (idx >= 0) {
+            return data.get(idx);
+        } else {
+            return null;
+        }
     }
 
     /**
@@ -848,6 +941,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                     return;
                 if (isVisible() && isMapModeOk()) {
                     Main.map.mapView.repaint();
+                    cycleModeArmed = true;
                 }
             }
 
@@ -858,41 +952,37 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                 if (data == null || !isVisible() || !isMapModeOk())
                     return;
 
-                for (int i = data.size() - 1; i >= 0; --i) {
-                    ImageEntry e = data.get(i);
-                    if (e.getPos() == null) {
-                        continue;
-                    }
-                    Point p = Main.map.mapView.getPoint(e.getPos());
-                    Rectangle r;
-                    if (useThumbs && e.hasThumbnail()) {
-                        Dimension d = scaledDimension(e.getThumbnail());
-                        if (d != null)
-                            r = new Rectangle(p.x - d.width / 2, p.y - d.height / 2, d.width, d.height);
-                        else
-                            r = null;
-                    } else {
-                        r = new Rectangle(p.x - icon.getIconWidth() / 2,
-                                p.y - icon.getIconHeight() / 2,
-                                icon.getIconWidth(),
-                                icon.getIconHeight());
-                    }
-                    if (r != null && r.contains(ev.getPoint())) {
-                        clearOtherCurrentPhotos();
-                        currentPhoto = i;
-                        ImageViewerDialog.showImage(GeoImageLayer.this, e);
-                        Main.map.repaint();
-                        break;
-                    }
+                Point mousePos = ev.getPoint();
+                boolean cycle = cycleModeArmed && lastSelPos != null && lastSelPos.equals(mousePos);
+                int idx = getPhotoIdxUnderMouse(ev, cycle);
+                if (idx >= 0) {
+                    lastSelPos = mousePos;
+                    cycleModeArmed = false;
+                    currentPhoto = idx;
+                    showCurrentPhoto();
                 }
             }
         };
 
+        mouseMotionAdapter = new MouseMotionAdapter() {
+            @Override
+            public void mouseMoved(MouseEvent evt) {
+                lastSelPos = null;
+            }
+
+            @Override
+            public void mouseDragged(MouseEvent evt) {
+                lastSelPos = null;
+            }
+        };
+
         mapModeListener = (oldMapMode, newMapMode) -> {
             if (newMapMode == null || isSupportedMapMode(newMapMode)) {
                 Main.map.mapView.addMouseListener(mouseAdapter);
+                Main.map.mapView.addMouseMotionListener(mouseMotionAdapter);
             } else {
                 Main.map.mapView.removeMouseListener(mouseAdapter);
+                Main.map.mapView.removeMouseMotionListener(mouseMotionAdapter);
             }
         };
 
@@ -917,6 +1007,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                 if (e.getRemovedLayer() == GeoImageLayer.this) {
                     stopLoadThumbs();
                     Main.map.mapView.removeMouseListener(mouseAdapter);
+                    Main.map.mapView.removeMouseMotionListener(mouseMotionAdapter);
                     MapFrame.removeMapModeChangeListener(mapModeListener);
                     currentPhoto = -1;
                     if (data != null) {
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
index 7e457a5..b7dc8aa 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
@@ -305,7 +305,7 @@ public final class ImageViewerDialog extends ToggleDialog implements LayerChange
 
             imageChanged = currentEntry != entry;
 
-            if (centerView && Main.isDisplayingMapView() && entry != null && entry.getPos() != null) {
+            if (centerView && entry != null && Main.isDisplayingMapView() && entry.getPos() != null) {
                 Main.map.mapView.zoomTo(entry.getPos());
             }
 
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java
index 874c7f9..9b9f51a 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ShowThumbnailAction.java
@@ -35,10 +35,10 @@ public class ShowThumbnailAction extends AbstractAction implements LayerAction {
 
     /**
      * This is called after the menu entry was selected.
-     * @param arg0 action event
+     * @param e action event
      */
     @Override
-    public void actionPerformed(ActionEvent arg0) {
+    public void actionPerformed(ActionEvent e) {
         layer.setUseThumbs(!layer.isUseThumbs());
         Main.map.mapView.repaint();
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
index b69d4c1..504fe1f 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
@@ -221,7 +221,7 @@ public class ChooseTrackVisibilityAction extends AbstractAction {
     }
 
     @Override
-    public void actionPerformed(ActionEvent arg0) {
+    public void actionPerformed(ActionEvent ae) {
         final JPanel msg = new JPanel(new GridBagLayout());
 
         dateFilter = new DateFilterPanel(layer, "gpx.traces", false);
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
index 209bc1f..dafa400 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
@@ -36,6 +36,7 @@ import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.gui.widgets.UrlLabel;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -43,8 +44,13 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  * @param <T> the source layer class
  */
 public abstract class ConvertToDataLayerAction<T extends Layer> extends AbstractAction {
+    /** source layer */
     protected final transient T layer;
 
+    /**
+     * Constructs a new {@code ConvertToDataLayerAction}
+     * @param layer source layer
+     */
     protected ConvertToDataLayerAction(final T layer) {
         super(tr("Convert to data layer"), ImageProvider.get("converttoosm"));
         this.layer = layer;
@@ -74,7 +80,11 @@ public abstract class ConvertToDataLayerAction<T extends Layer> extends Abstract
                         Node n = new Node(p.getCoor());
                         String timestr = p.getString(GpxConstants.PT_TIME);
                         if (timestr != null) {
-                            n.setTimestamp(DateUtils.fromString(timestr));
+                            try {
+                                n.setTimestamp(DateUtils.fromString(timestr));
+                            } catch (UncheckedParseException e) {
+                                Main.warn(e, false);
+                            }
                         }
                         ds.addPrimitive(n);
                         nodes.add(n);
@@ -150,12 +160,12 @@ public abstract class ConvertToDataLayerAction<T extends Layer> extends Abstract
             return;
         }
         final DataSet ds = convert();
-        final OsmDataLayer layer = new OsmDataLayer(ds, tr("Converted from: {0}", this.layer.getName()), null);
-        if (this.layer.getAssociatedFile() != null) {
-            layer.setAssociatedFile(new File(this.layer.getAssociatedFile().getParentFile(), this.layer.getAssociatedFile().getName() + ".osm"));
+        final OsmDataLayer osmLayer = new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), null);
+        if (layer.getAssociatedFile() != null) {
+            osmLayer.setAssociatedFile(new File(layer.getAssociatedFile().getParentFile(), layer.getAssociatedFile().getName() + ".osm"));
         }
-        layer.setUploadDiscouraged(true);
-        Main.getLayerManager().addLayer(layer);
-        Main.getLayerManager().removeLayer(this.layer);
+        osmLayer.setUploadDiscouraged(true);
+        Main.getLayerManager().addLayer(osmLayer);
+        Main.getLayerManager().removeLayer(layer);
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
index 168a45c..a1893bb 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
@@ -4,12 +4,23 @@ package org.openstreetmap.josm.gui.layer.gpx;
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.AlphaComposite;
 import java.awt.BasicStroke;
 import java.awt.Color;
+import java.awt.Composite;
 import java.awt.Graphics2D;
+import java.awt.LinearGradientPaint;
+import java.awt.MultipleGradientPaint;
+import java.awt.Paint;
 import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.Stroke;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+import java.awt.image.Raster;
+import java.io.BufferedReader;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -17,6 +28,8 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
+import javax.swing.ImageIcon;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
@@ -27,7 +40,11 @@ import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.data.preferences.AbstractProperty;
 import org.openstreetmap.josm.data.preferences.ColorProperty;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapViewState;
+import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.tools.ColorScale;
+import org.openstreetmap.josm.tools.JosmRuntimeException;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Class that helps to draw large set of GPS tracks with different colors and options
@@ -45,11 +62,15 @@ public class GpxDrawHelper implements SoMChangeListener {
 
     // draw lines between points belonging to different segments
     private boolean forceLines;
+    // use alpha blending for line draw
+    private boolean alphaLines;
     // draw direction arrows on the lines
     private boolean direction;
-    /** don't draw lines if longer than x meters **/
+    /** width of line for paint **/
     private int lineWidth;
+    /** don't draw lines if longer than x meters **/
     private int maxLineLength;
+    // draw lines
     private boolean lines;
     /** paint large dots for points **/
     private boolean large;
@@ -73,6 +94,7 @@ public class GpxDrawHelper implements SoMChangeListener {
     private boolean computeCacheColorDynamic;
     private ColorMode computeCacheColored;
     private int computeCacheColorTracksTune;
+    private int computeCacheHeatMapDrawColorTableIdx;
 
     //// Color-related fields
     /** Mode of the line coloring **/
@@ -104,6 +126,37 @@ public class GpxDrawHelper implements SoMChangeListener {
         {+ll0, -sl4, +sl4, -ll0}, {+ll0, +sl9, +ll0, -sl9}
     };
 
+    /** heat map parameters **/
+
+    // enabled or not (override by settings)
+    private boolean heatMapEnabled;
+    // draw small extra line
+    private boolean heatMapDrawExtraLine;
+    // used index for color table (parameter)
+    private int heatMapDrawColorTableIdx;
+
+    // normal buffered image and draw object (cached)
+    private BufferedImage heatMapImgGray;
+    private Graphics2D heatMapGraph2d;
+
+    // some cached values
+    Rectangle heatMapCacheScreenBounds = new Rectangle();
+    MapViewState heatMapMapViewState;
+    int heatMapCacheLineWith;
+
+    // copied value for line drawing
+    private final List<Integer> heatMapPolyX = new ArrayList<>();
+    private final List<Integer> heatMapPolyY = new ArrayList<>();
+
+    // setup color maps used by heat map
+    private static Color[] heatMapLutColorJosmInferno = createColorFromResource("inferno");
+    private static Color[] heatMapLutColorJosmViridis = createColorFromResource("viridis");
+    private static Color[] heatMapLutColorJosmBrown2Green = createColorFromResource("brown2green");
+    private static Color[] heatMapLutColorJosmRed2Blue = createColorFromResource("red2blue");
+
+    // user defined heatmap color
+    private Color[] heatMapLutColor = createColorLut(Color.BLACK, Color.WHITE);
+
     private void setupColors() {
         hdopAlpha = Main.pref.getInteger("hdop.color.alpha", -1);
         velocityScale = ColorScale.createHSBScale(256);
@@ -111,6 +164,7 @@ public class GpxDrawHelper implements SoMChangeListener {
         hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP"));
         dateScale = ColorScale.createHSBScale(256).addTitle(tr("Time"));
         directionScale = ColorScale.createCyclicScale(256).setIntervalCount(4).addTitle(tr("Direction"));
+
         systemOfMeasurementChanged(null, null);
     }
 
@@ -118,7 +172,7 @@ public class GpxDrawHelper implements SoMChangeListener {
     public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
         SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
         velocityScale.addTitle(tr("Velocity, {0}", som.speedName));
-        if (Main.isDisplayingMapView() && oldSoM != null && newSoM != null) {
+        if (oldSoM != null && newSoM != null && Main.isDisplayingMapView()) {
             Main.map.mapView.repaint();
         }
     }
@@ -127,7 +181,7 @@ public class GpxDrawHelper implements SoMChangeListener {
      * Different color modes
      */
     public enum ColorMode {
-        NONE, VELOCITY, HDOP, DIRECTION, TIME;
+        NONE, VELOCITY, HDOP, DIRECTION, TIME, HEATMAP;
 
         static ColorMode fromIndex(final int index) {
             return values()[index];
@@ -170,7 +224,7 @@ public class GpxDrawHelper implements SoMChangeListener {
     /**
      * Read coloring mode for specified layer from preferences
      * @param layerName name of the GpxLayer
-     * @return coloting mode
+     * @return coloring mode
      */
     public ColorMode getColorMode(String layerName) {
         try {
@@ -198,6 +252,7 @@ public class GpxDrawHelper implements SoMChangeListener {
         forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false);
         direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false);
         lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0);
+        alphaLines = Main.pref.getBoolean("draw.rawgps.lines.alpha-blend", spec, false);
 
         if (!data.fromServer) {
             maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1);
@@ -219,6 +274,11 @@ public class GpxDrawHelper implements SoMChangeListener {
         minTrackDurationForTimeColoring = Main.pref.getInteger("draw.rawgps.date-coloring-min-dt", 60);
         largePointAlpha = Main.pref.getInteger("draw.rawgps.large.alpha", -1) & 0xFF;
 
+        // get heatmap parameters
+        heatMapEnabled = Main.pref.getBoolean("draw.rawgps.heatmap.enabled", spec, false);
+        heatMapDrawExtraLine = Main.pref.getBoolean("draw.rawgps.heatmap.line-extra", spec, false);
+        heatMapDrawColorTableIdx = Main.pref.getInteger("draw.rawgps.heatmap.colormap", specName(layerName), 0);
+
         neutralColor = getColor(layerName, true);
         velocityScale.setNoDataColor(neutralColor);
         dateScale.setNoDataColor(neutralColor);
@@ -228,8 +288,16 @@ public class GpxDrawHelper implements SoMChangeListener {
         largesize += lineWidth;
     }
 
+    /**
+     * Draw all enabled GPX elements of layer.
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     */
     public void drawAll(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
 
+        final long timeStart = System.currentTimeMillis();
+
         checkCache();
 
         // STEP 2b - RE-COMPUTE CACHE DATA *********************
@@ -237,8 +305,14 @@ public class GpxDrawHelper implements SoMChangeListener {
             calculateColors();
         }
 
-        Stroke storedStroke = g.getStroke();
+        fixColors(visibleSegments);
+
+        // backup the environment
+        Composite oldComposite = g.getComposite();
+        Stroke oldStroke = g.getStroke();
+        Paint oldPaint = g.getPaint();
 
+        // set hints for the render
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
             Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
                     RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
@@ -246,15 +320,61 @@ public class GpxDrawHelper implements SoMChangeListener {
         if (lineWidth != 0) {
             g.setStroke(new BasicStroke(lineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
         }
-        fixColors(visibleSegments);
-        drawLines(g, mv, visibleSegments);
+
+        // global enabled or select via color
+        boolean useHeatMap = heatMapEnabled || ColorMode.HEATMAP == colored;
+
+        // default global alpha level
+        float layerAlpha = 1.00f;
+
+        // extract current alpha blending value
+        if (oldComposite instanceof AlphaComposite) {
+            layerAlpha = ((AlphaComposite) oldComposite).getAlpha();
+        }
+
+        // use heatmap background layer
+        if (useHeatMap) {
+            drawHeatMap(g, mv, visibleSegments);
+        } else {
+            // use normal line style or alpha-blending lines
+            if (!alphaLines) {
+                drawLines(g, mv, visibleSegments);
+            } else {
+                drawLinesAlpha(g, mv, visibleSegments, layerAlpha);
+            }
+        }
+
+        // override global alpha settings (smooth overlay)
+        if (alphaLines || useHeatMap) {
+            g.setComposite(AlphaComposite.SrcOver.derive(0.25f * layerAlpha));
+        }
+
+        // normal overlays
         drawArrows(g, mv, visibleSegments);
         drawPoints(g, mv, visibleSegments);
-        if (lineWidth != 0) {
-            g.setStroke(storedStroke);
+
+        // restore environment
+        g.setPaint(oldPaint);
+        g.setStroke(oldStroke);
+        g.setComposite(oldComposite);
+
+        // show some debug info
+        if (Main.isDebugEnabled() && !visibleSegments.isEmpty()) {
+            final long timeDiff = System.currentTimeMillis() - timeStart;
+
+            Main.debug("gpxdraw::draw takes " +
+                         Utils.getDurationString(timeDiff) +
+                         "(" +
+                         "segments= " + visibleSegments.size() +
+                         ", per 10000 = " + Utils.getDurationString(10_000 * timeDiff / visibleSegments.size()) +
+                         ")"
+              );
         }
     }
 
+    /**
+     *  Calculate colors of way segments based on latest configuration settings
+     */
     public void calculateColors() {
         double minval = +1e10;
         double maxval = -1e10;
@@ -327,7 +447,6 @@ public class GpxDrawHelper implements SoMChangeListener {
             dateScale.setRange(minval, maxval);
         }
 
-
         // Now the colors for all the points will be assigned
         for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
             if (!forceLines) { // don't draw lines between segments, unless forced to
@@ -391,9 +510,25 @@ public class GpxDrawHelper implements SoMChangeListener {
             }
         }
 
+        // heat mode
+        if (ColorMode.HEATMAP == colored) {
+
+            // generate and get new user color map
+            heatMapLutColor = selectColorMap(neutralColor != null ? neutralColor : Color.WHITE, heatMapDrawColorTableIdx);
+
+            // force redraw of image
+            heatMapMapViewState = null;
+        }
+
         computeCacheInSync = true;
     }
 
+    /**
+     * Draw all GPX ways segments
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     */
     private void drawLines(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
         if (lines) {
             Point old = null;
@@ -413,6 +548,12 @@ public class GpxDrawHelper implements SoMChangeListener {
         }
     }
 
+    /**
+     * Draw all GPX arrays
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     */
     private void drawArrows(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
         /****************************************************************
          ********** STEP 3b - DRAW NICE ARROWS **************************
@@ -474,6 +615,12 @@ public class GpxDrawHelper implements SoMChangeListener {
         }
     }
 
+    /**
+     * Draw all GPX points
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     */
     private void drawPoints(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
         /****************************************************************
          ********** STEP 3d - DRAW LARGE POINTS AND HDOP CIRCLE *********
@@ -550,6 +697,497 @@ public class GpxDrawHelper implements SoMChangeListener {
         } // end if large
     }
 
+    /**
+     * Draw GPX lines by using alpha blending
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     * @param layerAlpha      the color alpha value set for that operation
+     */
+    private void drawLinesAlpha(Graphics2D g, MapView mv, List<WayPoint> visibleSegments, float layerAlpha) {
+
+        // 1st. backup the paint environment ----------------------------------
+        Composite oldComposite = g.getComposite();
+        Stroke oldStroke = g.getStroke();
+        Paint oldPaint = g.getPaint();
+
+        // 2nd. determine current scale factors -------------------------------
+
+        // adjust global settings
+        final int globalLineWidth = Math.min(Math.max(lineWidth, 1), 20);
+
+        // cache scale of view
+        final double zoomScale = mv.getDist100Pixel() / 50.0f;
+
+        // 3rd. determine current paint parameters -----------------------------
+
+        // alpha value is based on zoom and line with combined with global layer alpha
+        float theLineAlpha = Math.min(Math.max((0.50f/(float) zoomScale)/(globalLineWidth + 1), 0.01f), 0.50f) * layerAlpha;
+        final int theLineWith = (int) (lineWidth / zoomScale) + 1;
+
+        // 4th setup virtual paint area ----------------------------------------
+
+        // set line format and alpha channel for all overlays (more lines -> few overlap -> more transparency)
+        g.setStroke(new BasicStroke(theLineWith, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+        g.setComposite(AlphaComposite.SrcOver.derive(theLineAlpha));
+
+        // last used / calculated entries
+        Point lastPaintPnt = null;
+
+        // 5th draw the layer ---------------------------------------------------
+
+        // for all points
+        for (WayPoint trkPnt : visibleSegments) {
+
+            // transform coordinates
+            final Point paintPnt = mv.getPoint(trkPnt.getEastNorth());
+
+            // skip single points
+            if (lastPaintPnt != null && trkPnt.drawLine && !lastPaintPnt.equals(paintPnt)) {
+
+                // set different color
+                g.setColor(trkPnt.customColoring);
+
+                // draw it
+                g.drawLine(lastPaintPnt.x, lastPaintPnt.y, paintPnt.x, paintPnt.y);
+            }
+
+            lastPaintPnt = paintPnt;
+        }
+
+        // @last restore modified paint environment -----------------------------
+        g.setPaint(oldPaint);
+        g.setStroke(oldStroke);
+        g.setComposite(oldComposite);
+    }
+
+    /**
+     * Generates a linear gradient map image
+     *
+     * @param width  image width
+     * @param height image height
+     * @param colors 1..n color descriptions
+     * @return image object
+     */
+    protected static BufferedImage createImageGradientMap(int width, int height, Color... colors) {
+
+        // create image an paint object
+        final BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        final Graphics2D g = img.createGraphics();
+
+        float[] fract = new float[ colors.length ];
+
+        // distribute fractions (define position of color in map)
+        for (int i = 0; i < colors.length; ++i) {
+            fract[i] = i * (1.0f / colors.length);
+        }
+
+        // draw the gradient map
+        LinearGradientPaint gradient = new LinearGradientPaint(0, 0, width, height, fract, colors,
+                                                               MultipleGradientPaint.CycleMethod.NO_CYCLE);
+        g.setPaint(gradient);
+        g.fillRect(0, 0, width, height);
+        g.dispose();
+
+        // access it via raw interface
+        return img;
+    }
+
+    /**
+     * Creates a linear distributed colormap by linear blending between colors
+     * @param colors 1..n colors
+     * @return array of Color objects
+     */
+    protected static Color[] createColorLut(Color... colors) {
+
+        // number of lookup entries
+        final int tableSize = 256;
+
+        // access it via raw interface
+        final Raster imgRaster = createImageGradientMap(tableSize, 1, colors).getData();
+
+        // the pixel storage
+        int[] pixel = new int[1];
+
+        Color[] colorTable = new Color[tableSize];
+
+        // map the range 0..255 to 0..pi/2
+        final double mapTo90Deg = Math.PI / 2.0 / 255.0;
+
+        // create the lookup table
+        for (int i = 0; i < tableSize; i++) {
+
+            // get next single pixel
+            imgRaster.getDataElements(i, 0, pixel);
+
+            // get color and map
+            Color c = new Color(pixel[0]);
+
+            // smooth alpha like sin curve
+            int alpha = (int) (Math.sin(i * mapTo90Deg) * 255);
+
+            // alpha with pre-offset, first color -> full transparent
+            alpha = i > 0 ? (10 + alpha) : 0;
+
+            // shrink to maximum bound
+            if (alpha > 255) {
+                alpha = 255;
+            }
+
+            // increase transparency for higher values ( avoid big saturation )
+            if (i > 240 && 255 == alpha) {
+                alpha -= (i - 240);
+            }
+
+            // fill entry in table, assign a alpha value
+            colorTable[i] = new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha);
+        }
+
+        // transform into lookup table
+        return colorTable;
+    }
+
+    /**
+     * Creates a darker color
+     * @param in        Color object
+     * @param adjust    darker adjustment amount
+     * @return          new Color
+     */
+    protected static Color darkerColor(Color in, float adjust) {
+
+        final float r = (float) in.getRed()/255;
+        final float g = (float) in.getGreen()/255;
+        final float b = (float) in.getBlue()/255;
+
+        return new Color(r*adjust, g*adjust, b*adjust);
+    }
+
+    /**
+     * Creates a colormap by using a static color map with 1..n colors (RGB 0.0 ..1.0)
+     * @param str the filename (without extension) to look for into data/gpx
+     * @return the parsed colormap
+     */
+    protected static Color[] createColorFromResource(String str) {
+
+        // create resource string
+        final String colorFile = "resource://data/gpx/" + str + ".txt";
+
+        List<Color> colorList = new ArrayList<>();
+
+        // try to load the file
+        try (CachedFile cf = new CachedFile(colorFile); BufferedReader br = cf.getContentReader()) {
+
+            String line;
+
+            // process lines
+            while ((line = br.readLine()) != null) {
+
+                // use comma as separator
+                String[] column = line.split(",");
+
+                // empty or comment line
+                if (column.length < 3 || column[0].startsWith("#")) {
+                    continue;
+                }
+
+                // extract RGB value
+                float r = Float.parseFloat(column[0]);
+                float g = Float.parseFloat(column[1]);
+                float b = Float.parseFloat(column[2]);
+
+                // some color tables are 0..1.0 and some 0.255
+                float scale = (r < 1 && g < 1 && b < 1) ? 1 : 255;
+
+                colorList.add(new Color(r/scale, g/scale, b/scale));
+            }
+        } catch (IOException e) {
+            throw new JosmRuntimeException(e);
+        }
+
+        // fallback if empty or failed
+        if (colorList.isEmpty()) {
+            colorList.add(Color.BLACK);
+            colorList.add(Color.WHITE);
+        } else {
+            // add additional darker elements to end of list
+            final Color lastColor = colorList.get(colorList.size() - 1);
+            colorList.add(darkerColor(lastColor, 0.975f));
+            colorList.add(darkerColor(lastColor, 0.950f));
+        }
+
+        return createColorLut(colorList.toArray(new Color[ colorList.size() ]));
+    }
+
+    /**
+     * Returns the next user color map
+     *
+     * @param userColor - default or fallback user color
+     * @param tableIdx  - selected user color index
+     * @return color array
+     */
+    protected static Color[] selectColorMap(Color userColor, int tableIdx) {
+
+        // generate new user color map
+        Color[] nextUserColor = createColorLut(Color.BLACK, userColor.darker(),
+                                               userColor, userColor.brighter(), Color.WHITE);
+
+        // decide what, keep order is sync with setting on GUI
+        Color[][] lut = {
+                nextUserColor,
+                heatMapLutColorJosmInferno,
+                heatMapLutColorJosmViridis,
+                heatMapLutColorJosmBrown2Green,
+                heatMapLutColorJosmRed2Blue
+        };
+
+        // select by index
+        if (tableIdx < lut.length) {
+            nextUserColor = lut[ tableIdx ];
+        }
+
+        return nextUserColor;
+    }
+
+    /**
+     * Generates a Icon
+     *
+     * @param userColor selected user color
+     * @param tableIdx tabled index
+     * @param size size of the image
+     * @return a image icon that shows the
+     */
+    public static ImageIcon getColorMapImageIcon(Color userColor, int tableIdx, int size) {
+        return new ImageIcon(createImageGradientMap(size, size, selectColorMap(userColor, tableIdx)));
+    }
+
+    /**
+     * Draw gray heat map with current Graphics2D setting
+     * @param gB              the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param listSegm        segments visible in the current scope of mv
+     * @param foreComp        composite use to draw foreground objects
+     * @param foreStroke      stroke use to draw foreground objects
+     * @param backComp        composite use to draw background objects
+     * @param backStroke      stroke use to draw background objects
+     */
+    private void drawHeatGrayMap(Graphics2D gB, MapView mv, List<WayPoint> listSegm,
+                                 Composite foreComp, Stroke foreStroke,
+                                 Composite backComp, Stroke backStroke) {
+
+        // draw foreground
+        boolean drawForeground = foreComp != null && foreStroke != null;
+
+        // set initial values
+        gB.setStroke(backStroke); gB.setComposite(backComp);
+
+        // get last point in list
+        final WayPoint lastPnt = !listSegm.isEmpty() ? listSegm.get(listSegm.size() - 1) : null;
+
+        // for all points, draw single lines by using optimized drawing
+        for (WayPoint trkPnt : listSegm) {
+
+            // get transformed coordinates
+            final Point paintPnt = mv.getPoint(trkPnt.getEastNorth());
+
+            // end of line segment or end of list reached
+            if (!trkPnt.drawLine || (lastPnt == trkPnt)) {
+
+                // convert to primitive type
+                final int[] polyXArr = heatMapPolyX.stream().mapToInt(Integer::intValue).toArray();
+                final int[] polyYArr = heatMapPolyY.stream().mapToInt(Integer::intValue).toArray();
+
+                // a.) draw background
+                gB.drawPolyline(polyXArr, polyYArr, polyXArr.length);
+
+                // b.) draw extra foreground
+                if (drawForeground && heatMapDrawExtraLine) {
+
+                    gB.setStroke(foreStroke); gB.setComposite(foreComp);
+                    gB.drawPolyline(polyXArr, polyYArr, polyXArr.length);
+                    gB.setStroke(backStroke); gB.setComposite(backComp);
+                }
+
+                // drop used points
+                heatMapPolyX.clear(); heatMapPolyY.clear();
+            }
+
+            // store only the integer part (make sense because pixel is 1:1 here)
+            heatMapPolyX.add((int) paintPnt.getX());
+            heatMapPolyY.add((int) paintPnt.getY());
+        }
+    }
+
+    /**
+     * Map the gray map to heat map and draw them with current Graphics2D setting
+     * @param g               the common draw object to use
+     * @param imgGray         gray scale input image
+     * @param sampleRaster    the line with for drawing
+     * @param outlineWidth     line width for outlines
+     */
+    private void drawHeatMapGrayMap(Graphics2D g, BufferedImage imgGray, int sampleRaster, int outlineWidth) {
+
+        final int[] imgPixels = ((DataBufferInt) imgGray.getRaster().getDataBuffer()).getData();
+
+        // samples offset and bounds are scaled with line width derived from zoom level
+        final int offX = Math.max(1, sampleRaster);
+        final int offY = Math.max(1, sampleRaster);
+
+        final int maxPixelX = imgGray.getWidth();
+        final int maxPixelY = imgGray.getHeight();
+
+        // always full or outlines at big samples rasters
+        final boolean drawOutlines = (outlineWidth > 0) && ((0 == sampleRaster) || (sampleRaster > 8));
+
+        // backup stroke
+        final Stroke oldStroke = g.getStroke();
+
+        // use basic stroke for outlines and default transparency
+        g.setStroke(new BasicStroke(outlineWidth));
+
+        int lastPixelX = 0;
+        int lastPixelColor = 0;
+
+        // resample gray scale image with line linear weight of next sample in line
+        // process each line and draw pixels / rectangles with same color with one operations
+        for (int y = 0; y < maxPixelY; y += offY) {
+
+            // the lines offsets
+            final int lastLineOffset = maxPixelX * (y+0);
+            final int nextLineOffset = maxPixelX * (y+1);
+
+            for (int x = 0; x < maxPixelX; x += offX) {
+
+                int thePixelColor = 0; int thePixelCount = 0;
+
+                // sample the image (it is gray scale)
+                int offset = lastLineOffset + x;
+
+                // merge next pixels of window of line
+                for (int k = 0; k < offX && (offset + k) < nextLineOffset; k++) {
+                    thePixelColor += imgPixels[offset+k] & 0xFF;
+                    thePixelCount++;
+                }
+
+                // mean value
+                thePixelColor = thePixelCount > 0 ? (thePixelColor / thePixelCount) : 0;
+
+                // restart -> use initial sample
+                if (0 == x) {
+                    lastPixelX = 0; lastPixelColor = thePixelColor - 1;
+                }
+
+                boolean bDrawIt = false;
+
+                // when one of segment is mapped to black
+                bDrawIt = bDrawIt || (lastPixelColor == 0) || (thePixelColor == 0);
+
+                // different color
+                bDrawIt = bDrawIt || (Math.abs(lastPixelColor-thePixelColor) > 0);
+
+                // when line is finished draw always
+                bDrawIt = bDrawIt || (y >= (maxPixelY-offY));
+
+                if (bDrawIt) {
+
+                    // draw only foreground pixels
+                    if (lastPixelColor > 0) {
+
+                        // gray to RGB mapping
+                        g.setColor(heatMapLutColor[ lastPixelColor ]);
+
+                        // box from from last Y pixel to current pixel
+                        if (drawOutlines) {
+                            g.drawRect(lastPixelX, y, offX + x - lastPixelX, offY);
+                        } else {
+                            g.fillRect(lastPixelX, y, offX + x - lastPixelX, offY);
+                        }
+                    }
+
+                    // restart detection
+                    lastPixelX = x; lastPixelColor = thePixelColor;
+                }
+            }
+        }
+
+        // recover
+        g.setStroke(oldStroke);
+    }
+
+    /**
+     * Collect and draw GPS segments and displays a heat-map
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     * @param visibleSegments segments visible in the current scope of mv
+     */
+    private void drawHeatMap(Graphics2D g, MapView mv, List<WayPoint> visibleSegments) {
+
+        // get bounds of screen image and projection, zoom and adjust input parameters
+        final Rectangle screenBounds = new Rectangle(mv.getWidth(), mv.getHeight());
+        final MapViewState mapViewState = mv.getState();
+        final double zoomScale = mv.getDist100Pixel() / 50.0f;
+
+        // adjust global settings ( zero = default line width )
+        final int globalLineWidth = (0 == lineWidth) ? 1 : Math.min(Math.max(lineWidth, 1), 20);
+
+        // 1st setup virtual paint area ----------------------------------------
+
+        // new image buffer needed
+        final boolean imageSetup = null == heatMapImgGray || !heatMapCacheScreenBounds.equals(screenBounds);
+
+        // screen bounds changed, need new image buffer ?
+        if (imageSetup) {
+            // we would use a "pure" grayscale image, but there is not efficient way to map gray scale values to RGB)
+            heatMapImgGray = new BufferedImage(screenBounds.width, screenBounds.height, BufferedImage.TYPE_INT_ARGB);
+            heatMapGraph2d = heatMapImgGray.createGraphics();
+            heatMapGraph2d.setBackground(new Color(0, 0, 0, 255));
+            heatMapGraph2d.setColor(Color.WHITE);
+
+            // cache it
+            heatMapCacheScreenBounds = screenBounds;
+        }
+
+        // 2nd. determine current scale factors -------------------------------
+
+        // the line width (foreground: draw extra small footprint line of track)
+        final int lineWidthB = (int) Math.max(1.5f * (globalLineWidth / zoomScale) + 1, 2);
+        final int lineWidthF = lineWidthB > 2 ? (globalLineWidth - 1) : 0;
+
+        // recalculation of image needed
+        final boolean imageRecalc = !mapViewState.equalsInWindow(heatMapMapViewState) ||
+                                    heatMapCacheLineWith != globalLineWidth;
+
+        // 3rd Calculate the heat map data by draw GPX traces with alpha value ----------
+
+        // need re-generation of gray image ?
+        if (imageSetup || imageRecalc) {
+
+            // clear background
+            heatMapGraph2d.clearRect(0, 0, heatMapImgGray.getWidth(), heatMapImgGray.getHeight());
+
+            // alpha combines both values, therefore the foreground shall be lighter
+            final float lineAlphaB = Math.min(Math.max((0.40f/(float) zoomScale)/(globalLineWidth + 1), 0.01f), 0.40f);
+            final float lineAlphaF = lineAlphaB / 1.5f;
+
+            // derive draw parameters and draw
+            drawHeatGrayMap(heatMapGraph2d, mv, visibleSegments,
+                            lineWidthF > 1 ? AlphaComposite.SrcOver.derive(lineAlphaF) : null,
+                            new BasicStroke(lineWidthF, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND),
+                            AlphaComposite.SrcOver.derive(lineAlphaB),
+                            new BasicStroke(lineWidthB, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+
+            // remember draw parameters
+            heatMapMapViewState = mapViewState;
+            heatMapCacheLineWith = globalLineWidth;
+        }
+
+        // 4th. Draw data on target layer, map data via color lookup table --------------
+        drawHeatMapGrayMap(g, heatMapImgGray, lineWidthB > 2 ? (lineWidthB / 2) : 1, lineWidth > 2 ? (lineWidth - 2) : 1);
+    }
+
+    /**
+     * Apply default color configuration to way segments
+     * @param visibleSegments segments visible in the current scope of mv
+     */
     private void fixColors(List<WayPoint> visibleSegments) {
         for (WayPoint trkPnt : visibleSegments) {
             if (trkPnt.customColoring == null) {
@@ -562,24 +1200,41 @@ public class GpxDrawHelper implements SoMChangeListener {
      * Check cache validity set necessary flags
      */
     private void checkCache() {
-        if ((computeCacheMaxLineLengthUsed != maxLineLength) || (!neutralColor.equals(computeCacheColorUsed))
-                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune)
-                || (computeCacheColorDynamic != colorModeDynamic)) {
+        if ((computeCacheMaxLineLengthUsed != maxLineLength)
+                || (computeCacheColored != colored)
+                || (computeCacheColorTracksTune != colorTracksTune)
+                || (computeCacheColorDynamic != colorModeDynamic)
+                || (computeCacheHeatMapDrawColorTableIdx != heatMapDrawColorTableIdx)
+                || (!neutralColor.equals(computeCacheColorUsed))
+      ) {
             computeCacheMaxLineLengthUsed = maxLineLength;
             computeCacheInSync = false;
             computeCacheColorUsed = neutralColor;
             computeCacheColored = colored;
             computeCacheColorTracksTune = colorTracksTune;
             computeCacheColorDynamic = colorModeDynamic;
+            computeCacheHeatMapDrawColorTableIdx = heatMapDrawColorTableIdx;
         }
     }
 
+    /**
+     *  callback when data is changed, invalidate cached configuration parameters
+     */
     public void dataChanged() {
         computeCacheInSync = false;
     }
 
+    /**
+     * Draw all GPX arrays
+     * @param g               the common draw object to use
+     * @param mv              the meta data to current displayed area
+     */
     public void drawColorBar(Graphics2D g, MapView mv) {
         int w = mv.getWidth();
+
+        // set do default
+        g.setComposite(AlphaComposite.SrcOver.derive(1.00f));
+
         if (colored == ColorMode.HDOP) {
             hdopScale.drawColorBar(g, w-30, 50, 20, 100, 1.0);
         } else if (colored == ColorMode.VELOCITY) {
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
index 77b7292..c03f1ab 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
@@ -165,7 +165,7 @@ public class ImportAudioAction extends AbstractAction {
         }
 
         // (a) try explicit timestamped waypoints - unless suppressed
-        if (Main.pref.getBoolean("marker.audiofromexplicitwaypoints", true) && hasWaypoints) {
+        if (hasWaypoints && Main.pref.getBoolean("marker.audiofromexplicitwaypoints", true)) {
             for (WayPoint w : layer.data.waypoints) {
                 if (w.time > firstTime) {
                     waypoints.add(w);
@@ -176,7 +176,7 @@ public class ImportAudioAction extends AbstractAction {
         }
 
         // (b) try explicit waypoints without timestamps - unless suppressed
-        if (Main.pref.getBoolean("marker.audiofromuntimedwaypoints", true) && hasWaypoints) {
+        if (hasWaypoints && Main.pref.getBoolean("marker.audiofromuntimedwaypoints", true)) {
             for (WayPoint w : layer.data.waypoints) {
                 if (waypoints.contains(w)) {
                     continue;
@@ -196,7 +196,7 @@ public class ImportAudioAction extends AbstractAction {
         }
 
         // (c) use explicitly named track points, again unless suppressed
-        if ((Main.pref.getBoolean("marker.audiofromnamedtrackpoints", false)) && layer.data.tracks != null
+        if (layer.data.tracks != null && Main.pref.getBoolean("marker.audiofromnamedtrackpoints", false)
                 && !layer.data.tracks.isEmpty()) {
             for (GpxTrack track : layer.data.tracks) {
                 for (GpxTrackSegment seg : track.getSegments()) {
@@ -210,7 +210,7 @@ public class ImportAudioAction extends AbstractAction {
         }
 
         // (d) use timestamp of file as location on track
-        if ((Main.pref.getBoolean("marker.audiofromwavtimestamps", false)) && hasTracks) {
+        if (hasTracks && Main.pref.getBoolean("marker.audiofromwavtimestamps", false)) {
             double lastModified = wavFile.lastModified() / 1000.0; // lastModified is in
             // milliseconds
             double duration = AudioUtil.getCalibratedDuration(wavFile);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
index 0ca4915..bc3be5c 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
@@ -462,6 +462,15 @@ public class ElemStyles implements PreferenceChangedListener {
     }
 
     /**
+     * remove a style source; only accessed from MapPaintStyles
+     * @param style style source to remove
+     * @return {@code true} if this list contained the specified element
+     */
+    boolean remove(StyleSource style) {
+        return styleSources.remove(style);
+    }
+
+    /**
      * set the style sources; only accessed from MapPaintStyles
      * @param sources new style sources
      */
diff --git a/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java b/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
index 2eb50ed..c22a1eb 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
@@ -289,6 +289,9 @@ public final class MapPaintStyles {
     }
 
     private static StyleSource fromSourceEntry(SourceEntry entry) {
+        if (entry.url == null && entry instanceof MapCSSStyleSource) {
+            return (MapCSSStyleSource) entry;
+        }
         Set<String> mimes = new HashSet<>(Arrays.asList(MapCSSStyleSource.MAPCSS_STYLE_MIME_TYPES.split(", ")));
         try (CachedFile cf = new CachedFile(entry.url).setHttpAccept(Utils.join(", ", mimes))) {
             String zipEntryPath = cf.findZipEntryPath("mapcss", "style");
@@ -418,13 +421,29 @@ public final class MapPaintStyles {
         StyleSource source = fromSourceEntry(entry);
         styles.add(source);
         loadStyleForFirstTime(source);
+        refreshStyles();
+        return source;
+    }
+
+    /**
+     * Remove a map paint style.
+     * @param entry map paint style
+     * @since 11493
+     */
+    public static void removeStyle(SourceEntry entry) {
+        StyleSource source = fromSourceEntry(entry);
+        if (styles.remove(source)) {
+            refreshStyles();
+        }
+    }
+
+    private static void refreshStyles() {
         MapPaintPrefHelper.INSTANCE.put(styles.getStyleSources());
         fireMapPaintSylesUpdated();
         styles.clearCached();
         if (Main.isDisplayingMapView()) {
             Main.map.mapView.repaint();
         }
-        return source;
     }
 
     /***********************************
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java
index e6b6df3..f0e61cd 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactory.java
@@ -196,7 +196,7 @@ public final class ConditionFactory {
                 try {
                     testFloat = Float.parseFloat(test);
                 } catch (NumberFormatException e) {
-                    return false;
+                    return Boolean.FALSE;
                 }
                 float prototypeFloat = Float.parseFloat(prototype);
 
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
index 7a7082e..1d5d21a 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj
@@ -71,7 +71,7 @@ public class MapCSSParser {
         /** the main parser */
         DEFAULT(2);
 
-        int idx; // the integer, which javacc assigns to this state
+        final int idx; // the integer, which javacc assigns to this state
 
         LexicalState(int idx) {
             if (!this.name().equals(MapCSSParserTokenManager.lexStateNames[idx])) {
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
index f0bc15c..043887c 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
@@ -281,11 +281,11 @@ public class BoxTextElement extends StyleElement {
         if (obj == null || getClass() != obj.getClass()) return false;
         if (!super.equals(obj)) return false;
         BoxTextElement that = (BoxTextElement) obj;
-        return Objects.equals(text, that.text) &&
-                Objects.equals(boxProvider, that.boxProvider) &&
-                Objects.equals(box, that.box) &&
-                hAlign == that.hAlign &&
-                vAlign == that.vAlign;
+        return hAlign == that.hAlign &&
+               vAlign == that.vAlign &&
+               Objects.equals(text, that.text) &&
+               Objects.equals(boxProvider, that.boxProvider) &&
+               Objects.equals(box, that.box);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
index 4b024bc..3446fff 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
@@ -159,13 +159,13 @@ public class LineElement extends StyleElement {
         if (!super.equals(obj))
             return false;
         final LineElement other = (LineElement) obj;
-        return Objects.equals(line, other.line) &&
-            Objects.equals(color, other.color) &&
-            Objects.equals(dashesLine, other.dashesLine) &&
-            Objects.equals(dashesBackground, other.dashesBackground) &&
-            offset == other.offset &&
-            realWidth == other.realWidth &&
-            wayDirectionArrows == other.wayDirectionArrows;
+        return offset == other.offset &&
+               realWidth == other.realWidth &&
+               wayDirectionArrows == other.wayDirectionArrows &&
+               Objects.equals(line, other.line) &&
+               Objects.equals(color, other.color) &&
+               Objects.equals(dashesLine, other.dashesLine) &&
+               Objects.equals(dashesBackground, other.dashesBackground);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
index f8bc114..fc4dfb0 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
@@ -95,11 +95,11 @@ public class RepeatImageElement extends StyleElement {
         if (obj == null || getClass() != obj.getClass()) return false;
         if (!super.equals(obj)) return false;
         RepeatImageElement that = (RepeatImageElement) obj;
-        return Float.compare(that.offset, offset) == 0 &&
-                Float.compare(that.spacing, spacing) == 0 &&
-                Float.compare(that.phase, phase) == 0 &&
-                Objects.equals(pattern, that.pattern) &&
-                align == that.align;
+        return align == that.align &&
+               Float.compare(that.offset, offset) == 0 &&
+               Float.compare(that.spacing, spacing) == 0 &&
+               Float.compare(that.phase, phase) == 0 &&
+               Objects.equals(pattern, that.pattern);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
index e60d028..4349e3c 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
@@ -198,10 +198,10 @@ public abstract class StyleElement implements StyleKeys {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         StyleElement that = (StyleElement) o;
-        return Float.compare(that.majorZIndex, majorZIndex) == 0 &&
-                Float.compare(that.zIndex, zIndex) == 0 &&
-                Float.compare(that.objectZIndex, objectZIndex) == 0 &&
-                isModifier == that.isModifier;
+        return isModifier == that.isModifier &&
+               Float.compare(that.majorZIndex, majorZIndex) == 0 &&
+               Float.compare(that.zIndex, zIndex) == 0 &&
+               Float.compare(that.objectZIndex, objectZIndex) == 0;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
index 65c734b..2395d93 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
@@ -964,7 +964,7 @@ public abstract class SourceEditor extends JPanel {
         }
 
         private void updateOkButtonState() {
-            buttons.get(0).setEnabled(!Utils.strip(tfURL.getText()).isEmpty());
+            buttons.get(0).setEnabled(!Utils.isStripEmpty(tfURL.getText()));
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
index 7589941..3dcb69d 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
@@ -4,7 +4,9 @@ package org.openstreetmap.josm.gui.preferences.display;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trc;
 
+import java.awt.Color;
 import java.awt.Component;
+import java.awt.Dimension;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionListener;
 
@@ -19,6 +21,7 @@ import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.gui.layer.gpx.GpxDrawHelper;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
 import org.openstreetmap.josm.gui.layer.markerlayer.Marker.TemplateEntryProperty;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
@@ -55,9 +58,16 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
     private final JRadioButton colorTypeDirection = new JRadioButton(tr("Direction (red = west, yellow = north, green = east, blue = south)"));
     private final JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)"));
     private final JRadioButton colorTypeTime = new JRadioButton(tr("Track date"));
+    private final JRadioButton colorTypeHeatMap = new JRadioButton(tr("Heat Map (dark = few, bright = many)"));
     private final JRadioButton colorTypeNone = new JRadioButton(tr("Single Color (can be customized for named layers)"));
     private final JRadioButton colorTypeGlobal = new JRadioButton(tr("Use global settings"));
     private final JosmComboBox<String> colorTypeVelocityTune = new JosmComboBox<>(new String[] {tr("Car"), tr("Bicycle"), tr("Foot")});
+    private final JosmComboBox<String> colorTypeHeatMapTune = new JosmComboBox<>(new String[] {
+        trc("Heat map", "User"),
+        trc("Heat map", "Inferno"),
+        trc("Heat map", "Viridis"),
+        trc("Heat map", "Wood"),
+        trc("Heat map", "Heat")});
     private final JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX"));
     private final JCheckBox drawGpsArrows = new JCheckBox(tr("Draw Direction Arrows"));
     private final JCheckBox drawGpsArrowsFast = new JCheckBox(tr("Fast drawing (looks uglier)"));
@@ -68,6 +78,7 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
     private final JosmComboBox<String> audioWaypointLabel = new JosmComboBox<>(LABEL_PATTERN_DESC);
     private final JosmTextField audioWaypointLabelPattern = new JosmTextField();
     private final JCheckBox useGpsAntialiasing = new JCheckBox(tr("Smooth GPX graphics (antialiasing)"));
+    private final JCheckBox drawLineWithAlpha = new JCheckBox(tr("Draw with Opacity (alpha blending) "));
 
     private String layerName;
     private final boolean local; // flag to display LocalOnly checkbox
@@ -179,16 +190,16 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
             drawGpsArrowsMinDist.setEnabled(drawGpsArrows.isSelected() && drawGpsArrows.isEnabled());
         });
         drawGpsArrows.setToolTipText(tr("Draw direction arrows for lines, connecting GPS points."));
-        add(drawGpsArrows, GBC.eop().insets(40, 0, 0, 0));
+        add(drawGpsArrows, GBC.eop().insets(20, 0, 0, 0));
 
         // drawGpsArrowsFast
         drawGpsArrowsFast.setToolTipText(tr("Draw the direction arrows using table lookups instead of complex math."));
-        add(drawGpsArrowsFast, GBC.eop().insets(60, 0, 0, 0));
+        add(drawGpsArrowsFast, GBC.eop().insets(40, 0, 0, 0));
         ExpertToggleAction.addVisibilitySwitcher(drawGpsArrowsFast);
 
         // drawGpsArrowsMinDist
         drawGpsArrowsMinDist.setToolTipText(tr("Do not draw arrows if they are not at least this distance away from the last one."));
-        add(new JLabel(tr("Minimum distance (pixels)")), GBC.std().insets(60, 0, 0, 0));
+        add(new JLabel(tr("Minimum distance (pixels)")), GBC.std().insets(40, 0, 0, 0));
         add(drawGpsArrowsMinDist, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
 
         // hdopCircleGpsPoints
@@ -210,6 +221,11 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         add(useGpsAntialiasing, GBC.eop().insets(20, 0, 0, 0));
         ExpertToggleAction.addVisibilitySwitcher(useGpsAntialiasing);
 
+        // alpha blending
+        drawLineWithAlpha.setToolTipText(tr("Apply dynamic alpha-blending and adjust width based on zoom level for all GPX lines."));
+        add(drawLineWithAlpha, GBC.eop().insets(20, 0, 0, 0));
+        ExpertToggleAction.addVisibilitySwitcher(drawLineWithAlpha);
+
         // colorTracks
         ButtonGroup colorGroup = new ButtonGroup();
         if (layerName != null) {
@@ -220,11 +236,18 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         colorGroup.add(colorTypeDirection);
         colorGroup.add(colorTypeDilution);
         colorGroup.add(colorTypeTime);
+        colorGroup.add(colorTypeHeatMap);
 
         colorTypeVelocity.addChangeListener(e -> {
             colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected());
             colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
         });
+
+        colorTypeHeatMap.addChangeListener(e -> {
+            colorTypeHeatMapTune.setEnabled(colorTypeHeatMap.isSelected());
+            colorDynamic.setEnabled(false);
+        });
+
         colorTypeDilution.addChangeListener(e -> colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected()));
 
         colorTypeNone.setToolTipText(tr("All points and track segments will have the same color. Can be customized in Layer Manager."));
@@ -233,10 +256,14 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         colorTypeDilution.setToolTipText(
                 tr("Colors points and track segments by dilution of position (HDOP). Your capture device needs to log that information."));
         colorTypeTime.setToolTipText(tr("Colors points and track segments by its timestamp."));
+        colorTypeHeatMap.setToolTipText(tr("Collected points and track segments for a position and displayed as heat map."));
 
         // color Tracks by Velocity Tune
         colorTypeVelocityTune.setToolTipText(tr("Allows to tune the track coloring for different average speeds."));
 
+        colorTypeHeatMapTune.setToolTipText(tr("Selects the color schema for heat map."));
+        JLabel colorTypeHeatIconLabel = new JLabel();
+
         add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0));
 
         add(new JLabel(tr("Track and Point Coloring")), GBC.eol().insets(20, 0, 0, 0));
@@ -245,10 +272,30 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         }
         add(colorTypeNone, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeVelocity, GBC.std().insets(40, 0, 0, 0));
-        add(colorTypeVelocityTune, GBC.eop().insets(5, 0, 0, 5));
+        add(colorTypeVelocityTune, GBC.eop().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
         add(colorTypeDirection, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeDilution, GBC.eol().insets(40, 0, 0, 0));
         add(colorTypeTime, GBC.eol().insets(40, 0, 0, 0));
+        add(colorTypeHeatMap, GBC.std().insets(40, 0, 0, 0));
+        add(colorTypeHeatIconLabel, GBC.std().insets(5, 0, 0, 5));
+        add(colorTypeHeatMapTune, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 0, 0, 5));
+
+        colorTypeHeatMapTune.addPropertyChangeListener(e -> {
+            final Dimension dim = colorTypeHeatMapTune.getPreferredSize();
+            if (null != dim) {
+                // get image size of environment
+                final int iconSize = (int) dim.getHeight();
+                final Color color;
+                // ask the GPX draw for the correct color of that layer ( if there is one )
+                if (null != layerName) {
+                    color = GpxDrawHelper.DEFAULT_COLOR.getChildColor(layerName).get();
+                } else {
+                    color = GpxDrawHelper.DEFAULT_COLOR.getDefaultValue();
+                }
+                colorTypeHeatIconLabel.setIcon(GpxDrawHelper.getColorMapImageIcon(color, colorTypeHeatMapTune.getSelectedIndex(), iconSize));
+            }
+        });
+
         ExpertToggleAction.addVisibilitySwitcher(colorTypeDirection);
         ExpertToggleAction.addVisibilitySwitcher(colorTypeDilution);
 
@@ -315,6 +362,7 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         drawRawGpsMaxLineLengthLocal.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length.local", layerName, -1)));
         drawRawGpsMaxLineLength.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.max-line-length", layerName, 200)));
         drawLineWidth.setText(Integer.toString(Main.pref.getInteger("draw.rawgps.linewidth", layerName, 0)));
+        drawLineWithAlpha.setSelected(Main.pref.getBoolean("draw.rawgps.lines.alpha-blend", layerName, false));
         forceRawGpsLines.setSelected(Main.pref.getBoolean("draw.rawgps.lines.force", layerName, false));
         drawGpsArrows.setSelected(Main.pref.getBoolean("draw.rawgps.direction", layerName, false));
         drawGpsArrowsFast.setSelected(Main.pref.getBoolean("draw.rawgps.alternatedirection", layerName, false));
@@ -322,6 +370,7 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         hdopCircleGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.hdopcircle", layerName, false));
         largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large", layerName, false));
         useGpsAntialiasing.setSelected(Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false));
+
         drawRawGpsLinesActionListener.actionPerformed(null);
 
         if (layerName != null && Main.pref.get("draw.rawgps.colors."+layerName).isEmpty()) {
@@ -336,11 +385,16 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
             case 2: colorTypeDilution.setSelected(true); break;
             case 3: colorTypeDirection.setSelected(true); break;
             case 4: colorTypeTime.setSelected(true); break;
+            case 5: colorTypeHeatMap.setSelected(true); break;
             default: Main.warn("Unknown color type: " + colorType);
             }
             int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", layerName, 45);
             colorTypeVelocityTune.setSelectedIndex(ccts == 10 ? 2 : (ccts == 20 ? 1 : 0));
             colorTypeVelocityTune.setEnabled(colorTypeVelocity.isSelected() && colorTypeVelocity.isEnabled());
+
+            colorTypeHeatMapTune.setSelectedIndex(Main.pref.getInteger("draw.rawgps.heatmap.colormap", layerName, 0));
+            colorTypeHeatMapTune.setEnabled(colorTypeHeatMap.isSelected() && colorTypeHeatMap.isEnabled());
+
             colorDynamic.setSelected(Main.pref.getBoolean("draw.rawgps.colors.dynamic", layerName, false));
             colorDynamic.setEnabled(colorTypeVelocity.isSelected() || colorTypeDilution.isSelected());
         }
@@ -385,6 +439,8 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         Main.pref.put("draw.rawgps.hdopcircle"+layerNameDot, hdopCircleGpsPoints.isSelected());
         Main.pref.put("draw.rawgps.large"+layerNameDot, largeGpsPoints.isSelected());
         Main.pref.put("draw.rawgps.linewidth"+layerNameDot, drawLineWidth.getText());
+        Main.pref.put("draw.rawgps.lines.alpha-blend"+layerNameDot, drawLineWithAlpha.isSelected());
+
         Main.pref.put("mappaint.gpx.use-antialiasing", useGpsAntialiasing.isSelected());
 
         TemplateEntryProperty.forMarker(layerName).put(waypointLabelPattern.getText());
@@ -403,12 +459,17 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
             Main.pref.putInteger("draw.rawgps.colors"+layerNameDot, 3);
         } else if (colorTypeTime.isSelected()) {
             Main.pref.putInteger("draw.rawgps.colors"+layerNameDot, 4);
+        } else if (colorTypeHeatMap.isSelected()) {
+            Main.pref.putInteger("draw.rawgps.colors"+layerNameDot, 5);
         } else {
             Main.pref.putInteger("draw.rawgps.colors"+layerNameDot, 0);
         }
         Main.pref.put("draw.rawgps.colors.dynamic"+layerNameDot, colorDynamic.isSelected());
         int ccti = colorTypeVelocityTune.getSelectedIndex();
         Main.pref.putInteger("draw.rawgps.colorTracksTune"+layerNameDot, ccti == 2 ? 10 : (ccti == 1 ? 20 : 45));
+
+        Main.pref.putInteger("draw.rawgps.heatmap.colormap"+layerNameDot, colorTypeHeatMapTune.getSelectedIndex());
+
         return false;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
index e3be631..fe6cfd5 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/WMSSettingsPanel.java
@@ -12,7 +12,7 @@ import javax.swing.JPanel;
 import javax.swing.JSpinner;
 import javax.swing.SpinnerNumberModel;
 
-import org.openstreetmap.josm.data.imagery.WMSCachedTileLoaderJob;
+import org.openstreetmap.josm.data.imagery.WMSCachedTileLoader;
 import org.openstreetmap.josm.gui.layer.WMSLayer;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Utils;
@@ -48,7 +48,7 @@ public class WMSSettingsPanel extends JPanel {
         // Simultaneous connections
         add(Box.createHorizontalGlue(), GBC.eol().fill(GBC.HORIZONTAL));
         JLabel labelSimConn = new JLabel(tr("Simultaneous connections:"));
-        int threadLimitValue = Utils.clamp(WMSCachedTileLoaderJob.THREAD_LIMIT.get(), THREADS_MIN, THREADS_MAX);
+        int threadLimitValue = Utils.clamp(WMSCachedTileLoader.THREAD_LIMIT.get(), THREADS_MIN, THREADS_MAX);
         spinSimConn = new JSpinner(new SpinnerNumberModel(threadLimitValue, THREADS_MIN, THREADS_MAX, 1));
         labelSimConn.setLabelFor(spinSimConn);
         add(labelSimConn, GBC.std());
@@ -70,7 +70,7 @@ public class WMSSettingsPanel extends JPanel {
      */
     public void loadSettings() {
         this.autozoomActive.setSelected(WMSLayer.PROP_DEFAULT_AUTOZOOM.get());
-        this.spinSimConn.setValue(WMSCachedTileLoaderJob.THREAD_LIMIT.get());
+        this.spinSimConn.setValue(WMSCachedTileLoader.THREAD_LIMIT.get());
         this.tileSize.setValue(WMSLayer.PROP_IMAGE_SIZE.get());
     }
 
@@ -80,7 +80,7 @@ public class WMSSettingsPanel extends JPanel {
      */
     public boolean saveSettings() {
         WMSLayer.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
-        WMSCachedTileLoaderJob.THREAD_LIMIT.put((Integer) spinSimConn.getModel().getValue());
+        WMSCachedTileLoader.THREAD_LIMIT.put((Integer) spinSimConn.getModel().getValue());
         WMSLayer.PROP_IMAGE_SIZE.put((Integer) this.tileSize.getModel().getValue());
 
         return false;
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
index 030886d..cc918a6 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
@@ -271,7 +271,7 @@ public class MapPaintPreference implements SubPreferenceSetting {
         @Override
         public Map<String, String> serialize(SourceEntry entry) {
             Map<String, String> res = new HashMap<>();
-            res.put("url", entry.url);
+            res.put("url", entry.url == null ? "" : entry.url);
             res.put("title", entry.title == null ? "" : entry.title);
             res.put("active", Boolean.toString(entry.active));
             if (entry.name != null) {
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
index 5df8809..ea6a526 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
@@ -35,7 +35,8 @@ public class PluginUpdatePolicyPanel extends JPanel {
         ALWAYS("always"),
         NEVER("never");
 
-        private String preferenceValue;
+        private final String preferenceValue;
+
         Policy(String preferenceValue) {
             this.preferenceValue = preferenceValue;
         }
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
index 895792c..0aefc50 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
@@ -65,7 +65,8 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
         /** Use HTTP proxy: JOSM will use the given SOCKS proxy */
         USE_SOCKS_PROXY("use-socks-proxy");
 
-        private String policyName;
+        private final String policyName;
+
         ProxyPolicy(String policyName) {
             this.policyName = policyName;
         }
diff --git a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
index 0fec938..e0b2b88 100644
--- a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
+++ b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionManager.java
@@ -93,9 +93,9 @@ public class AutoCompletionManager implements DataSetListener {
                 return false;
             }
             final UserInputTag other = (UserInputTag) obj;
-            return Objects.equals(this.key, other.key)
-                && Objects.equals(this.value, other.value)
-                && this.defaultKey == other.defaultKey;
+            return this.defaultKey == other.defaultKey
+                && Objects.equals(this.key, other.key)
+                && Objects.equals(this.value, other.value);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java b/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java
index 0926d4d..718f906 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java
@@ -91,7 +91,7 @@ public class Check extends KeyedItem {
     @Override
     public void addCommands(List<Tag> changedTags) {
         // if the user hasn't changed anything, don't create a command.
-        if (check.getState() == initialState && def == null) return;
+        if (def == null && check.getState() == initialState) return;
 
         // otherwise change things according to the selected value.
         changedTags.add(new Tag(key,
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java b/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
index 3108e4a..83d23ad 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
@@ -84,7 +84,7 @@ public class Combo extends ComboMultiSelect {
         } else if (usage.unused()) {
             // all items were unset (and so is default)
             originalValue = lhm.get("");
-            if ("force".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
+            if (!presetInitiallyMatches && "force".equals(use_last_as_default) && LAST_VALUES.containsKey(key)) {
                 combobox.setSelectedItem(lhm.get(LAST_VALUES.get(key)));
             } else {
                 combobox.setSelectedItem(originalValue);
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java b/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
index 73d088f..202160e 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
@@ -491,7 +491,7 @@ public abstract class ComboMultiSelect extends KeyedItem {
             entries.add(e);
         }
 
-        if (Main.pref.getBoolean("taggingpreset.sortvalues", true) && values_sort) {
+        if (values_sort && Main.pref.getBoolean("taggingpreset.sortvalues", true)) {
             Collections.sort(entries);
         }
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java b/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
index b7a12d2..6eb5ae7 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
@@ -87,7 +87,7 @@ public class Text extends KeyedItem {
                 }
             } else if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
                 // selected osm primitives are untagged or filling default values feature is enabled
-                if (!"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key) && !presetInitiallyMatches) {
+                if (!presetInitiallyMatches && !"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key)) {
                     textField.setText(LAST_VALUES.get(key));
                 } else {
                     textField.setText(default_);
diff --git a/src/org/openstreetmap/josm/gui/widgets/JMultilineLabel.java b/src/org/openstreetmap/josm/gui/widgets/JMultilineLabel.java
index c576640..260f455 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JMultilineLabel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JMultilineLabel.java
@@ -65,15 +65,13 @@ public class JMultilineLabel extends JEditorPane {
     }
 
     /**
-     * Tries to determine a suitable height for the given contents and return
-     * that dimension.
+     * Tries to determine a suitable height for the given contents and return that dimension.
      */
     @Override
     public Dimension getPreferredSize() {
-        // Without this check it will result in an infinite loop calling
-        // getPreferredSize. Remember the old bounds and only recalculate if
-        // the size actually changed.
-        if (this.getBounds().equals(oldbounds) && oldPreferred != null) {
+        // Without this check it will result in an infinite loop calling getPreferredSize.
+        // Remember the old bounds and only recalculate if the size actually changed.
+        if (oldPreferred != null && this.getBounds().equals(oldbounds)) {
             return oldPreferred;
         }
         oldbounds = this.getBounds();
diff --git a/src/org/openstreetmap/josm/gui/widgets/VerticallyScrollablePanel.java b/src/org/openstreetmap/josm/gui/widgets/VerticallyScrollablePanel.java
index 2b3a393..f9b05e8 100644
--- a/src/org/openstreetmap/josm/gui/widgets/VerticallyScrollablePanel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/VerticallyScrollablePanel.java
@@ -47,7 +47,7 @@ public class VerticallyScrollablePanel extends JPanel implements Scrollable {
     }
 
     @Override
-    public int getScrollableBlockIncrement(Rectangle arg0, int arg1, int arg2) {
+    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
         return 20;
     }
 
diff --git a/src/org/openstreetmap/josm/io/CacheCustomContent.java b/src/org/openstreetmap/josm/io/CacheCustomContent.java
index ce43219..938c202 100644
--- a/src/org/openstreetmap/josm/io/CacheCustomContent.java
+++ b/src/org/openstreetmap/josm/io/CacheCustomContent.java
@@ -102,9 +102,11 @@ public abstract class CacheCustomContent<T extends Throwable> {
         }
     }
 
-    protected void checkOfflineAccess() {
-        // To be overriden by subclasses
-    }
+    /**
+     * Ensures underlying resource is not accessed in offline mode.
+     * @throws OfflineAccessException if resource is accessed in offline mode
+     */
+    protected abstract void checkOfflineAccess();
 
     /**
      * Updates data if required
diff --git a/src/org/openstreetmap/josm/io/CachedFile.java b/src/org/openstreetmap/josm/io/CachedFile.java
index 9280f3b..63f251a 100644
--- a/src/org/openstreetmap/josm/io/CachedFile.java
+++ b/src/org/openstreetmap/josm/io/CachedFile.java
@@ -206,7 +206,7 @@ public class CachedFile implements Closeable {
     public InputStream getInputStream() throws IOException {
         File file = getFile();
         if (file == null) {
-            if (name.startsWith("resource://")) {
+            if (name != null && name.startsWith("resource://")) {
                 InputStream is = getClass().getResourceAsStream(
                         name.substring("resource:/".length()));
                 if (is == null)
@@ -272,7 +272,7 @@ public class CachedFile implements Closeable {
                 cacheFile = checkLocal(url);
             }
         } catch (MalformedURLException e) {
-            if (name.startsWith("resource://")) {
+            if (name == null || name.startsWith("resource://")) {
                 return null;
             } else if (name.startsWith("josmdir://")) {
                 cacheFile = new File(Main.pref.getUserDataDirectory(), name.substring("josmdir://".length()));
diff --git a/src/org/openstreetmap/josm/io/Capabilities.java b/src/org/openstreetmap/josm/io/Capabilities.java
index b3c5533..d1b14a2 100644
--- a/src/org/openstreetmap/josm/io/Capabilities.java
+++ b/src/org/openstreetmap/josm/io/Capabilities.java
@@ -241,12 +241,12 @@ public class Capabilities {
         private Capabilities capabilities;
 
         @Override
-        public void startDocument() throws SAXException {
+        public void startDocument() {
             capabilities = new Capabilities();
         }
 
         @Override
-        public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
+        public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
             for (int i = 0; i < atts.getLength(); i++) {
                 capabilities.put(qName, atts.getQName(i), atts.getValue(i));
             }
diff --git a/src/org/openstreetmap/josm/io/NameFinder.java b/src/org/openstreetmap/josm/io/NameFinder.java
index 2b5c51a..1265ebf 100644
--- a/src/org/openstreetmap/josm/io/NameFinder.java
+++ b/src/org/openstreetmap/josm/io/NameFinder.java
@@ -196,7 +196,7 @@ public final class NameFinder {
             try {
                 if ("searchresults".equals(qName)) {
                     // do nothing
-                } else if ("named".equals(qName) && (depth == 2)) {
+                } else if (depth == 2 && "named".equals(qName)) {
                     currentResult = new SearchResult();
                     currentResult.name = atts.getValue("name");
                     currentResult.info = atts.getValue("info");
@@ -207,9 +207,9 @@ public final class NameFinder {
                     currentResult.lon = Double.parseDouble(atts.getValue("lon"));
                     currentResult.zoom = Integer.parseInt(atts.getValue("zoom"));
                     data.add(currentResult);
-                } else if ("description".equals(qName) && (depth == 3)) {
+                } else if (depth == 3 && "description".equals(qName)) {
                     description = new StringBuilder();
-                } else if ("named".equals(qName) && (depth == 4)) {
+                } else if (depth == 4 && "named".equals(qName)) {
                     // this is a "named" place in the nearest places list.
                     String info = atts.getValue("info");
                     if ("city".equals(info) || "town".equals(info) || "village".equals(info)) {
@@ -251,7 +251,7 @@ public final class NameFinder {
          */
         @Override
         public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
-            if ("description".equals(qName) && description != null) {
+            if (description != null && "description".equals(qName)) {
                 currentResult.description = description.toString();
                 description = null;
             }
diff --git a/src/org/openstreetmap/josm/io/NoteExporter.java b/src/org/openstreetmap/josm/io/NoteExporter.java
index f8212ea..381db47 100644
--- a/src/org/openstreetmap/josm/io/NoteExporter.java
+++ b/src/org/openstreetmap/josm/io/NoteExporter.java
@@ -38,11 +38,10 @@ public class NoteExporter extends FileExporter {
     public void exportData(File file, Layer layer) throws IOException {
         Main.info("exporting notes to file: " + file);
         if (layer instanceof NoteLayer) {
-            OutputStream os = new FileOutputStream(file);
-            NoteWriter writer = new NoteWriter(os);
-            writer.write(((NoteLayer) layer).getNoteData());
-            os.flush();
-            writer.close();
+            try (OutputStream os = new FileOutputStream(file);
+                 NoteWriter writer = new NoteWriter(os)) {
+                writer.write(((NoteLayer) layer).getNoteData());
+            }
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/io/NoteReader.java b/src/org/openstreetmap/josm/io/NoteReader.java
index 6fca43a..4561713 100644
--- a/src/org/openstreetmap/josm/io/NoteReader.java
+++ b/src/org/openstreetmap/josm/io/NoteReader.java
@@ -201,18 +201,16 @@ public class NoteReader {
     /**
      * Initializes the reader with a given InputStream
      * @param source - InputStream containing Notes XML
-     * @throws IOException if any I/O error occurs
      */
-    public NoteReader(InputStream source) throws IOException {
+    public NoteReader(InputStream source) {
         this.inputSource = new InputSource(source);
     }
 
     /**
      * Initializes the reader with a string as a source
      * @param source UTF-8 string containing Notes XML to parse
-     * @throws IOException if any I/O error occurs
      */
-    public NoteReader(String source) throws IOException {
+    public NoteReader(String source) {
         this.inputSource = new InputSource(new ByteArrayInputStream(source.getBytes(StandardCharsets.UTF_8)));
     }
 
diff --git a/src/org/openstreetmap/josm/io/OsmReader.java b/src/org/openstreetmap/josm/io/OsmReader.java
index b868670..17905c8 100644
--- a/src/org/openstreetmap/josm/io/OsmReader.java
+++ b/src/org/openstreetmap/josm/io/OsmReader.java
@@ -24,6 +24,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.DataSource;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -40,6 +41,7 @@ import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -376,6 +378,10 @@ public class OsmReader extends AbstractReader {
         String value = parser.getAttributeValue(null, "v");
         if (key == null || value == null) {
             throwException(tr("Missing key or value attribute in tag."));
+        } else if (Utils.isStripEmpty(key) && t instanceof AbstractPrimitive) {
+            // #14199: Empty keys as ignored by AbstractPrimitive#put, but it causes problems to fix existing data
+            // Drop the tag on import, but flag the primitive as modified
+            ((AbstractPrimitive) t).setModified(true);
         } else {
             t.put(key.intern(), value.intern());
         }
diff --git a/src/org/openstreetmap/josm/io/OsmServerWriter.java b/src/org/openstreetmap/josm/io/OsmServerWriter.java
index d44a8b8..d6de5b7 100644
--- a/src/org/openstreetmap/josm/io/OsmServerWriter.java
+++ b/src/org/openstreetmap/josm/io/OsmServerWriter.java
@@ -85,7 +85,7 @@ public class OsmServerWriter {
     }
 
     /**
-     * Uploads the changes individually. Invokes one API call per uploaded primitmive.
+     * Uploads the changes individually. Invokes one API call per uploaded primitive.
      *
      * @param primitives the collection of primitives to upload
      * @param progressMonitor the progress monitor
@@ -117,10 +117,6 @@ public class OsmServerWriter {
                 processed.add(osm);
                 progressMonitor.worked(1);
             }
-        } catch (OsmTransferException e) {
-            throw e;
-        } catch (Exception e) {
-            throw new OsmTransferException(e);
         } finally {
             progressMonitor.finishTask();
         }
diff --git a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
index bd3540b..f349fb1 100644
--- a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
+++ b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
@@ -290,7 +290,7 @@ public class ImageryReader implements Closeable {
                 }
                 break;
             case MIRROR:
-                if ("mirror".equals(qName) && mirrorEntry != null) {
+                if (mirrorEntry != null && "mirror".equals(qName)) {
                     entry.addMirror(mirrorEntry);
                     mirrorEntry = null;
                 }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
index 0e2a326..a5373c6 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
@@ -250,7 +250,7 @@ public class AddTagsDialog extends ExtendedDialog {
     @Override
     protected void buttonAction(int buttonIndex, ActionEvent evt) {
         // if layer all layers were closed, ignore all actions
-        if (Main.getLayerManager().getEditDataSet() != null && buttonIndex != 2) {
+        if (buttonIndex != 2 && Main.getLayerManager().getEditDataSet() != null) {
             TableModel tm = propertyTable.getModel();
             for (int i = 0; i < tm.getRowCount(); i++) {
                 if (buttonIndex == 1 || (Boolean) tm.getValueAt(i, 0)) {
diff --git a/src/org/openstreetmap/josm/tools/AudioPlayer.java b/src/org/openstreetmap/josm/tools/AudioPlayer.java
index 1ae4d81..6f920d5 100644
--- a/src/org/openstreetmap/josm/tools/AudioPlayer.java
+++ b/src/org/openstreetmap/josm/tools/AudioPlayer.java
@@ -278,19 +278,23 @@ public final class AudioPlayer extends Thread {
                     case PLAYING:
                         command.possiblyInterrupt();
                         for (;;) {
-                            int nBytesRead;
-                            nBytesRead = audioInputStream.read(abData, 0, abData.length);
-                            position += nBytesRead / bytesPerSecond;
+                            int nBytesRead = 0;
+                            if (audioInputStream != null) {
+                                nBytesRead = audioInputStream.read(abData, 0, abData.length);
+                                position += nBytesRead / bytesPerSecond;
+                            }
                             command.possiblyInterrupt();
-                            if (nBytesRead < 0) {
+                            if (nBytesRead < 0 || audioInputStream == null || audioOutputLine == null) {
                                 break;
                             }
                             audioOutputLine.write(abData, 0, nBytesRead); // => int nBytesWritten
                             command.possiblyInterrupt();
                         }
                         // end of audio, clean up
-                        audioOutputLine.drain();
-                        audioOutputLine.close();
+                        if (audioOutputLine != null) {
+                            audioOutputLine.drain();
+                            audioOutputLine.close();
+                        }
                         audioOutputLine = null;
                         Utils.close(audioInputStream);
                         audioInputStream = null;
diff --git a/src/org/openstreetmap/josm/tools/ExifReader.java b/src/org/openstreetmap/josm/tools/ExifReader.java
index 4cc55a4..01dea9f 100644
--- a/src/org/openstreetmap/josm/tools/ExifReader.java
+++ b/src/org/openstreetmap/josm/tools/ExifReader.java
@@ -43,6 +43,7 @@ public final class ExifReader {
         try {
             Metadata metadata = JpegMetadataReader.readMetadata(filename);
             String dateStr = null;
+            String dateTime = null;
             String subSeconds = null;
             for (Directory dirIt : metadata.getDirectories()) {
                 if (!(dirIt instanceof ExifDirectoryBase)) {
@@ -51,20 +52,24 @@ public final class ExifReader {
                 for (Tag tag : dirIt.getTags()) {
                     if (tag.getTagType() == ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL /* 0x9003 */ &&
                             !tag.getDescription().matches("\\[[0-9]+ .+\\]")) {
+                        // prefer DATETIME_ORIGINAL
                         dateStr = tag.getDescription();
                     }
-                    if (tag.getTagType() == ExifIFD0Directory.TAG_DATETIME /* 0x0132 */ ||
-                        tag.getTagType() == ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED /* 0x9004 */) {
-                        if (dateStr != null) {
-                            // prefer TAG_DATETIME_ORIGINAL
-                            dateStr = tag.getDescription();
-                        }
+                    if (tag.getTagType() == ExifIFD0Directory.TAG_DATETIME /* 0x0132 */) {
+                        // prefer DATETIME over DATETIME_DIGITIZED
+                        dateTime = tag.getDescription();
+                    }
+                    if (tag.getTagType() == ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED /* 0x9004 */ && dateTime == null) {
+                        dateTime = tag.getDescription();
                     }
                     if (tag.getTagType() == ExifIFD0Directory.TAG_SUBSECOND_TIME_ORIGINAL) {
                         subSeconds = tag.getDescription();
                     }
                 }
             }
+            if (dateStr == null) {
+                dateStr = dateTime;
+            }
             if (dateStr != null) {
                 dateStr = dateStr.replace('/', ':'); // workaround for HTC Sensation bug, see #7228
                 final Date date = DateUtils.fromString(dateStr);
diff --git a/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java b/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java
index d813efd..65f4c66 100644
--- a/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java
+++ b/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java
@@ -156,7 +156,7 @@ public final class RightAndLefthandTraffic {
         try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
              OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, ds.getVersion())
             ) {
-            w.header(false);
+            w.header(Boolean.FALSE);
             w.writeContent(ds);
             w.footer();
         } catch (IOException ex) {
diff --git a/src/org/openstreetmap/josm/tools/Shortcut.java b/src/org/openstreetmap/josm/tools/Shortcut.java
index 2719fb3..13dbffc 100644
--- a/src/org/openstreetmap/josm/tools/Shortcut.java
+++ b/src/org/openstreetmap/josm/tools/Shortcut.java
@@ -403,7 +403,7 @@ public final class Shortcut {
     public static boolean savePrefs() {
         return shortcuts.stream()
                 .map(Shortcut::save)
-                .reduce(false, Boolean::logicalOr); // has changed
+                .reduce(Boolean.FALSE, Boolean::logicalOr); // has changed
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index 44ce97f..7bab7ef 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -734,6 +734,24 @@ public final class Utils {
     }
 
     /**
+     * Determines if the given String would be empty if stripped.
+     * This is an efficient alternative to {@code strip(s).isEmpty()} that avoids to create useless String object.
+     * @param str The string to test
+     * @return {@code true} if the stripped version of {@code s} would be empty.
+     * @since 11435
+     */
+    public static boolean isStripEmpty(String str) {
+        if (str != null) {
+            for (int i = 0; i < str.length(); i++) {
+                if (!isStrippedChar(str.charAt(i), DEFAULT_STRIP)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
      * An alternative to {@link String#trim()} to effectively remove all leading
      * and trailing white characters, including Unicode ones.
      * @param str The string to strip
@@ -773,16 +791,14 @@ public final class Utils {
         int end = str.length();
         boolean leadingSkipChar = true;
         while (leadingSkipChar && start < end) {
-            char c = str.charAt(start);
-            leadingSkipChar = Character.isWhitespace(c) || Character.isSpaceChar(c) || stripChar(skipChars, c);
+            leadingSkipChar = isStrippedChar(str.charAt(start), skipChars);
             if (leadingSkipChar) {
                 start++;
             }
         }
         boolean trailingSkipChar = true;
         while (trailingSkipChar && end > start + 1) {
-            char c = str.charAt(end - 1);
-            trailingSkipChar = Character.isWhitespace(c) || Character.isSpaceChar(c) || stripChar(skipChars, c);
+            trailingSkipChar = isStrippedChar(str.charAt(end - 1), skipChars);
             if (trailingSkipChar) {
                 end--;
             }
@@ -791,6 +807,10 @@ public final class Utils {
         return str.substring(start, end);
     }
 
+    private static boolean isStrippedChar(char c, final char ... skipChars) {
+        return Character.isWhitespace(c) || Character.isSpaceChar(c) || stripChar(skipChars, c);
+    }
+
     private static char[] stripChars(final String skipChars) {
         if (skipChars == null || skipChars.isEmpty()) {
             return DEFAULT_STRIP;
@@ -1145,7 +1165,7 @@ public final class Utils {
      * @since 7356
      */
     public static boolean isLocalUrl(String url) {
-        if (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("resource://"))
+        if (url == null || url.startsWith("http://") || url.startsWith("https://") || url.startsWith("resource://"))
             return false;
         return true;
     }
diff --git a/test/data/regress/12627/overlapping.osm b/test/data/regress/12627/overlapping.osm
new file mode 100644
index 0000000..e409c4f
--- /dev/null
+++ b/test/data/regress/12627/overlapping.osm
@@ -0,0 +1,27 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-25' action='modify' visible='true' lat='-22.58401175177' lon='-47.41447678914' />
+  <node id='-28' action='modify' visible='true' lat='-22.58366442745' lon='-47.41407254727' />
+  <node id='-32' action='modify' visible='true' lat='-22.58386141747' lon='-47.4137890165' />
+  <node id='-34' action='modify' visible='true' lat='-22.5841698618' lon='-47.41412588474' />
+  <node id='-43' visible='true' lat='-22.58433963548' lon='-47.41448661447' />
+  <node id='-44' visible='true' lat='-22.583992312' lon='-47.41408237259' />
+  <node id='-45' visible='true' lat='-22.58418930154' lon='-47.41379884183' />
+  <node id='-46' visible='true' lat='-22.58449774514' lon='-47.41413571006' />
+  <way id='-29' action='modify' visible='true'>
+    <nd ref='-25' />
+    <nd ref='-28' />
+    <nd ref='-32' />
+    <nd ref='-34' />
+    <nd ref='-25' />
+    <tag k='natural' v='wood' />
+  </way>
+  <way id='-42' action='modify' visible='true'>
+    <nd ref='-43' />
+    <nd ref='-44' />
+    <nd ref='-45' />
+    <nd ref='-46' />
+    <nd ref='-43' />
+    <tag k='natural' v='wood' />
+  </way>
+</osm>
diff --git a/test/data/regress/14199/emptytag.osm b/test/data/regress/14199/emptytag.osm
new file mode 100644
index 0000000..de7943a
--- /dev/null
+++ b/test/data/regress/14199/emptytag.osm
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.6" generator="CGImap 0.5.8 (19275 thorn-01.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
+ <node id="4577848024" visible="true" version="1" changeset="44736411" timestamp="2016-12-28T17:22:56Z" user="Winterstein" uid="5037969" lat="50.3679419" lon="8.6680577"/>
+ <node id="4577848025" visible="true" version="1" changeset="44736411" timestamp="2016-12-28T17:22:56Z" user="Winterstein" uid="5037969" lat="50.3680086" lon="8.6682089"/>
+ <node id="4577848026" visible="true" version="1" changeset="44736411" timestamp="2016-12-28T17:22:56Z" user="Winterstein" uid="5037969" lat="50.3679112" lon="8.6683148"/>
+ <node id="4577848027" visible="true" version="1" changeset="44736411" timestamp="2016-12-28T17:22:56Z" user="Winterstein" uid="5037969" lat="50.3678446" lon="8.6681637"/>
+ <way id="462384126" visible="true" version="1" changeset="44807414" timestamp="2016-12-31T14:19:05Z" user="mueschel" uid="616774">
+  <nd ref="4577848024"/>
+  <nd ref="4577848025"/>
+  <nd ref="4577848026"/>
+  <nd ref="4577848027"/>
+  <nd ref="4577848024"/>
+  <tag k="  " v=""/>
+  <tag k="building" v="yes"/>
+ </way>
+</osm>
diff --git a/test/data/regress/14209/0MbEfj1S--.1.jpg b/test/data/regress/14209/0MbEfj1S--.1.jpg
new file mode 100644
index 0000000..34a7f79
Binary files /dev/null and b/test/data/regress/14209/0MbEfj1S--.1.jpg differ
diff --git a/test/data/regress/14209/7VWFOryj--.1.jpg b/test/data/regress/14209/7VWFOryj--.1.jpg
new file mode 100644
index 0000000..795d761
Binary files /dev/null and b/test/data/regress/14209/7VWFOryj--.1.jpg differ
diff --git a/test/data/regress/14217/filter.txt b/test/data/regress/14217/filter.txt
new file mode 100644
index 0000000..125c4a5
--- /dev/null
+++ b/test/data/regress/14217/filter.txt
@@ -0,0 +1 @@
+"ref:bag"=717100000003652  or "ref:bag"=717100000009011  or "ref:bag"=717100000000845  or "ref:bag"=717100000000941  or "ref:bag"=717100000001024  or "ref:bag"=717100000006395  or "ref:bag"=717100000006481  or "ref:bag"=717100000009221  or "ref:bag"=717100000011862  or "ref:bag"=717100000011890  or "ref:bag"=717100000017178  or "ref:bag"=717100000017228  or "ref:bag"=717100000019535  or "ref:bag"=717100000019830  or "ref:bag"=717100000019847  or "ref:bag"=717100000019856  or "ref:bag"=71 [...]
diff --git a/test/data/regress/14275/1485101437.8189685.gpx b/test/data/regress/14275/1485101437.8189685.gpx
new file mode 100644
index 0000000..dc90123
--- /dev/null
+++ b/test/data/regress/14275/1485101437.8189685.gpx
@@ -0,0 +1,1615 @@
+<?xml version="1.0" encoding="UTF-8"?>    
+<gpx version="1.1" xmlns="http://www.topografix.com/GPX/1/1"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
+<trk>        
+<trkseg>
+<trkpt lat="48.468693" lon="18.882594">
+<ele>765</ele>
+<time>2017-01-22T11:11:59+0100</time>
+</trkpt>
+<trkpt lat="48.468693" lon="18.882594"><ele>765</ele><time>2017-01-22T11:12:01+0100</time></trkpt>
+<trkpt lat="48.468693" lon="18.882594"><ele>765</ele><time>2017-01-22T11:12:03+0100</time></trkpt>
+<trkpt lat="48.468693" lon="18.882594"><ele>765</ele><time>2017-01-22T11:12:05+0100</time></trkpt>
+<trkpt lat="48.468693" lon="18.882594"><ele>765</ele><time>2017-01-22T11:12:07+0100</time></trkpt>
+<trkpt lat="48.468578" lon="18.882560"><ele>774</ele><time>2017-01-22T11:14:06+0100</time></trkpt>
+<trkpt lat="48.468492" lon="18.882614"><ele>781</ele><time>2017-01-22T11:14:16+0100</time></trkpt>
+<trkpt lat="48.468387" lon="18.882667"><ele>783</ele><time>2017-01-22T11:14:25+0100</time></trkpt>
+<trkpt lat="48.468278" lon="18.882731"><ele>787</ele><time>2017-01-22T11:14:31+0100</time></trkpt>
+<trkpt lat="48.468168" lon="18.882779"><ele>788</ele><time>2017-01-22T11:14:35+0100</time></trkpt>
+<trkpt lat="48.468054" lon="18.882819"><ele>789</ele><time>2017-01-22T11:14:41+0100</time></trkpt>
+<trkpt lat="48.467949" lon="18.882865"><ele>790</ele><time>2017-01-22T11:14:48+0100</time></trkpt>
+<trkpt lat="48.467833" lon="18.882899"><ele>790</ele><time>2017-01-22T11:14:56+0100</time></trkpt>
+<trkpt lat="48.467732" lon="18.882928"><ele>791</ele><time>2017-01-22T11:15:04+0100</time></trkpt>
+<trkpt lat="48.467639" lon="18.882940"><ele>794</ele><time>2017-01-22T11:15:13+0100</time></trkpt>
+<trkpt lat="48.467540" lon="18.882918"><ele>794</ele><time>2017-01-22T11:15:21+0100</time></trkpt>
+<trkpt lat="48.467441" lon="18.882888"><ele>796</ele><time>2017-01-22T11:15:32+0100</time></trkpt>
+<trkpt lat="48.467344" lon="18.882858"><ele>797</ele><time>2017-01-22T11:15:42+0100</time></trkpt>
+<trkpt lat="48.467248" lon="18.882799"><ele>800</ele><time>2017-01-22T11:16:03+0100</time></trkpt>
+<trkpt lat="48.467236" lon="18.882647"><ele>801</ele><time>2017-01-22T11:16:09+0100</time></trkpt>
+<trkpt lat="48.467238" lon="18.882487"><ele>801</ele><time>2017-01-22T11:16:16+0100</time></trkpt>
+<trkpt lat="48.467249" lon="18.882338"><ele>802</ele><time>2017-01-22T11:16:22+0100</time></trkpt>
+<trkpt lat="48.467265" lon="18.882185"><ele>801</ele><time>2017-01-22T11:16:30+0100</time></trkpt>
+<trkpt lat="48.467289" lon="18.882023"><ele>806</ele><time>2017-01-22T11:16:39+0100</time></trkpt>
+<trkpt lat="48.467297" lon="18.881886"><ele>809</ele><time>2017-01-22T11:16:47+0100</time></trkpt>
+<trkpt lat="48.467287" lon="18.881739"><ele>806</ele><time>2017-01-22T11:16:55+0100</time></trkpt>
+<trkpt lat="48.467247" lon="18.881576"><ele>808</ele><time>2017-01-22T11:17:04+0100</time></trkpt>
+<trkpt lat="48.467225" lon="18.881424"><ele>808</ele><time>2017-01-22T11:17:10+0100</time></trkpt>
+<trkpt lat="48.467212" lon="18.881269"><ele>811</ele><time>2017-01-22T11:17:16+0100</time></trkpt>
+<trkpt lat="48.467202" lon="18.881108"><ele>811</ele><time>2017-01-22T11:17:22+0100</time></trkpt>
+<trkpt lat="48.467191" lon="18.880951"><ele>809</ele><time>2017-01-22T11:17:29+0100</time></trkpt>
+<trkpt lat="48.467183" lon="18.880777"><ele>812</ele><time>2017-01-22T11:17:35+0100</time></trkpt>
+<trkpt lat="48.467184" lon="18.880595"><ele>812</ele><time>2017-01-22T11:17:41+0100</time></trkpt>
+<trkpt lat="48.467183" lon="18.880432"><ele>814</ele><time>2017-01-22T11:17:48+0100</time></trkpt>
+<trkpt lat="48.467188" lon="18.880287"><ele>815</ele><time>2017-01-22T11:17:58+0100</time></trkpt>
+<trkpt lat="48.467198" lon="18.880127"><ele>817</ele><time>2017-01-22T11:18:07+0100</time></trkpt>
+<trkpt lat="48.467182" lon="18.879973"><ele>817</ele><time>2017-01-22T11:18:23+0100</time></trkpt>
+<trkpt lat="48.467204" lon="18.879801"><ele>818</ele><time>2017-01-22T11:18:30+0100</time></trkpt>
+<trkpt lat="48.467228" lon="18.879655"><ele>816</ele><time>2017-01-22T11:18:36+0100</time></trkpt>
+<trkpt lat="48.467249" lon="18.879444"><ele>819</ele><time>2017-01-22T11:19:05+0100</time></trkpt>
+<trkpt lat="48.467247" lon="18.879277"><ele>820</ele><time>2017-01-22T11:19:12+0100</time></trkpt>
+<trkpt lat="48.467283" lon="18.879109"><ele>821</ele><time>2017-01-22T11:19:18+0100</time></trkpt>
+<trkpt lat="48.467315" lon="18.878947"><ele>821</ele><time>2017-01-22T11:19:26+0100</time></trkpt>
+<trkpt lat="48.467336" lon="18.878798"><ele>827</ele><time>2017-01-22T11:19:35+0100</time></trkpt>
+<trkpt lat="48.467372" lon="18.878655"><ele>825</ele><time>2017-01-22T11:19:43+0100</time></trkpt>
+<trkpt lat="48.467416" lon="18.878522"><ele>826</ele><time>2017-01-22T11:19:52+0100</time></trkpt>
+<trkpt lat="48.467465" lon="18.878386"><ele>829</ele><time>2017-01-22T11:20:02+0100</time></trkpt>
+<trkpt lat="48.467490" lon="18.878249"><ele>826</ele><time>2017-01-22T11:20:14+0100</time></trkpt>
+<trkpt lat="48.467481" lon="18.878109"><ele>829</ele><time>2017-01-22T11:20:23+0100</time></trkpt>
+<trkpt lat="48.467543" lon="18.878000"><ele>835</ele><time>2017-01-22T11:20:35+0100</time></trkpt>
+<trkpt lat="48.467544" lon="18.877844"><ele>834</ele><time>2017-01-22T11:20:46+0100</time></trkpt>
+<trkpt lat="48.467541" lon="18.877682"><ele>834</ele><time>2017-01-22T11:20:52+0100</time></trkpt>
+<trkpt lat="48.467521" lon="18.877487"><ele>839</ele><time>2017-01-22T11:21:15+0100</time></trkpt>
+<trkpt lat="48.467486" lon="18.877334"><ele>837</ele><time>2017-01-22T11:21:23+0100</time></trkpt>
+<trkpt lat="48.467451" lon="18.877194"><ele>839</ele><time>2017-01-22T11:21:31+0100</time></trkpt>
+<trkpt lat="48.467472" lon="18.877054"><ele>843</ele><time>2017-01-22T11:21:40+0100</time></trkpt>
+<trkpt lat="48.467440" lon="18.876904"><ele>834</ele><time>2017-01-22T11:21:46+0100</time></trkpt>
+<trkpt lat="48.467409" lon="18.876749"><ele>830</ele><time>2017-01-22T11:21:52+0100</time></trkpt>
+<trkpt lat="48.467373" lon="18.876611"><ele>833</ele><time>2017-01-22T11:22:01+0100</time></trkpt>
+<trkpt lat="48.467340" lon="18.876482"><ele>837</ele><time>2017-01-22T11:22:07+0100</time></trkpt>
+<trkpt lat="48.467256" lon="18.876401"><ele>839</ele><time>2017-01-22T11:22:17+0100</time></trkpt>
+<trkpt lat="48.467115" lon="18.876393"><ele>835</ele><time>2017-01-22T11:22:32+0100</time></trkpt>
+<trkpt lat="48.467003" lon="18.876460"><ele>834</ele><time>2017-01-22T11:22:36+0100</time></trkpt>
+<trkpt lat="48.466907" lon="18.876576"><ele>832</ele><time>2017-01-22T11:22:40+0100</time></trkpt>
+<trkpt lat="48.466824" lon="18.876678"><ele>833</ele><time>2017-01-22T11:22:46+0100</time></trkpt>
+<trkpt lat="48.466787" lon="18.876841"><ele>838</ele><time>2017-01-22T11:22:51+0100</time></trkpt>
+<trkpt lat="48.466728" lon="18.876988"><ele>840</ele><time>2017-01-22T11:22:57+0100</time></trkpt>
+<trkpt lat="48.466630" lon="18.877064"><ele>840</ele><time>2017-01-22T11:23:03+0100</time></trkpt>
+<trkpt lat="48.466524" lon="18.877154"><ele>843</ele><time>2017-01-22T11:23:09+0100</time></trkpt>
+<trkpt lat="48.466420" lon="18.877205"><ele>841</ele><time>2017-01-22T11:23:15+0100</time></trkpt>
+<trkpt lat="48.466322" lon="18.877256"><ele>843</ele><time>2017-01-22T11:23:24+0100</time></trkpt>
+<trkpt lat="48.466227" lon="18.877300"><ele>848</ele><time>2017-01-22T11:23:34+0100</time></trkpt>
+<trkpt lat="48.466120" lon="18.877293"><ele>850</ele><time>2017-01-22T11:23:45+0100</time></trkpt>
+<trkpt lat="48.466019" lon="18.877284"><ele>853</ele><time>2017-01-22T11:23:55+0100</time></trkpt>
+<trkpt lat="48.465937" lon="18.877206"><ele>857</ele><time>2017-01-22T11:24:03+0100</time></trkpt>
+<trkpt lat="48.465871" lon="18.877088"><ele>856</ele><time>2017-01-22T11:24:14+0100</time></trkpt>
+<trkpt lat="48.465818" lon="18.876956"><ele>854</ele><time>2017-01-22T11:24:20+0100</time></trkpt>
+<trkpt lat="48.465785" lon="18.876825"><ele>856</ele><time>2017-01-22T11:24:30+0100</time></trkpt>
+<trkpt lat="48.465738" lon="18.876691"><ele>859</ele><time>2017-01-22T11:24:41+0100</time></trkpt>
+<trkpt lat="48.465697" lon="18.876558"><ele>861</ele><time>2017-01-22T11:24:51+0100</time></trkpt>
+<trkpt lat="48.465660" lon="18.876424"><ele>863</ele><time>2017-01-22T11:25:01+0100</time></trkpt>
+<trkpt lat="48.465639" lon="18.876272"><ele>863</ele><time>2017-01-22T11:25:12+0100</time></trkpt>
+<trkpt lat="48.465575" lon="18.876174"><ele>862</ele><time>2017-01-22T11:25:20+0100</time></trkpt>
+<trkpt lat="48.465505" lon="18.876073"><ele>863</ele><time>2017-01-22T11:25:29+0100</time></trkpt>
+<trkpt lat="48.465497" lon="18.875928"><ele>864</ele><time>2017-01-22T11:25:43+0100</time></trkpt>
+<trkpt lat="48.465529" lon="18.875781"><ele>865</ele><time>2017-01-22T11:25:54+0100</time></trkpt>
+<trkpt lat="48.465536" lon="18.875617"><ele>863</ele><time>2017-01-22T11:26:02+0100</time></trkpt>
+<trkpt lat="48.465510" lon="18.875479"><ele>863</ele><time>2017-01-22T11:26:13+0100</time></trkpt>
+<trkpt lat="48.465511" lon="18.875328"><ele>862</ele><time>2017-01-22T11:26:19+0100</time></trkpt>
+<trkpt lat="48.465504" lon="18.875183"><ele>861</ele><time>2017-01-22T11:26:25+0100</time></trkpt>
+<trkpt lat="48.465500" lon="18.875007"><ele>859</ele><time>2017-01-22T11:26:34+0100</time></trkpt>
+<trkpt lat="48.465489" lon="18.874852"><ele>862</ele><time>2017-01-22T11:26:42+0100</time></trkpt>
+<trkpt lat="48.465477" lon="18.874701"><ele>862</ele><time>2017-01-22T11:26:52+0100</time></trkpt>
+<trkpt lat="48.465427" lon="18.874570"><ele>863</ele><time>2017-01-22T11:27:01+0100</time></trkpt>
+<trkpt lat="48.465415" lon="18.874431"><ele>867</ele><time>2017-01-22T11:27:09+0100</time></trkpt>
+<trkpt lat="48.465386" lon="18.874285"><ele>868</ele><time>2017-01-22T11:27:20+0100</time></trkpt>
+<trkpt lat="48.465352" lon="18.874149"><ele>863</ele><time>2017-01-22T11:27:30+0100</time></trkpt>
+<trkpt lat="48.465274" lon="18.874053"><ele>870</ele><time>2017-01-22T11:27:43+0100</time></trkpt>
+<trkpt lat="48.465196" lon="18.873955"><ele>874</ele><time>2017-01-22T11:27:53+0100</time></trkpt>
+<trkpt lat="48.465116" lon="18.873890"><ele>880</ele><time>2017-01-22T11:28:01+0100</time></trkpt>
+<trkpt lat="48.465042" lon="18.873801"><ele>882</ele><time>2017-01-22T11:28:12+0100</time></trkpt>
+<trkpt lat="48.464957" lon="18.873723"><ele>882</ele><time>2017-01-22T11:28:22+0100</time></trkpt>
+<trkpt lat="48.464871" lon="18.873675"><ele>883</ele><time>2017-01-22T11:28:31+0100</time></trkpt>
+<trkpt lat="48.464777" lon="18.873677"><ele>885</ele><time>2017-01-22T11:28:41+0100</time></trkpt>
+<trkpt lat="48.464671" lon="18.873694"><ele>879</ele><time>2017-01-22T11:28:52+0100</time></trkpt>
+<trkpt lat="48.464574" lon="18.873716"><ele>876</ele><time>2017-01-22T11:29:00+0100</time></trkpt>
+<trkpt lat="48.464486" lon="18.873763"><ele>878</ele><time>2017-01-22T11:29:13+0100</time></trkpt>
+<trkpt lat="48.464405" lon="18.873848"><ele>878</ele><time>2017-01-22T11:29:19+0100</time></trkpt>
+<trkpt lat="48.464311" lon="18.873891"><ele>877</ele><time>2017-01-22T11:29:29+0100</time></trkpt>
+<trkpt lat="48.464221" lon="18.873880"><ele>884</ele><time>2017-01-22T11:29:40+0100</time></trkpt>
+<trkpt lat="48.464134" lon="18.873820"><ele>888</ele><time>2017-01-22T11:29:50+0100</time></trkpt>
+<trkpt lat="48.464021" lon="18.873815"><ele>887</ele><time>2017-01-22T11:30:03+0100</time></trkpt>
+<trkpt lat="48.463903" lon="18.873798"><ele>891</ele><time>2017-01-22T11:30:07+0100</time></trkpt>
+<trkpt lat="48.463787" lon="18.873779"><ele>889</ele><time>2017-01-22T11:30:13+0100</time></trkpt>
+<trkpt lat="48.463669" lon="18.873726"><ele>890</ele><time>2017-01-22T11:30:19+0100</time></trkpt>
+<trkpt lat="48.463587" lon="18.873646"><ele>891</ele><time>2017-01-22T11:30:26+0100</time></trkpt>
+<trkpt lat="48.463501" lon="18.873543"><ele>886</ele><time>2017-01-22T11:30:32+0100</time></trkpt>
+<trkpt lat="48.463438" lon="18.873418"><ele>891</ele><time>2017-01-22T11:30:38+0100</time></trkpt>
+<trkpt lat="48.463368" lon="18.873298"><ele>894</ele><time>2017-01-22T11:30:46+0100</time></trkpt>
+<trkpt lat="48.463307" lon="18.873190"><ele>893</ele><time>2017-01-22T11:30:55+0100</time></trkpt>
+<trkpt lat="48.463238" lon="18.873083"><ele>894</ele><time>2017-01-22T11:31:01+0100</time></trkpt>
+<trkpt lat="48.463146" lon="18.872991"><ele>895</ele><time>2017-01-22T11:31:11+0100</time></trkpt>
+<trkpt lat="48.463056" lon="18.872921"><ele>896</ele><time>2017-01-22T11:31:22+0100</time></trkpt>
+<trkpt lat="48.462972" lon="18.872844"><ele>896</ele><time>2017-01-22T11:31:28+0100</time></trkpt>
+<trkpt lat="48.462873" lon="18.872794"><ele>897</ele><time>2017-01-22T11:31:39+0100</time></trkpt>
+<trkpt lat="48.462787" lon="18.872752"><ele>895</ele><time>2017-01-22T11:31:47+0100</time></trkpt>
+<trkpt lat="48.462702" lon="18.872702"><ele>894</ele><time>2017-01-22T11:32:02+0100</time></trkpt>
+<trkpt lat="48.462602" lon="18.872681"><ele>892</ele><time>2017-01-22T11:32:14+0100</time></trkpt>
+<trkpt lat="48.462506" lon="18.872659"><ele>893</ele><time>2017-01-22T11:32:18+0100</time></trkpt>
+<trkpt lat="48.462406" lon="18.872637"><ele>892</ele><time>2017-01-22T11:32:22+0100</time></trkpt>
+<trkpt lat="48.462311" lon="18.872617"><ele>891</ele><time>2017-01-22T11:32:27+0100</time></trkpt>
+<trkpt lat="48.462187" lon="18.872588"><ele>891</ele><time>2017-01-22T11:32:31+0100</time></trkpt>
+<trkpt lat="48.462081" lon="18.872577"><ele>888</ele><time>2017-01-22T11:32:35+0100</time></trkpt>
+<trkpt lat="48.461938" lon="18.872564"><ele>890</ele><time>2017-01-22T11:32:39+0100</time></trkpt>
+<trkpt lat="48.461790" lon="18.872554"><ele>891</ele><time>2017-01-22T11:32:43+0100</time></trkpt>
+<trkpt lat="48.461657" lon="18.872563"><ele>888</ele><time>2017-01-22T11:32:48+0100</time></trkpt>
+<trkpt lat="48.461540" lon="18.872569"><ele>887</ele><time>2017-01-22T11:32:52+0100</time></trkpt>
+<trkpt lat="48.461447" lon="18.872567"><ele>887</ele><time>2017-01-22T11:32:58+0100</time></trkpt>
+<trkpt lat="48.461332" lon="18.872551"><ele>889</ele><time>2017-01-22T11:33:04+0100</time></trkpt>
+<trkpt lat="48.461240" lon="18.872505"><ele>887</ele><time>2017-01-22T11:33:09+0100</time></trkpt>
+<trkpt lat="48.461155" lon="18.872416"><ele>891</ele><time>2017-01-22T11:33:15+0100</time></trkpt>
+<trkpt lat="48.461039" lon="18.872346"><ele>892</ele><time>2017-01-22T11:33:21+0100</time></trkpt>
+<trkpt lat="48.460915" lon="18.872323"><ele>890</ele><time>2017-01-22T11:33:27+0100</time></trkpt>
+<trkpt lat="48.460824" lon="18.872333"><ele>888</ele><time>2017-01-22T11:33:31+0100</time></trkpt>
+<trkpt lat="48.460711" lon="18.872374"><ele>886</ele><time>2017-01-22T11:33:36+0100</time></trkpt>
+<trkpt lat="48.460628" lon="18.872459"><ele>887</ele><time>2017-01-22T11:33:38+0100</time></trkpt>
+<trkpt lat="48.460528" lon="18.872566"><ele>889</ele><time>2017-01-22T11:33:42+0100</time></trkpt>
+<trkpt lat="48.460445" lon="18.872659"><ele>888</ele><time>2017-01-22T11:33:46+0100</time></trkpt>
+<trkpt lat="48.460338" lon="18.872709"><ele>889</ele><time>2017-01-22T11:33:50+0100</time></trkpt>
+<trkpt lat="48.460221" lon="18.872784"><ele>885</ele><time>2017-01-22T11:33:55+0100</time></trkpt>
+<trkpt lat="48.460087" lon="18.872855"><ele>885</ele><time>2017-01-22T11:33:59+0100</time></trkpt>
+<trkpt lat="48.459969" lon="18.872924"><ele>882</ele><time>2017-01-22T11:34:03+0100</time></trkpt>
+<trkpt lat="48.459858" lon="18.872986"><ele>880</ele><time>2017-01-22T11:34:07+0100</time></trkpt>
+<trkpt lat="48.459757" lon="18.873019"><ele>885</ele><time>2017-01-22T11:34:11+0100</time></trkpt>
+<trkpt lat="48.459621" lon="18.873080"><ele>878</ele><time>2017-01-22T11:34:16+0100</time></trkpt>
+<trkpt lat="48.459482" lon="18.873198"><ele>876</ele><time>2017-01-22T11:34:18+0100</time></trkpt>
+<trkpt lat="48.459420" lon="18.873356"><ele>876</ele><time>2017-01-22T11:34:22+0100</time></trkpt>
+<trkpt lat="48.459420" lon="18.873552"><ele>873</ele><time>2017-01-22T11:34:24+0100</time></trkpt>
+<trkpt lat="48.459372" lon="18.873753"><ele>872</ele><time>2017-01-22T11:34:28+0100</time></trkpt>
+<trkpt lat="48.459304" lon="18.873866"><ele>870</ele><time>2017-01-22T11:34:32+0100</time></trkpt>
+<trkpt lat="48.459239" lon="18.874030"><ele>871</ele><time>2017-01-22T11:34:36+0100</time></trkpt>
+<trkpt lat="48.459210" lon="18.874197"><ele>875</ele><time>2017-01-22T11:34:42+0100</time></trkpt>
+<trkpt lat="48.459138" lon="18.874298"><ele>879</ele><time>2017-01-22T11:34:47+0100</time></trkpt>
+<trkpt lat="48.458981" lon="18.874473"><ele>875</ele><time>2017-01-22T11:34:51+0100</time></trkpt>
+<trkpt lat="48.458876" lon="18.874569"><ele>874</ele><time>2017-01-22T11:34:55+0100</time></trkpt>
+<trkpt lat="48.458756" lon="18.874606"><ele>873</ele><time>2017-01-22T11:34:59+0100</time></trkpt>
+<trkpt lat="48.458614" lon="18.874655"><ele>873</ele><time>2017-01-22T11:35:03+0100</time></trkpt>
+<trkpt lat="48.458443" lon="18.874694"><ele>873</ele><time>2017-01-22T11:35:07+0100</time></trkpt>
+<trkpt lat="48.458288" lon="18.874743"><ele>874</ele><time>2017-01-22T11:35:12+0100</time></trkpt>
+<trkpt lat="48.458169" lon="18.874726"><ele>881</ele><time>2017-01-22T11:35:16+0100</time></trkpt>
+<trkpt lat="48.458035" lon="18.874643"><ele>881</ele><time>2017-01-22T11:35:20+0100</time></trkpt>
+<trkpt lat="48.457912" lon="18.874554"><ele>881</ele><time>2017-01-22T11:35:22+0100</time></trkpt>
+<trkpt lat="48.457821" lon="18.874487"><ele>882</ele><time>2017-01-22T11:35:25+0100</time></trkpt>
+<trkpt lat="48.457738" lon="18.874424"><ele>882</ele><time>2017-01-22T11:35:27+0100</time></trkpt>
+<trkpt lat="48.457583" lon="18.874320"><ele>881</ele><time>2017-01-22T11:35:31+0100</time></trkpt>
+<trkpt lat="48.457435" lon="18.874208"><ele>884</ele><time>2017-01-22T11:35:35+0100</time></trkpt>
+<trkpt lat="48.457334" lon="18.874103"><ele>880</ele><time>2017-01-22T11:35:39+0100</time></trkpt>
+<trkpt lat="48.457237" lon="18.873978"><ele>880</ele><time>2017-01-22T11:35:46+0100</time></trkpt>
+<trkpt lat="48.457154" lon="18.873833"><ele>882</ele><time>2017-01-22T11:35:52+0100</time></trkpt>
+<trkpt lat="48.457081" lon="18.873706"><ele>877</ele><time>2017-01-22T11:35:58+0100</time></trkpt>
+<trkpt lat="48.457001" lon="18.873602"><ele>879</ele><time>2017-01-22T11:36:07+0100</time></trkpt>
+<trkpt lat="48.456947" lon="18.873469"><ele>880</ele><time>2017-01-22T11:36:13+0100</time></trkpt>
+<trkpt lat="48.456876" lon="18.873343"><ele>881</ele><time>2017-01-22T11:36:21+0100</time></trkpt>
+<trkpt lat="48.456817" lon="18.873238"><ele>884</ele><time>2017-01-22T11:36:32+0100</time></trkpt>
+<trkpt lat="48.456734" lon="18.873116"><ele>885</ele><time>2017-01-22T11:36:38+0100</time></trkpt>
+<trkpt lat="48.456687" lon="18.872939"><ele>885</ele><time>2017-01-22T11:36:44+0100</time></trkpt>
+<trkpt lat="48.456612" lon="18.872732"><ele>879</ele><time>2017-01-22T11:36:49+0100</time></trkpt>
+<trkpt lat="48.456553" lon="18.872626"><ele>879</ele><time>2017-01-22T11:36:51+0100</time></trkpt>
+<trkpt lat="48.456482" lon="18.872453"><ele>876</ele><time>2017-01-22T11:36:55+0100</time></trkpt>
+<trkpt lat="48.456373" lon="18.872352"><ele>866</ele><time>2017-01-22T11:36:59+0100</time></trkpt>
+<trkpt lat="48.456215" lon="18.872378"><ele>863</ele><time>2017-01-22T11:37:03+0100</time></trkpt>
+<trkpt lat="48.456087" lon="18.872389"><ele>864</ele><time>2017-01-22T11:37:07+0100</time></trkpt>
+<trkpt lat="48.456004" lon="18.872332"><ele>868</ele><time>2017-01-22T11:37:14+0100</time></trkpt>
+<trkpt lat="48.455997" lon="18.872190"><ele>871</ele><time>2017-01-22T11:37:20+0100</time></trkpt>
+<trkpt lat="48.456009" lon="18.872039"><ele>879</ele><time>2017-01-22T11:37:24+0100</time></trkpt>
+<trkpt lat="48.455954" lon="18.871888"><ele>880</ele><time>2017-01-22T11:37:28+0100</time></trkpt>
+<trkpt lat="48.455830" lon="18.871695"><ele>879</ele><time>2017-01-22T11:37:33+0100</time></trkpt>
+<trkpt lat="48.455690" lon="18.871508"><ele>879</ele><time>2017-01-22T11:37:37+0100</time></trkpt>
+<trkpt lat="48.455633" lon="18.871402"><ele>879</ele><time>2017-01-22T11:37:39+0100</time></trkpt>
+<trkpt lat="48.455582" lon="18.871212"><ele>882</ele><time>2017-01-22T11:37:43+0100</time></trkpt>
+<trkpt lat="48.455560" lon="18.871000"><ele>882</ele><time>2017-01-22T11:37:47+0100</time></trkpt>
+<trkpt lat="48.455470" lon="18.870863"><ele>879</ele><time>2017-01-22T11:37:51+0100</time></trkpt>
+<trkpt lat="48.455361" lon="18.870757"><ele>873</ele><time>2017-01-22T11:37:55+0100</time></trkpt>
+<trkpt lat="48.455211" lon="18.870721"><ele>868</ele><time>2017-01-22T11:38:00+0100</time></trkpt>
+<trkpt lat="48.455062" lon="18.870721"><ele>863</ele><time>2017-01-22T11:38:04+0100</time></trkpt>
+<trkpt lat="48.454936" lon="18.870713"><ele>862</ele><time>2017-01-22T11:38:08+0100</time></trkpt>
+<trkpt lat="48.454840" lon="18.870700"><ele>860</ele><time>2017-01-22T11:38:10+0100</time></trkpt>
+<trkpt lat="48.454740" lon="18.870671"><ele>860</ele><time>2017-01-22T11:38:16+0100</time></trkpt>
+<trkpt lat="48.454644" lon="18.870596"><ele>864</ele><time>2017-01-22T11:38:22+0100</time></trkpt>
+<trkpt lat="48.454557" lon="18.870515"><ele>864</ele><time>2017-01-22T11:38:29+0100</time></trkpt>
+<trkpt lat="48.454456" lon="18.870466"><ele>863</ele><time>2017-01-22T11:38:33+0100</time></trkpt>
+<trkpt lat="48.454346" lon="18.870410"><ele>862</ele><time>2017-01-22T11:38:39+0100</time></trkpt>
+<trkpt lat="48.454246" lon="18.870371"><ele>864</ele><time>2017-01-22T11:38:46+0100</time></trkpt>
+<trkpt lat="48.454152" lon="18.870305"><ele>867</ele><time>2017-01-22T11:38:52+0100</time></trkpt>
+<trkpt lat="48.454067" lon="18.870242"><ele>864</ele><time>2017-01-22T11:38:58+0100</time></trkpt>
+<trkpt lat="48.453975" lon="18.870205"><ele>858</ele><time>2017-01-22T11:39:07+0100</time></trkpt>
+<trkpt lat="48.453818" lon="18.870062"><ele>863</ele><time>2017-01-22T11:39:13+0100</time></trkpt>
+<trkpt lat="48.453749" lon="18.869940"><ele>861</ele><time>2017-01-22T11:39:19+0100</time></trkpt>
+<trkpt lat="48.453683" lon="18.869831"><ele>864</ele><time>2017-01-22T11:39:23+0100</time></trkpt>
+<trkpt lat="48.453622" lon="18.869719"><ele>863</ele><time>2017-01-22T11:39:28+0100</time></trkpt>
+<trkpt lat="48.453516" lon="18.869535"><ele>867</ele><time>2017-01-22T11:39:32+0100</time></trkpt>
+<trkpt lat="48.453455" lon="18.869421"><ele>873</ele><time>2017-01-22T11:39:38+0100</time></trkpt>
+<trkpt lat="48.453360" lon="18.869289"><ele>868</ele><time>2017-01-22T11:39:44+0100</time></trkpt>
+<trkpt lat="48.453273" lon="18.869175"><ele>867</ele><time>2017-01-22T11:39:51+0100</time></trkpt>
+<trkpt lat="48.453196" lon="18.869064"><ele>870</ele><time>2017-01-22T11:39:55+0100</time></trkpt>
+<trkpt lat="48.453131" lon="18.868961"><ele>869</ele><time>2017-01-22T11:39:59+0100</time></trkpt>
+<trkpt lat="48.453043" lon="18.868854"><ele>871</ele><time>2017-01-22T11:40:03+0100</time></trkpt>
+<trkpt lat="48.452936" lon="18.868758"><ele>866</ele><time>2017-01-22T11:40:10+0100</time></trkpt>
+<trkpt lat="48.452841" lon="18.868619"><ele>868</ele><time>2017-01-22T11:40:12+0100</time></trkpt>
+<trkpt lat="48.452769" lon="18.868440"><ele>868</ele><time>2017-01-22T11:40:16+0100</time></trkpt>
+<trkpt lat="48.452730" lon="18.868288"><ele>867</ele><time>2017-01-22T11:40:20+0100</time></trkpt>
+<trkpt lat="48.452643" lon="18.868163"><ele>865</ele><time>2017-01-22T11:40:24+0100</time></trkpt>
+<trkpt lat="48.452564" lon="18.868043"><ele>868</ele><time>2017-01-22T11:40:28+0100</time></trkpt>
+<trkpt lat="48.452478" lon="18.867919"><ele>866</ele><time>2017-01-22T11:40:33+0100</time></trkpt>
+<trkpt lat="48.452417" lon="18.867790"><ele>861</ele><time>2017-01-22T11:40:37+0100</time></trkpt>
+<trkpt lat="48.452363" lon="18.867637"><ele>862</ele><time>2017-01-22T11:40:41+0100</time></trkpt>
+<trkpt lat="48.452308" lon="18.867486"><ele>863</ele><time>2017-01-22T11:40:45+0100</time></trkpt>
+<trkpt lat="48.452238" lon="18.867347"><ele>860</ele><time>2017-01-22T11:40:49+0100</time></trkpt>
+<trkpt lat="48.452110" lon="18.867230"><ele>857</ele><time>2017-01-22T11:40:54+0100</time></trkpt>
+<trkpt lat="48.452000" lon="18.867208"><ele>853</ele><time>2017-01-22T11:40:58+0100</time></trkpt>
+<trkpt lat="48.451880" lon="18.867219"><ele>853</ele><time>2017-01-22T11:41:02+0100</time></trkpt>
+<trkpt lat="48.451770" lon="18.867241"><ele>850</ele><time>2017-01-22T11:41:06+0100</time></trkpt>
+<trkpt lat="48.451674" lon="18.867289"><ele>850</ele><time>2017-01-22T11:41:10+0100</time></trkpt>
+<trkpt lat="48.451561" lon="18.867329"><ele>850</ele><time>2017-01-22T11:41:16+0100</time></trkpt>
+<trkpt lat="48.451459" lon="18.867391"><ele>849</ele><time>2017-01-22T11:41:23+0100</time></trkpt>
+<trkpt lat="48.451353" lon="18.867340"><ele>851</ele><time>2017-01-22T11:41:27+0100</time></trkpt>
+<trkpt lat="48.451258" lon="18.867275"><ele>850</ele><time>2017-01-22T11:41:33+0100</time></trkpt>
+<trkpt lat="48.451182" lon="18.867162"><ele>849</ele><time>2017-01-22T11:41:39+0100</time></trkpt>
+<trkpt lat="48.451131" lon="18.866994"><ele>852</ele><time>2017-01-22T11:41:43+0100</time></trkpt>
+<trkpt lat="48.451048" lon="18.866818"><ele>856</ele><time>2017-01-22T11:41:48+0100</time></trkpt>
+<trkpt lat="48.450971" lon="18.866664"><ele>855</ele><time>2017-01-22T11:41:52+0100</time></trkpt>
+<trkpt lat="48.450884" lon="18.866462"><ele>852</ele><time>2017-01-22T11:41:56+0100</time></trkpt>
+<trkpt lat="48.450788" lon="18.866288"><ele>852</ele><time>2017-01-22T11:42:00+0100</time></trkpt>
+<trkpt lat="48.450598" lon="18.866158"><ele>844</ele><time>2017-01-22T11:42:04+0100</time></trkpt>
+<trkpt lat="48.450504" lon="18.866131"><ele>839</ele><time>2017-01-22T11:42:07+0100</time></trkpt>
+<trkpt lat="48.450371" lon="18.866107"><ele>836</ele><time>2017-01-22T11:42:11+0100</time></trkpt>
+<trkpt lat="48.450239" lon="18.866065"><ele>835</ele><time>2017-01-22T11:42:15+0100</time></trkpt>
+<trkpt lat="48.450153" lon="18.866011"><ele>838</ele><time>2017-01-22T11:42:19+0100</time></trkpt>
+<trkpt lat="48.450046" lon="18.865965"><ele>837</ele><time>2017-01-22T11:42:23+0100</time></trkpt>
+<trkpt lat="48.449930" lon="18.865904"><ele>840</ele><time>2017-01-22T11:42:30+0100</time></trkpt>
+<trkpt lat="48.449827" lon="18.865859"><ele>839</ele><time>2017-01-22T11:42:36+0100</time></trkpt>
+<trkpt lat="48.449723" lon="18.865868"><ele>836</ele><time>2017-01-22T11:42:42+0100</time></trkpt>
+<trkpt lat="48.449598" lon="18.865894"><ele>832</ele><time>2017-01-22T11:42:49+0100</time></trkpt>
+<trkpt lat="48.449430" lon="18.865914"><ele>830</ele><time>2017-01-22T11:42:53+0100</time></trkpt>
+<trkpt lat="48.449323" lon="18.865928"><ele>828</ele><time>2017-01-22T11:42:57+0100</time></trkpt>
+<trkpt lat="48.449223" lon="18.865946"><ele>827</ele><time>2017-01-22T11:43:01+0100</time></trkpt>
+<trkpt lat="48.449115" lon="18.865990"><ele>826</ele><time>2017-01-22T11:43:10+0100</time></trkpt>
+<trkpt lat="48.449011" lon="18.865978"><ele>831</ele><time>2017-01-22T11:43:16+0100</time></trkpt>
+<trkpt lat="48.448917" lon="18.865948"><ele>834</ele><time>2017-01-22T11:43:24+0100</time></trkpt>
+<trkpt lat="48.448821" lon="18.865936"><ele>837</ele><time>2017-01-22T11:43:31+0100</time></trkpt>
+<trkpt lat="48.448670" lon="18.865938"><ele>835</ele><time>2017-01-22T11:43:35+0100</time></trkpt>
+<trkpt lat="48.448544" lon="18.865977"><ele>835</ele><time>2017-01-22T11:43:39+0100</time></trkpt>
+<trkpt lat="48.448419" lon="18.865963"><ele>833</ele><time>2017-01-22T11:43:43+0100</time></trkpt>
+<trkpt lat="48.448267" lon="18.865963"><ele>831</ele><time>2017-01-22T11:43:47+0100</time></trkpt>
+<trkpt lat="48.448161" lon="18.865953"><ele>833</ele><time>2017-01-22T11:43:52+0100</time></trkpt>
+<trkpt lat="48.448107" lon="18.865813"><ele>834</ele><time>2017-01-22T11:44:00+0100</time></trkpt>
+<trkpt lat="48.448042" lon="18.865710"><ele>835</ele><time>2017-01-22T11:44:06+0100</time></trkpt>
+<trkpt lat="48.447988" lon="18.865540"><ele>836</ele><time>2017-01-22T11:44:10+0100</time></trkpt>
+<trkpt lat="48.447920" lon="18.865422"><ele>834</ele><time>2017-01-22T11:44:17+0100</time></trkpt>
+<trkpt lat="48.447822" lon="18.865327"><ele>844</ele><time>2017-01-22T11:45:17+0100</time></trkpt>
+<trkpt lat="48.447704" lon="18.865273"><ele>846</ele><time>2017-01-22T11:45:24+0100</time></trkpt>
+<trkpt lat="48.447609" lon="18.865190"><ele>845</ele><time>2017-01-22T11:45:32+0100</time></trkpt>
+<trkpt lat="48.447506" lon="18.865176"><ele>844</ele><time>2017-01-22T11:45:36+0100</time></trkpt>
+<trkpt lat="48.447363" lon="18.865178"><ele>841</ele><time>2017-01-22T11:45:40+0100</time></trkpt>
+<trkpt lat="48.447255" lon="18.865147"><ele>839</ele><time>2017-01-22T11:45:47+0100</time></trkpt>
+<trkpt lat="48.447150" lon="18.865133"><ele>838</ele><time>2017-01-22T11:45:53+0100</time></trkpt>
+<trkpt lat="48.447045" lon="18.865087"><ele>837</ele><time>2017-01-22T11:46:01+0100</time></trkpt>
+<trkpt lat="48.446948" lon="18.865032"><ele>839</ele><time>2017-01-22T11:46:06+0100</time></trkpt>
+<trkpt lat="48.446851" lon="18.865000"><ele>840</ele><time>2017-01-22T11:46:12+0100</time></trkpt>
+<trkpt lat="48.446747" lon="18.864974"><ele>840</ele><time>2017-01-22T11:46:20+0100</time></trkpt>
+<trkpt lat="48.446654" lon="18.864897"><ele>840</ele><time>2017-01-22T11:46:31+0100</time></trkpt>
+<trkpt lat="48.446561" lon="18.864830"><ele>844</ele><time>2017-01-22T11:46:54+0100</time></trkpt>
+<trkpt lat="48.446445" lon="18.864770"><ele>838</ele><time>2017-01-22T11:47:00+0100</time></trkpt>
+<trkpt lat="48.446362" lon="18.864685"><ele>839</ele><time>2017-01-22T11:47:06+0100</time></trkpt>
+<trkpt lat="48.446281" lon="18.864583"><ele>838</ele><time>2017-01-22T11:47:13+0100</time></trkpt>
+<trkpt lat="48.446231" lon="18.864406"><ele>838</ele><time>2017-01-22T11:47:17+0100</time></trkpt>
+<trkpt lat="48.446179" lon="18.864290"><ele>838</ele><time>2017-01-22T11:47:44+0100</time></trkpt>
+<trkpt lat="48.446139" lon="18.864090"><ele>837</ele><time>2017-01-22T11:47:51+0100</time></trkpt>
+<trkpt lat="48.446116" lon="18.863920"><ele>836</ele><time>2017-01-22T11:47:55+0100</time></trkpt>
+<trkpt lat="48.446117" lon="18.863770"><ele>832</ele><time>2017-01-22T11:47:59+0100</time></trkpt>
+<trkpt lat="48.446001" lon="18.863857"><ele>828</ele><time>2017-01-22T11:48:18+0100</time></trkpt>
+<trkpt lat="48.445879" lon="18.863985"><ele>830</ele><time>2017-01-22T11:48:22+0100</time></trkpt>
+<trkpt lat="48.445763" lon="18.864109"><ele>825</ele><time>2017-01-22T11:48:26+0100</time></trkpt>
+<trkpt lat="48.445666" lon="18.864269"><ele>824</ele><time>2017-01-22T11:48:30+0100</time></trkpt>
+<trkpt lat="48.445602" lon="18.864458"><ele>821</ele><time>2017-01-22T11:48:34+0100</time></trkpt>
+<trkpt lat="48.445504" lon="18.864436"><ele>819</ele><time>2017-01-22T11:48:47+0100</time></trkpt>
+<trkpt lat="48.445422" lon="18.864255"><ele>820</ele><time>2017-01-22T11:48:51+0100</time></trkpt>
+<trkpt lat="48.445342" lon="18.864080"><ele>815</ele><time>2017-01-22T11:48:55+0100</time></trkpt>
+<trkpt lat="48.445245" lon="18.863910"><ele>812</ele><time>2017-01-22T11:48:59+0100</time></trkpt>
+<trkpt lat="48.445139" lon="18.863755"><ele>810</ele><time>2017-01-22T11:49:03+0100</time></trkpt>
+<trkpt lat="48.445090" lon="18.863620"><ele>811</ele><time>2017-01-22T11:49:12+0100</time></trkpt>
+<trkpt lat="48.445098" lon="18.863475"><ele>814</ele><time>2017-01-22T11:49:22+0100</time></trkpt>
+<trkpt lat="48.445106" lon="18.863303"><ele>814</ele><time>2017-01-22T11:49:30+0100</time></trkpt>
+<trkpt lat="48.445087" lon="18.863128"><ele>814</ele><time>2017-01-22T11:49:35+0100</time></trkpt>
+<trkpt lat="48.445082" lon="18.862959"><ele>810</ele><time>2017-01-22T11:49:41+0100</time></trkpt>
+<trkpt lat="48.445077" lon="18.862766"><ele>812</ele><time>2017-01-22T11:49:47+0100</time></trkpt>
+<trkpt lat="48.445070" lon="18.862623"><ele>810</ele><time>2017-01-22T11:49:52+0100</time></trkpt>
+<trkpt lat="48.445077" lon="18.862461"><ele>810</ele><time>2017-01-22T11:49:56+0100</time></trkpt>
+<trkpt lat="48.445102" lon="18.862305"><ele>813</ele><time>2017-01-22T11:50:02+0100</time></trkpt>
+<trkpt lat="48.445131" lon="18.862168"><ele>811</ele><time>2017-01-22T11:50:08+0100</time></trkpt>
+<trkpt lat="48.445190" lon="18.862010"><ele>815</ele><time>2017-01-22T11:50:15+0100</time></trkpt>
+<trkpt lat="48.445235" lon="18.861863"><ele>814</ele><time>2017-01-22T11:50:21+0100</time></trkpt>
+<trkpt lat="48.445282" lon="18.861711"><ele>815</ele><time>2017-01-22T11:50:25+0100</time></trkpt>
+<trkpt lat="48.445329" lon="18.861554"><ele>815</ele><time>2017-01-22T11:50:34+0100</time></trkpt>
+<trkpt lat="48.445306" lon="18.861400"><ele>813</ele><time>2017-01-22T11:50:55+0100</time></trkpt>
+<trkpt lat="48.445292" lon="18.861237"><ele>816</ele><time>2017-01-22T11:51:03+0100</time></trkpt>
+<trkpt lat="48.445290" lon="18.861080"><ele>818</ele><time>2017-01-22T11:51:11+0100</time></trkpt>
+<trkpt lat="48.445281" lon="18.860935"><ele>820</ele><time>2017-01-22T11:51:19+0100</time></trkpt>
+<trkpt lat="48.445296" lon="18.860795"><ele>819</ele><time>2017-01-22T11:51:30+0100</time></trkpt>
+<trkpt lat="48.445282" lon="18.860644"><ele>815</ele><time>2017-01-22T11:51:40+0100</time></trkpt>
+<trkpt lat="48.445251" lon="18.860514"><ele>819</ele><time>2017-01-22T11:51:49+0100</time></trkpt>
+<trkpt lat="48.445221" lon="18.860364"><ele>821</ele><time>2017-01-22T11:51:57+0100</time></trkpt>
+<trkpt lat="48.445180" lon="18.860203"><ele>825</ele><time>2017-01-22T11:52:06+0100</time></trkpt>
+<trkpt lat="48.445117" lon="18.860048"><ele>823</ele><time>2017-01-22T11:52:10+0100</time></trkpt>
+<trkpt lat="48.445051" lon="18.859885"><ele>820</ele><time>2017-01-22T11:52:12+0100</time></trkpt>
+<trkpt lat="48.444998" lon="18.859756"><ele>817</ele><time>2017-01-22T11:52:14+0100</time></trkpt>
+<trkpt lat="48.444916" lon="18.859620"><ele>816</ele><time>2017-01-22T11:52:16+0100</time></trkpt>
+<trkpt lat="48.444851" lon="18.859500"><ele>815</ele><time>2017-01-22T11:52:18+0100</time></trkpt>
+<trkpt lat="48.444768" lon="18.859337"><ele>817</ele><time>2017-01-22T11:52:22+0100</time></trkpt>
+<trkpt lat="48.444723" lon="18.859111"><ele>814</ele><time>2017-01-22T11:52:27+0100</time></trkpt>
+<trkpt lat="48.444641" lon="18.858887"><ele>815</ele><time>2017-01-22T11:52:29+0100</time></trkpt>
+<trkpt lat="48.444555" lon="18.858640"><ele>814</ele><time>2017-01-22T11:52:33+0100</time></trkpt>
+<trkpt lat="48.444490" lon="18.858465"><ele>814</ele><time>2017-01-22T11:52:37+0100</time></trkpt>
+<trkpt lat="48.444403" lon="18.858260"><ele>810</ele><time>2017-01-22T11:52:41+0100</time></trkpt>
+<trkpt lat="48.444330" lon="18.858044"><ele>808</ele><time>2017-01-22T11:52:46+0100</time></trkpt>
+<trkpt lat="48.444292" lon="18.857920"><ele>805</ele><time>2017-01-22T11:52:50+0100</time></trkpt>
+<trkpt lat="48.444194" lon="18.857772"><ele>802</ele><time>2017-01-22T11:52:52+0100</time></trkpt>
+<trkpt lat="48.444115" lon="18.857600"><ele>801</ele><time>2017-01-22T11:52:56+0100</time></trkpt>
+<trkpt lat="48.444047" lon="18.857485"><ele>804</ele><time>2017-01-22T11:53:04+0100</time></trkpt>
+<trkpt lat="48.443969" lon="18.857368"><ele>800</ele><time>2017-01-22T11:53:21+0100</time></trkpt>
+<trkpt lat="48.443892" lon="18.857272"><ele>802</ele><time>2017-01-22T11:53:27+0100</time></trkpt>
+<trkpt lat="48.443798" lon="18.857175"><ele>803</ele><time>2017-01-22T11:53:34+0100</time></trkpt>
+<trkpt lat="48.443697" lon="18.857120"><ele>798</ele><time>2017-01-22T11:53:48+0100</time></trkpt>
+<trkpt lat="48.443576" lon="18.857068"><ele>799</ele><time>2017-01-22T11:53:55+0100</time></trkpt>
+<trkpt lat="48.443462" lon="18.857036"><ele>801</ele><time>2017-01-22T11:54:01+0100</time></trkpt>
+<trkpt lat="48.443363" lon="18.856989"><ele>803</ele><time>2017-01-22T11:54:07+0100</time></trkpt>
+<trkpt lat="48.443261" lon="18.856946"><ele>802</ele><time>2017-01-22T11:54:13+0100</time></trkpt>
+<trkpt lat="48.443158" lon="18.856916"><ele>805</ele><time>2017-01-22T11:54:19+0100</time></trkpt>
+<trkpt lat="48.443041" lon="18.856870"><ele>806</ele><time>2017-01-22T11:54:26+0100</time></trkpt>
+<trkpt lat="48.442912" lon="18.856859"><ele>803</ele><time>2017-01-22T11:54:30+0100</time></trkpt>
+<trkpt lat="48.442801" lon="18.856881"><ele>804</ele><time>2017-01-22T11:54:36+0100</time></trkpt>
+<trkpt lat="48.442710" lon="18.856918"><ele>805</ele><time>2017-01-22T11:54:43+0100</time></trkpt>
+<trkpt lat="48.442610" lon="18.856930"><ele>807</ele><time>2017-01-22T11:54:49+0100</time></trkpt>
+<trkpt lat="48.442511" lon="18.856976"><ele>811</ele><time>2017-01-22T11:54:57+0100</time></trkpt>
+<trkpt lat="48.442430" lon="18.857049"><ele>809</ele><time>2017-01-22T11:55:06+0100</time></trkpt>
+<trkpt lat="48.442330" lon="18.857113"><ele>809</ele><time>2017-01-22T11:55:12+0100</time></trkpt>
+<trkpt lat="48.442225" lon="18.857142"><ele>810</ele><time>2017-01-22T11:55:20+0100</time></trkpt>
+<trkpt lat="48.442123" lon="18.857118"><ele>808</ele><time>2017-01-22T11:55:29+0100</time></trkpt>
+<trkpt lat="48.442016" lon="18.857126"><ele>807</ele><time>2017-01-22T11:55:35+0100</time></trkpt>
+<trkpt lat="48.441902" lon="18.857139"><ele>807</ele><time>2017-01-22T11:55:39+0100</time></trkpt>
+<trkpt lat="48.441793" lon="18.857136"><ele>808</ele><time>2017-01-22T11:55:45+0100</time></trkpt>
+<trkpt lat="48.441674" lon="18.857122"><ele>805</ele><time>2017-01-22T11:55:52+0100</time></trkpt>
+<trkpt lat="48.441569" lon="18.857089"><ele>805</ele><time>2017-01-22T11:55:58+0100</time></trkpt>
+<trkpt lat="48.441469" lon="18.857014"><ele>803</ele><time>2017-01-22T11:56:02+0100</time></trkpt>
+<trkpt lat="48.441358" lon="18.856929"><ele>802</ele><time>2017-01-22T11:56:08+0100</time></trkpt>
+<trkpt lat="48.441351" lon="18.856789"><ele>806</ele><time>2017-01-22T11:56:16+0100</time></trkpt>
+<trkpt lat="48.441424" lon="18.856635"><ele>808</ele><time>2017-01-22T11:57:08+0100</time></trkpt>
+<trkpt lat="48.441460" lon="18.856493"><ele>810</ele><time>2017-01-22T11:57:13+0100</time></trkpt>
+<trkpt lat="48.441513" lon="18.856346"><ele>809</ele><time>2017-01-22T11:57:17+0100</time></trkpt>
+<trkpt lat="48.441563" lon="18.856173"><ele>809</ele><time>2017-01-22T11:57:23+0100</time></trkpt>
+<trkpt lat="48.441624" lon="18.856038"><ele>808</ele><time>2017-01-22T11:57:29+0100</time></trkpt>
+<trkpt lat="48.441663" lon="18.855894"><ele>812</ele><time>2017-01-22T11:57:36+0100</time></trkpt>
+<trkpt lat="48.441697" lon="18.855709"><ele>813</ele><time>2017-01-22T11:57:48+0100</time></trkpt>
+<trkpt lat="48.441749" lon="18.855572"><ele>814</ele><time>2017-01-22T11:57:54+0100</time></trkpt>
+<trkpt lat="48.441793" lon="18.855441"><ele>813</ele><time>2017-01-22T11:57:58+0100</time></trkpt>
+<trkpt lat="48.441845" lon="18.855271"><ele>808</ele><time>2017-01-22T11:58:03+0100</time></trkpt>
+<trkpt lat="48.441909" lon="18.855095"><ele>810</ele><time>2017-01-22T11:58:07+0100</time></trkpt>
+<trkpt lat="48.441960" lon="18.854923"><ele>807</ele><time>2017-01-22T11:58:11+0100</time></trkpt>
+<trkpt lat="48.441980" lon="18.854777"><ele>808</ele><time>2017-01-22T11:58:15+0100</time></trkpt>
+<trkpt lat="48.441975" lon="18.854583"><ele>808</ele><time>2017-01-22T11:58:22+0100</time></trkpt>
+<trkpt lat="48.441952" lon="18.854419"><ele>808</ele><time>2017-01-22T11:58:26+0100</time></trkpt>
+<trkpt lat="48.441882" lon="18.854295"><ele>811</ele><time>2017-01-22T11:58:30+0100</time></trkpt>
+<trkpt lat="48.441809" lon="18.854200"><ele>812</ele><time>2017-01-22T11:58:34+0100</time></trkpt>
+<trkpt lat="48.441740" lon="18.854094"><ele>812</ele><time>2017-01-22T11:58:38+0100</time></trkpt>
+<trkpt lat="48.441690" lon="18.853948"><ele>814</ele><time>2017-01-22T11:58:42+0100</time></trkpt>
+<trkpt lat="48.441657" lon="18.853756"><ele>810</ele><time>2017-01-22T11:58:46+0100</time></trkpt>
+<trkpt lat="48.441642" lon="18.853546"><ele>807</ele><time>2017-01-22T11:58:51+0100</time></trkpt>
+<trkpt lat="48.441661" lon="18.853337"><ele>807</ele><time>2017-01-22T11:58:55+0100</time></trkpt>
+<trkpt lat="48.441686" lon="18.853149"><ele>806</ele><time>2017-01-22T11:58:59+0100</time></trkpt>
+<trkpt lat="48.441699" lon="18.852963"><ele>807</ele><time>2017-01-22T11:59:03+0100</time></trkpt>
+<trkpt lat="48.441690" lon="18.852809"><ele>809</ele><time>2017-01-22T11:59:07+0100</time></trkpt>
+<trkpt lat="48.441645" lon="18.852668"><ele>810</ele><time>2017-01-22T11:59:14+0100</time></trkpt>
+<trkpt lat="48.441572" lon="18.852495"><ele>810</ele><time>2017-01-22T11:59:18+0100</time></trkpt>
+<trkpt lat="48.441541" lon="18.852340"><ele>807</ele><time>2017-01-22T11:59:22+0100</time></trkpt>
+<trkpt lat="48.441530" lon="18.852194"><ele>806</ele><time>2017-01-22T11:59:26+0100</time></trkpt>
+<trkpt lat="48.441528" lon="18.852036"><ele>808</ele><time>2017-01-22T11:59:31+0100</time></trkpt>
+<trkpt lat="48.441546" lon="18.851883"><ele>808</ele><time>2017-01-22T11:59:33+0100</time></trkpt>
+<trkpt lat="48.441576" lon="18.851731"><ele>810</ele><time>2017-01-22T11:59:37+0100</time></trkpt>
+<trkpt lat="48.441584" lon="18.851571"><ele>812</ele><time>2017-01-22T11:59:41+0100</time></trkpt>
+<trkpt lat="48.441598" lon="18.851376"><ele>810</ele><time>2017-01-22T11:59:45+0100</time></trkpt>
+<trkpt lat="48.441588" lon="18.851176"><ele>806</ele><time>2017-01-22T11:59:49+0100</time></trkpt>
+<trkpt lat="48.441548" lon="18.851039"><ele>806</ele><time>2017-01-22T11:59:54+0100</time></trkpt>
+<trkpt lat="48.441454" lon="18.850996"><ele>807</ele><time>2017-01-22T12:00:00+0100</time></trkpt>
+<trkpt lat="48.441356" lon="18.851016"><ele>806</ele><time>2017-01-22T12:00:07+0100</time></trkpt>
+<trkpt lat="48.441249" lon="18.851052"><ele>810</ele><time>2017-01-22T12:00:11+0100</time></trkpt>
+<trkpt lat="48.441120" lon="18.851114"><ele>809</ele><time>2017-01-22T12:00:15+0100</time></trkpt>
+<trkpt lat="48.440994" lon="18.851231"><ele>808</ele><time>2017-01-22T12:00:19+0100</time></trkpt>
+<trkpt lat="48.440870" lon="18.851355"><ele>807</ele><time>2017-01-22T12:00:23+0100</time></trkpt>
+<trkpt lat="48.440730" lon="18.851422"><ele>809</ele><time>2017-01-22T12:00:27+0100</time></trkpt>
+<trkpt lat="48.440608" lon="18.851448"><ele>806</ele><time>2017-01-22T12:00:31+0100</time></trkpt>
+<trkpt lat="48.440500" lon="18.851441"><ele>804</ele><time>2017-01-22T12:00:38+0100</time></trkpt>
+<trkpt lat="48.440378" lon="18.851427"><ele>802</ele><time>2017-01-22T12:00:42+0100</time></trkpt>
+<trkpt lat="48.440262" lon="18.851414"><ele>801</ele><time>2017-01-22T12:00:46+0100</time></trkpt>
+<trkpt lat="48.440129" lon="18.851426"><ele>800</ele><time>2017-01-22T12:00:50+0100</time></trkpt>
+<trkpt lat="48.440004" lon="18.851456"><ele>800</ele><time>2017-01-22T12:00:55+0100</time></trkpt>
+<trkpt lat="48.439876" lon="18.851495"><ele>795</ele><time>2017-01-22T12:00:59+0100</time></trkpt>
+<trkpt lat="48.439749" lon="18.851504"><ele>792</ele><time>2017-01-22T12:01:03+0100</time></trkpt>
+<trkpt lat="48.439630" lon="18.851489"><ele>790</ele><time>2017-01-22T12:01:05+0100</time></trkpt>
+<trkpt lat="48.439534" lon="18.851456"><ele>789</ele><time>2017-01-22T12:01:07+0100</time></trkpt>
+<trkpt lat="48.439412" lon="18.851394"><ele>788</ele><time>2017-01-22T12:01:09+0100</time></trkpt>
+<trkpt lat="48.439299" lon="18.851321"><ele>787</ele><time>2017-01-22T12:01:11+0100</time></trkpt>
+<trkpt lat="48.439205" lon="18.851320"><ele>785</ele><time>2017-01-22T12:01:13+0100</time></trkpt>
+<trkpt lat="48.439114" lon="18.851258"><ele>783</ele><time>2017-01-22T12:01:16+0100</time></trkpt>
+<trkpt lat="48.438943" lon="18.851188"><ele>778</ele><time>2017-01-22T12:01:18+0100</time></trkpt>
+<trkpt lat="48.438852" lon="18.850821"><ele>775</ele><time>2017-01-22T12:01:22+0100</time></trkpt>
+<trkpt lat="48.438791" lon="18.850670"><ele>774</ele><time>2017-01-22T12:01:24+0100</time></trkpt>
+<trkpt lat="48.438607" lon="18.850496"><ele>775</ele><time>2017-01-22T12:01:28+0100</time></trkpt>
+<trkpt lat="48.438502" lon="18.850434"><ele>776</ele><time>2017-01-22T12:01:32+0100</time></trkpt>
+<trkpt lat="48.438352" lon="18.850302"><ele>770</ele><time>2017-01-22T12:01:43+0100</time></trkpt>
+<trkpt lat="48.438239" lon="18.850221"><ele>767</ele><time>2017-01-22T12:01:47+0100</time></trkpt>
+<trkpt lat="48.438141" lon="18.850142"><ele>769</ele><time>2017-01-22T12:01:51+0100</time></trkpt>
+<trkpt lat="48.438070" lon="18.850013"><ele>772</ele><time>2017-01-22T12:01:58+0100</time></trkpt>
+<trkpt lat="48.438000" lon="18.849879"><ele>773</ele><time>2017-01-22T12:02:04+0100</time></trkpt>
+<trkpt lat="48.437907" lon="18.849769"><ele>776</ele><time>2017-01-22T12:02:08+0100</time></trkpt>
+<trkpt lat="48.437810" lon="18.849654"><ele>775</ele><time>2017-01-22T12:02:14+0100</time></trkpt>
+<trkpt lat="48.437724" lon="18.849589"><ele>773</ele><time>2017-01-22T12:02:21+0100</time></trkpt>
+<trkpt lat="48.437639" lon="18.849503"><ele>777</ele><time>2017-01-22T12:02:25+0100</time></trkpt>
+<trkpt lat="48.437549" lon="18.849407"><ele>783</ele><time>2017-01-22T12:02:31+0100</time></trkpt>
+<trkpt lat="48.437492" lon="18.849278"><ele>787</ele><time>2017-01-22T12:02:35+0100</time></trkpt>
+<trkpt lat="48.437431" lon="18.849167"><ele>783</ele><time>2017-01-22T12:02:40+0100</time></trkpt>
+<trkpt lat="48.437346" lon="18.848975"><ele>781</ele><time>2017-01-22T12:02:44+0100</time></trkpt>
+<trkpt lat="48.437299" lon="18.848848"><ele>778</ele><time>2017-01-22T12:02:48+0100</time></trkpt>
+<trkpt lat="48.437235" lon="18.848740"><ele>775</ele><time>2017-01-22T12:02:52+0100</time></trkpt>
+<trkpt lat="48.437182" lon="18.848605"><ele>776</ele><time>2017-01-22T12:02:58+0100</time></trkpt>
+<trkpt lat="48.437107" lon="18.848493"><ele>776</ele><time>2017-01-22T12:03:03+0100</time></trkpt>
+<trkpt lat="48.437019" lon="18.848378"><ele>776</ele><time>2017-01-22T12:03:07+0100</time></trkpt>
+<trkpt lat="48.436941" lon="18.848280"><ele>777</ele><time>2017-01-22T12:03:11+0100</time></trkpt>
+<trkpt lat="48.436884" lon="18.848145"><ele>776</ele><time>2017-01-22T12:03:15+0100</time></trkpt>
+<trkpt lat="48.436826" lon="18.848013"><ele>773</ele><time>2017-01-22T12:03:23+0100</time></trkpt>
+<trkpt lat="48.436744" lon="18.847904"><ele>771</ele><time>2017-01-22T12:03:30+0100</time></trkpt>
+<trkpt lat="48.436646" lon="18.847533"><ele>771</ele><time>2017-01-22T12:03:34+0100</time></trkpt>
+<trkpt lat="48.436607" lon="18.847329"><ele>773</ele><time>2017-01-22T12:03:38+0100</time></trkpt>
+<trkpt lat="48.436596" lon="18.847131"><ele>774</ele><time>2017-01-22T12:03:42+0100</time></trkpt>
+<trkpt lat="48.436591" lon="18.846926"><ele>774</ele><time>2017-01-22T12:03:46+0100</time></trkpt>
+<trkpt lat="48.436568" lon="18.846743"><ele>772</ele><time>2017-01-22T12:03:50+0100</time></trkpt>
+<trkpt lat="48.436532" lon="18.846564"><ele>774</ele><time>2017-01-22T12:03:55+0100</time></trkpt>
+<trkpt lat="48.436508" lon="18.846404"><ele>774</ele><time>2017-01-22T12:03:59+0100</time></trkpt>
+<trkpt lat="48.436504" lon="18.846230"><ele>773</ele><time>2017-01-22T12:04:03+0100</time></trkpt>
+<trkpt lat="48.436465" lon="18.846087"><ele>772</ele><time>2017-01-22T12:04:07+0100</time></trkpt>
+<trkpt lat="48.436414" lon="18.845974"><ele>772</ele><time>2017-01-22T12:04:11+0100</time></trkpt>
+<trkpt lat="48.436359" lon="18.845823"><ele>774</ele><time>2017-01-22T12:04:15+0100</time></trkpt>
+<trkpt lat="48.436352" lon="18.845676"><ele>773</ele><time>2017-01-22T12:04:22+0100</time></trkpt>
+<trkpt lat="48.436343" lon="18.845528"><ele>775</ele><time>2017-01-22T12:04:30+0100</time></trkpt>
+<trkpt lat="48.436302" lon="18.845398"><ele>775</ele><time>2017-01-22T12:04:36+0100</time></trkpt>
+<trkpt lat="48.436259" lon="18.845200"><ele>771</ele><time>2017-01-22T12:05:10+0100</time></trkpt>
+<trkpt lat="48.436177" lon="18.845124"><ele>770</ele><time>2017-01-22T12:09:59+0100</time></trkpt>
+<trkpt lat="48.436102" lon="18.845002"><ele>771</ele><time>2017-01-22T12:10:05+0100</time></trkpt>
+<trkpt lat="48.436043" lon="18.844867"><ele>779</ele><time>2017-01-22T12:10:12+0100</time></trkpt>
+<trkpt lat="48.435986" lon="18.844751"><ele>781</ele><time>2017-01-22T12:10:18+0100</time></trkpt>
+<trkpt lat="48.435925" lon="18.844643"><ele>784</ele><time>2017-01-22T12:10:28+0100</time></trkpt>
+<trkpt lat="48.435864" lon="18.844527"><ele>786</ele><time>2017-01-22T12:10:37+0100</time></trkpt>
+<trkpt lat="48.435823" lon="18.844398"><ele>785</ele><time>2017-01-22T12:10:52+0100</time></trkpt>
+<trkpt lat="48.435751" lon="18.844222"><ele>791</ele><time>2017-01-22T12:11:10+0100</time></trkpt>
+<trkpt lat="48.435675" lon="18.844125"><ele>793</ele><time>2017-01-22T12:11:23+0100</time></trkpt>
+<trkpt lat="48.435627" lon="18.843994"><ele>794</ele><time>2017-01-22T12:11:42+0100</time></trkpt>
+<trkpt lat="48.435539" lon="18.843930"><ele>794</ele><time>2017-01-22T12:11:52+0100</time></trkpt>
+<trkpt lat="48.435455" lon="18.843855"><ele>793</ele><time>2017-01-22T12:12:01+0100</time></trkpt>
+<trkpt lat="48.435371" lon="18.843756"><ele>796</ele><time>2017-01-22T12:12:09+0100</time></trkpt>
+<trkpt lat="48.435302" lon="18.843640"><ele>794</ele><time>2017-01-22T12:12:18+0100</time></trkpt>
+<trkpt lat="48.435280" lon="18.843484"><ele>794</ele><time>2017-01-22T12:12:24+0100</time></trkpt>
+<trkpt lat="48.435261" lon="18.843322"><ele>793</ele><time>2017-01-22T12:12:30+0100</time></trkpt>
+<trkpt lat="48.435280" lon="18.843147"><ele>793</ele><time>2017-01-22T12:12:36+0100</time></trkpt>
+<trkpt lat="48.435314" lon="18.843000"><ele>791</ele><time>2017-01-22T12:12:41+0100</time></trkpt>
+<trkpt lat="48.435334" lon="18.842848"><ele>792</ele><time>2017-01-22T12:12:49+0100</time></trkpt>
+<trkpt lat="48.435337" lon="18.842694"><ele>786</ele><time>2017-01-22T12:12:58+0100</time></trkpt>
+<trkpt lat="48.435336" lon="18.842530"><ele>786</ele><time>2017-01-22T12:13:04+0100</time></trkpt>
+<trkpt lat="48.435341" lon="18.842384"><ele>788</ele><time>2017-01-22T12:13:10+0100</time></trkpt>
+<trkpt lat="48.435328" lon="18.842240"><ele>790</ele><time>2017-01-22T12:13:25+0100</time></trkpt>
+<trkpt lat="48.435325" lon="18.842085"><ele>793</ele><time>2017-01-22T12:13:37+0100</time></trkpt>
+<trkpt lat="48.435274" lon="18.841952"><ele>795</ele><time>2017-01-22T12:13:45+0100</time></trkpt>
+<trkpt lat="48.435208" lon="18.841850"><ele>795</ele><time>2017-01-22T12:13:54+0100</time></trkpt>
+<trkpt lat="48.435169" lon="18.841706"><ele>792</ele><time>2017-01-22T12:14:04+0100</time></trkpt>
+<trkpt lat="48.435094" lon="18.841609"><ele>792</ele><time>2017-01-22T12:14:15+0100</time></trkpt>
+<trkpt lat="48.435085" lon="18.841467"><ele>800</ele><time>2017-01-22T12:14:27+0100</time></trkpt>
+<trkpt lat="48.435037" lon="18.841343"><ele>804</ele><time>2017-01-22T12:14:40+0100</time></trkpt>
+<trkpt lat="48.435005" lon="18.841198"><ele>804</ele><time>2017-01-22T12:14:52+0100</time></trkpt>
+<trkpt lat="48.435000" lon="18.841057"><ele>806</ele><time>2017-01-22T12:15:09+0100</time></trkpt>
+<trkpt lat="48.434983" lon="18.840910"><ele>805</ele><time>2017-01-22T12:15:18+0100</time></trkpt>
+<trkpt lat="48.434966" lon="18.840737"><ele>801</ele><time>2017-01-22T12:15:24+0100</time></trkpt>
+<trkpt lat="48.434970" lon="18.840595"><ele>806</ele><time>2017-01-22T12:15:34+0100</time></trkpt>
+<trkpt lat="48.434960" lon="18.840449"><ele>808</ele><time>2017-01-22T12:15:43+0100</time></trkpt>
+<trkpt lat="48.434944" lon="18.840306"><ele>810</ele><time>2017-01-22T12:15:51+0100</time></trkpt>
+<trkpt lat="48.434936" lon="18.840158"><ele>811</ele><time>2017-01-22T12:15:58+0100</time></trkpt>
+<trkpt lat="48.434924" lon="18.840010"><ele>807</ele><time>2017-01-22T12:17:31+0100</time></trkpt>
+<trkpt lat="48.434906" lon="18.839843"><ele>806</ele><time>2017-01-22T12:17:37+0100</time></trkpt>
+<trkpt lat="48.434908" lon="18.839693"><ele>808</ele><time>2017-01-22T12:17:41+0100</time></trkpt>
+<trkpt lat="48.434900" lon="18.839534"><ele>807</ele><time>2017-01-22T12:17:50+0100</time></trkpt>
+<trkpt lat="48.434899" lon="18.839375"><ele>805</ele><time>2017-01-22T12:17:56+0100</time></trkpt>
+<trkpt lat="48.434892" lon="18.839218"><ele>807</ele><time>2017-01-22T12:18:06+0100</time></trkpt>
+<trkpt lat="48.434881" lon="18.839075"><ele>807</ele><time>2017-01-22T12:18:13+0100</time></trkpt>
+<trkpt lat="48.434865" lon="18.838930"><ele>806</ele><time>2017-01-22T12:18:19+0100</time></trkpt>
+<trkpt lat="48.434844" lon="18.838720"><ele>804</ele><time>2017-01-22T12:19:46+0100</time></trkpt>
+<trkpt lat="48.434844" lon="18.838562"><ele>802</ele><time>2017-01-22T12:19:50+0100</time></trkpt>
+<trkpt lat="48.434859" lon="18.838386"><ele>801</ele><time>2017-01-22T12:19:57+0100</time></trkpt>
+<trkpt lat="48.434712" lon="18.838342"><ele>810</ele><time>2017-01-22T12:20:14+0100</time></trkpt>
+<trkpt lat="48.434465" lon="18.838335"><ele>803</ele><time>2017-01-22T12:20:18+0100</time></trkpt>
+<trkpt lat="48.434373" lon="18.838325"><ele>798</ele><time>2017-01-22T12:20:20+0100</time></trkpt>
+<trkpt lat="48.434228" lon="18.838291"><ele>794</ele><time>2017-01-22T12:20:24+0100</time></trkpt>
+<trkpt lat="48.434099" lon="18.838251"><ele>793</ele><time>2017-01-22T12:20:28+0100</time></trkpt>
+<trkpt lat="48.434014" lon="18.838174"><ele>791</ele><time>2017-01-22T12:20:32+0100</time></trkpt>
+<trkpt lat="48.433932" lon="18.838069"><ele>787</ele><time>2017-01-22T12:20:39+0100</time></trkpt>
+<trkpt lat="48.434064" lon="18.838040"><ele>787</ele><time>2017-01-22T12:21:45+0100</time></trkpt>
+<trkpt lat="48.434182" lon="18.837959"><ele>789</ele><time>2017-01-22T12:21:58+0100</time></trkpt>
+<trkpt lat="48.434288" lon="18.837912"><ele>788</ele><time>2017-01-22T12:22:04+0100</time></trkpt>
+<trkpt lat="48.434396" lon="18.837843"><ele>789</ele><time>2017-01-22T12:22:10+0100</time></trkpt>
+<trkpt lat="48.434488" lon="18.837791"><ele>790</ele><time>2017-01-22T12:22:16+0100</time></trkpt>
+<trkpt lat="48.434583" lon="18.837751"><ele>790</ele><time>2017-01-22T12:22:23+0100</time></trkpt>
+<trkpt lat="48.434669" lon="18.837661"><ele>790</ele><time>2017-01-22T12:22:31+0100</time></trkpt>
+<trkpt lat="48.434747" lon="18.837552"><ele>788</ele><time>2017-01-22T12:22:40+0100</time></trkpt>
+<trkpt lat="48.434849" lon="18.837537"><ele>788</ele><time>2017-01-22T12:22:46+0100</time></trkpt>
+<trkpt lat="48.434957" lon="18.837570"><ele>788</ele><time>2017-01-22T12:22:52+0100</time></trkpt>
+<trkpt lat="48.435044" lon="18.837613"><ele>785</ele><time>2017-01-22T12:22:58+0100</time></trkpt>
+<trkpt lat="48.435140" lon="18.837638"><ele>783</ele><time>2017-01-22T12:23:05+0100</time></trkpt>
+<trkpt lat="48.435242" lon="18.837662"><ele>783</ele><time>2017-01-22T12:23:09+0100</time></trkpt>
+<trkpt lat="48.435369" lon="18.837661"><ele>780</ele><time>2017-01-22T12:23:15+0100</time></trkpt>
+<trkpt lat="48.435483" lon="18.837690"><ele>782</ele><time>2017-01-22T12:23:17+0100</time></trkpt>
+<trkpt lat="48.435583" lon="18.837677"><ele>782</ele><time>2017-01-22T12:23:22+0100</time></trkpt>
+<trkpt lat="48.435760" lon="18.837551"><ele>786</ele><time>2017-01-22T12:23:26+0100</time></trkpt>
+<trkpt lat="48.435841" lon="18.837468"><ele>788</ele><time>2017-01-22T12:23:30+0100</time></trkpt>
+<trkpt lat="48.435915" lon="18.837363"><ele>786</ele><time>2017-01-22T12:23:38+0100</time></trkpt>
+<trkpt lat="48.435988" lon="18.837255"><ele>781</ele><time>2017-01-22T12:23:43+0100</time></trkpt>
+<trkpt lat="48.436089" lon="18.837097"><ele>775</ele><time>2017-01-22T12:24:43+0100</time></trkpt>
+<trkpt lat="48.436164" lon="18.836982"><ele>776</ele><time>2017-01-22T12:24:51+0100</time></trkpt>
+<trkpt lat="48.436243" lon="18.836870"><ele>779</ele><time>2017-01-22T12:24:57+0100</time></trkpt>
+<trkpt lat="48.436323" lon="18.836769"><ele>783</ele><time>2017-01-22T12:25:06+0100</time></trkpt>
+<trkpt lat="48.436396" lon="18.836684"><ele>786</ele><time>2017-01-22T12:25:12+0100</time></trkpt>
+<trkpt lat="48.436451" lon="18.836541"><ele>785</ele><time>2017-01-22T12:25:20+0100</time></trkpt>
+<trkpt lat="48.436506" lon="18.836419"><ele>787</ele><time>2017-01-22T12:25:29+0100</time></trkpt>
+<trkpt lat="48.436541" lon="18.836281"><ele>787</ele><time>2017-01-22T12:25:37+0100</time></trkpt>
+<trkpt lat="48.436570" lon="18.836133"><ele>789</ele><time>2017-01-22T12:25:48+0100</time></trkpt>
+<trkpt lat="48.436556" lon="18.835948"><ele>789</ele><time>2017-01-22T12:25:52+0100</time></trkpt>
+<trkpt lat="48.436570" lon="18.835787"><ele>787</ele><time>2017-01-22T12:26:00+0100</time></trkpt>
+<trkpt lat="48.436604" lon="18.835661"><ele>786</ele><time>2017-01-22T12:26:06+0100</time></trkpt>
+<trkpt lat="48.436625" lon="18.835502"><ele>786</ele><time>2017-01-22T12:26:13+0100</time></trkpt>
+<trkpt lat="48.436615" lon="18.835347"><ele>788</ele><time>2017-01-22T12:26:21+0100</time></trkpt>
+<trkpt lat="48.436566" lon="18.835208"><ele>787</ele><time>2017-01-22T12:26:32+0100</time></trkpt>
+<trkpt lat="48.436481" lon="18.835081"><ele>783</ele><time>2017-01-22T12:26:38+0100</time></trkpt>
+<trkpt lat="48.436426" lon="18.834921"><ele>780</ele><time>2017-01-22T12:26:44+0100</time></trkpt>
+<trkpt lat="48.436333" lon="18.834817"><ele>778</ele><time>2017-01-22T12:26:50+0100</time></trkpt>
+<trkpt lat="48.436251" lon="18.834687"><ele>778</ele><time>2017-01-22T12:26:57+0100</time></trkpt>
+<trkpt lat="48.436240" lon="18.834472"><ele>775</ele><time>2017-01-22T12:27:05+0100</time></trkpt>
+<trkpt lat="48.436175" lon="18.834378"><ele>774</ele><time>2017-01-22T12:27:46+0100</time></trkpt>
+<trkpt lat="48.436090" lon="18.834275"><ele>766</ele><time>2017-01-22T12:27:53+0100</time></trkpt>
+<trkpt lat="48.436041" lon="18.834135"><ele>764</ele><time>2017-01-22T12:27:55+0100</time></trkpt>
+<trkpt lat="48.435978" lon="18.833967"><ele>760</ele><time>2017-01-22T12:27:59+0100</time></trkpt>
+<trkpt lat="48.435920" lon="18.833788"><ele>755</ele><time>2017-01-22T12:28:03+0100</time></trkpt>
+<trkpt lat="48.435809" lon="18.833645"><ele>753</ele><time>2017-01-22T12:28:07+0100</time></trkpt>
+<trkpt lat="48.435738" lon="18.833486"><ele>752</ele><time>2017-01-22T12:28:12+0100</time></trkpt>
+<trkpt lat="48.435679" lon="18.833340"><ele>750</ele><time>2017-01-22T12:28:16+0100</time></trkpt>
+<trkpt lat="48.435678" lon="18.833166"><ele>750</ele><time>2017-01-22T12:28:20+0100</time></trkpt>
+<trkpt lat="48.435654" lon="18.833002"><ele>750</ele><time>2017-01-22T12:28:26+0100</time></trkpt>
+<trkpt lat="48.435583" lon="18.832837"><ele>752</ele><time>2017-01-22T12:28:33+0100</time></trkpt>
+<trkpt lat="48.435500" lon="18.832744"><ele>755</ele><time>2017-01-22T12:28:35+0100</time></trkpt>
+<trkpt lat="48.435443" lon="18.832576"><ele>753</ele><time>2017-01-22T12:28:41+0100</time></trkpt>
+<trkpt lat="48.435399" lon="18.832404"><ele>759</ele><time>2017-01-22T12:28:45+0100</time></trkpt>
+<trkpt lat="48.435353" lon="18.832283"><ele>765</ele><time>2017-01-22T12:28:54+0100</time></trkpt>
+<trkpt lat="48.435330" lon="18.832135"><ele>764</ele><time>2017-01-22T12:28:58+0100</time></trkpt>
+<trkpt lat="48.435304" lon="18.831997"><ele>766</ele><time>2017-01-22T12:29:02+0100</time></trkpt>
+<trkpt lat="48.435292" lon="18.831843"><ele>767</ele><time>2017-01-22T12:29:08+0100</time></trkpt>
+<trkpt lat="48.435252" lon="18.831690"><ele>766</ele><time>2017-01-22T12:29:15+0100</time></trkpt>
+<trkpt lat="48.435179" lon="18.831576"><ele>769</ele><time>2017-01-22T12:29:21+0100</time></trkpt>
+<trkpt lat="48.435187" lon="18.831392"><ele>766</ele><time>2017-01-22T12:29:31+0100</time></trkpt>
+<trkpt lat="48.435235" lon="18.831266"><ele>765</ele><time>2017-01-22T12:29:38+0100</time></trkpt>
+<trkpt lat="48.435245" lon="18.831071"><ele>768</ele><time>2017-01-22T12:29:57+0100</time></trkpt>
+<trkpt lat="48.435329" lon="18.830978"><ele>772</ele><time>2017-01-22T12:30:16+0100</time></trkpt>
+<trkpt lat="48.435438" lon="18.830952"><ele>780</ele><time>2017-01-22T12:30:32+0100</time></trkpt>
+<trkpt lat="48.435544" lon="18.830867"><ele>776</ele><time>2017-01-22T12:31:45+0100</time></trkpt>
+<trkpt lat="48.435645" lon="18.830772"><ele>776</ele><time>2017-01-22T12:31:52+0100</time></trkpt>
+<trkpt lat="48.435764" lon="18.830736"><ele>767</ele><time>2017-01-22T12:31:58+0100</time></trkpt>
+<trkpt lat="48.435870" lon="18.830727"><ele>763</ele><time>2017-01-22T12:32:04+0100</time></trkpt>
+<trkpt lat="48.435957" lon="18.830649"><ele>771</ele><time>2017-01-22T12:32:13+0100</time></trkpt>
+<trkpt lat="48.436042" lon="18.830600"><ele>773</ele><time>2017-01-22T12:32:23+0100</time></trkpt>
+<trkpt lat="48.436119" lon="18.830476"><ele>769</ele><time>2017-01-22T12:32:38+0100</time></trkpt>
+<trkpt lat="48.436185" lon="18.830367"><ele>770</ele><time>2017-01-22T12:32:42+0100</time></trkpt>
+<trkpt lat="48.436246" lon="18.830262"><ele>774</ele><time>2017-01-22T12:32:46+0100</time></trkpt>
+<trkpt lat="48.436312" lon="18.830148"><ele>773</ele><time>2017-01-22T12:32:50+0100</time></trkpt>
+<trkpt lat="48.436360" lon="18.830020"><ele>777</ele><time>2017-01-22T12:32:59+0100</time></trkpt>
+<trkpt lat="48.436377" lon="18.829887"><ele>786</ele><time>2017-01-22T12:33:24+0100</time></trkpt>
+<trkpt lat="48.436473" lon="18.829863"><ele>780</ele><time>2017-01-22T12:34:29+0100</time></trkpt>
+<trkpt lat="48.436588" lon="18.829854"><ele>787</ele><time>2017-01-22T12:35:00+0100</time></trkpt>
+<trkpt lat="48.436684" lon="18.829904"><ele>790</ele><time>2017-01-22T12:35:08+0100</time></trkpt>
+<trkpt lat="48.436778" lon="18.829947"><ele>792</ele><time>2017-01-22T12:35:15+0100</time></trkpt>
+<trkpt lat="48.436884" lon="18.829956"><ele>801</ele><time>2017-01-22T12:35:23+0100</time></trkpt>
+<trkpt lat="48.436955" lon="18.830049"><ele>795</ele><time>2017-01-22T12:35:29+0100</time></trkpt>
+<trkpt lat="48.437079" lon="18.830116"><ele>798</ele><time>2017-01-22T12:36:40+0100</time></trkpt>
+<trkpt lat="48.437186" lon="18.830086"><ele>791</ele><time>2017-01-22T12:36:46+0100</time></trkpt>
+<trkpt lat="48.437280" lon="18.830068"><ele>791</ele><time>2017-01-22T12:36:51+0100</time></trkpt>
+<trkpt lat="48.437390" lon="18.830083"><ele>796</ele><time>2017-01-22T12:36:59+0100</time></trkpt>
+<trkpt lat="48.437505" lon="18.829986"><ele>800</ele><time>2017-01-22T12:37:51+0100</time></trkpt>
+<trkpt lat="48.437618" lon="18.829876"><ele>789</ele><time>2017-01-22T12:37:57+0100</time></trkpt>
+<trkpt lat="48.437697" lon="18.829770"><ele>787</ele><time>2017-01-22T12:38:01+0100</time></trkpt>
+<trkpt lat="48.437808" lon="18.829667"><ele>784</ele><time>2017-01-22T12:38:07+0100</time></trkpt>
+<trkpt lat="48.437891" lon="18.829578"><ele>779</ele><time>2017-01-22T12:38:14+0100</time></trkpt>
+<trkpt lat="48.437976" lon="18.829484"><ele>779</ele><time>2017-01-22T12:38:18+0100</time></trkpt>
+<trkpt lat="48.438049" lon="18.829329"><ele>781</ele><time>2017-01-22T12:38:22+0100</time></trkpt>
+<trkpt lat="48.438103" lon="18.829165"><ele>783</ele><time>2017-01-22T12:38:26+0100</time></trkpt>
+<trkpt lat="48.438144" lon="18.828941"><ele>783</ele><time>2017-01-22T12:38:31+0100</time></trkpt>
+<trkpt lat="48.438197" lon="18.828784"><ele>787</ele><time>2017-01-22T12:38:35+0100</time></trkpt>
+<trkpt lat="48.438276" lon="18.828631"><ele>781</ele><time>2017-01-22T12:38:41+0100</time></trkpt>
+<trkpt lat="48.438357" lon="18.828525"><ele>780</ele><time>2017-01-22T12:38:46+0100</time></trkpt>
+<trkpt lat="48.438315" lon="18.828379"><ele>774</ele><time>2017-01-22T12:38:50+0100</time></trkpt>
+<trkpt lat="48.438207" lon="18.828385"><ele>770</ele><time>2017-01-22T12:38:56+0100</time></trkpt>
+<trkpt lat="48.438334" lon="18.828348"><ele>778</ele><time>2017-01-22T12:39:29+0100</time></trkpt>
+<trkpt lat="48.438419" lon="18.828399"><ele>772</ele><time>2017-01-22T12:39:33+0100</time></trkpt>
+<trkpt lat="48.438514" lon="18.828493"><ele>773</ele><time>2017-01-22T12:39:42+0100</time></trkpt>
+<trkpt lat="48.438640" lon="18.828579"><ele>770</ele><time>2017-01-22T12:39:46+0100</time></trkpt>
+<trkpt lat="48.438824" lon="18.828560"><ele>771</ele><time>2017-01-22T12:39:54+0100</time></trkpt>
+<trkpt lat="48.439098" lon="18.828652"><ele>769</ele><time>2017-01-22T12:39:56+0100</time></trkpt>
+<trkpt lat="48.439071" lon="18.828423"><ele>772</ele><time>2017-01-22T12:40:00+0100</time></trkpt>
+<trkpt lat="48.438991" lon="18.828499"><ele>771</ele><time>2017-01-22T12:40:02+0100</time></trkpt>
+<trkpt lat="48.438948" lon="18.828686"><ele>769</ele><time>2017-01-22T12:40:07+0100</time></trkpt>
+<trkpt lat="48.439016" lon="18.828787"><ele>764</ele><time>2017-01-22T12:40:17+0100</time></trkpt>
+<trkpt lat="48.439103" lon="18.828857"><ele>756</ele><time>2017-01-22T12:40:30+0100</time></trkpt>
+<trkpt lat="48.439196" lon="18.828865"><ele>757</ele><time>2017-01-22T12:41:28+0100</time></trkpt>
+<trkpt lat="48.439301" lon="18.828932"><ele>745</ele><time>2017-01-22T12:41:32+0100</time></trkpt>
+<trkpt lat="48.439419" lon="18.829002"><ele>744</ele><time>2017-01-22T12:41:37+0100</time></trkpt>
+<trkpt lat="48.439536" lon="18.829009"><ele>749</ele><time>2017-01-22T12:41:41+0100</time></trkpt>
+<trkpt lat="48.439626" lon="18.829066"><ele>748</ele><time>2017-01-22T12:41:45+0100</time></trkpt>
+<trkpt lat="48.439738" lon="18.829091"><ele>749</ele><time>2017-01-22T12:41:51+0100</time></trkpt>
+<trkpt lat="48.439839" lon="18.829114"><ele>750</ele><time>2017-01-22T12:41:58+0100</time></trkpt>
+<trkpt lat="48.439924" lon="18.829060"><ele>751</ele><time>2017-01-22T12:42:02+0100</time></trkpt>
+<trkpt lat="48.440032" lon="18.829018"><ele>755</ele><time>2017-01-22T12:42:06+0100</time></trkpt>
+<trkpt lat="48.440124" lon="18.828956"><ele>758</ele><time>2017-01-22T12:42:16+0100</time></trkpt>
+<trkpt lat="48.440238" lon="18.828881"><ele>757</ele><time>2017-01-22T12:42:54+0100</time></trkpt>
+<trkpt lat="48.440340" lon="18.828805"><ele>754</ele><time>2017-01-22T12:42:58+0100</time></trkpt>
+<trkpt lat="48.440438" lon="18.828740"><ele>752</ele><time>2017-01-22T12:43:02+0100</time></trkpt>
+<trkpt lat="48.440532" lon="18.828664"><ele>753</ele><time>2017-01-22T12:43:09+0100</time></trkpt>
+<trkpt lat="48.440611" lon="18.828584"><ele>762</ele><time>2017-01-22T12:43:17+0100</time></trkpt>
+<trkpt lat="48.440692" lon="18.828450"><ele>763</ele><time>2017-01-22T12:43:23+0100</time></trkpt>
+<trkpt lat="48.440752" lon="18.828339"><ele>764</ele><time>2017-01-22T12:43:30+0100</time></trkpt>
+<trkpt lat="48.440738" lon="18.828196"><ele>765</ele><time>2017-01-22T12:43:38+0100</time></trkpt>
+<trkpt lat="48.440810" lon="18.828063"><ele>754</ele><time>2017-01-22T12:43:42+0100</time></trkpt>
+<trkpt lat="48.440826" lon="18.827900"><ele>756</ele><time>2017-01-22T12:44:20+0100</time></trkpt>
+<trkpt lat="48.440844" lon="18.827733"><ele>751</ele><time>2017-01-22T12:44:24+0100</time></trkpt>
+<trkpt lat="48.440881" lon="18.827499"><ele>740</ele><time>2017-01-22T12:44:32+0100</time></trkpt>
+<trkpt lat="48.440944" lon="18.827392"><ele>733</ele><time>2017-01-22T12:45:39+0100</time></trkpt>
+<trkpt lat="48.441038" lon="18.827362"><ele>741</ele><time>2017-01-22T12:45:54+0100</time></trkpt>
+<trkpt lat="48.441137" lon="18.827366"><ele>745</ele><time>2017-01-22T12:46:11+0100</time></trkpt>
+<trkpt lat="48.441231" lon="18.827407"><ele>748</ele><time>2017-01-22T12:46:25+0100</time></trkpt>
+<trkpt lat="48.441324" lon="18.827367"><ele>751</ele><time>2017-01-22T12:46:34+0100</time></trkpt>
+<trkpt lat="48.441417" lon="18.827293"><ele>752</ele><time>2017-01-22T12:46:40+0100</time></trkpt>
+<trkpt lat="48.441520" lon="18.827243"><ele>762</ele><time>2017-01-22T12:46:46+0100</time></trkpt>
+<trkpt lat="48.441596" lon="18.827160"><ele>764</ele><time>2017-01-22T12:46:57+0100</time></trkpt>
+<trkpt lat="48.441664" lon="18.827040"><ele>760</ele><time>2017-01-22T12:47:24+0100</time></trkpt>
+<trkpt lat="48.441711" lon="18.826897"><ele>760</ele><time>2017-01-22T12:47:28+0100</time></trkpt>
+<trkpt lat="48.441765" lon="18.826750"><ele>757</ele><time>2017-01-22T12:47:32+0100</time></trkpt>
+<trkpt lat="48.441795" lon="18.826614"><ele>758</ele><time>2017-01-22T12:47:37+0100</time></trkpt>
+<trkpt lat="48.441819" lon="18.826448"><ele>765</ele><time>2017-01-22T12:47:41+0100</time></trkpt>
+<trkpt lat="48.441837" lon="18.826309"><ele>765</ele><time>2017-01-22T12:47:49+0100</time></trkpt>
+<trkpt lat="48.441854" lon="18.826166"><ele>766</ele><time>2017-01-22T12:47:58+0100</time></trkpt>
+<trkpt lat="48.441849" lon="18.826005"><ele>759</ele><time>2017-01-22T12:48:04+0100</time></trkpt>
+<trkpt lat="48.441869" lon="18.825821"><ele>760</ele><time>2017-01-22T12:48:10+0100</time></trkpt>
+<trkpt lat="48.441915" lon="18.825672"><ele>759</ele><time>2017-01-22T12:48:14+0100</time></trkpt>
+<trkpt lat="48.441929" lon="18.825499"><ele>760</ele><time>2017-01-22T12:48:23+0100</time></trkpt>
+<trkpt lat="48.441931" lon="18.825346"><ele>759</ele><time>2017-01-22T12:48:29+0100</time></trkpt>
+<trkpt lat="48.441977" lon="18.825199"><ele>759</ele><time>2017-01-22T12:48:37+0100</time></trkpt>
+<trkpt lat="48.442013" lon="18.825056"><ele>759</ele><time>2017-01-22T12:48:48+0100</time></trkpt>
+<trkpt lat="48.442083" lon="18.824888"><ele>749</ele><time>2017-01-22T12:49:09+0100</time></trkpt>
+<trkpt lat="48.442179" lon="18.824872"><ele>742</ele><time>2017-01-22T12:50:13+0100</time></trkpt>
+<trkpt lat="48.442275" lon="18.824979"><ele>741</ele><time>2017-01-22T12:50:20+0100</time></trkpt>
+<trkpt lat="48.442360" lon="18.825090"><ele>737</ele><time>2017-01-22T12:50:24+0100</time></trkpt>
+<trkpt lat="48.442442" lon="18.825185"><ele>733</ele><time>2017-01-22T12:50:32+0100</time></trkpt>
+<trkpt lat="48.442528" lon="18.825252"><ele>732</ele><time>2017-01-22T12:50:45+0100</time></trkpt>
+<trkpt lat="48.442609" lon="18.825314"><ele>731</ele><time>2017-01-22T12:51:31+0100</time></trkpt>
+<trkpt lat="48.442654" lon="18.825457"><ele>724</ele><time>2017-01-22T12:51:37+0100</time></trkpt>
+<trkpt lat="48.442743" lon="18.825525"><ele>728</ele><time>2017-01-22T12:51:46+0100</time></trkpt>
+<trkpt lat="48.442869" lon="18.825529"><ele>729</ele><time>2017-01-22T12:51:52+0100</time></trkpt>
+<trkpt lat="48.442976" lon="18.825589"><ele>729</ele><time>2017-01-22T12:51:58+0100</time></trkpt>
+<trkpt lat="48.443081" lon="18.825605"><ele>727</ele><time>2017-01-22T12:52:04+0100</time></trkpt>
+<trkpt lat="48.443184" lon="18.825685"><ele>719</ele><time>2017-01-22T12:52:11+0100</time></trkpt>
+<trkpt lat="48.443292" lon="18.825680"><ele>727</ele><time>2017-01-22T12:52:19+0100</time></trkpt>
+<trkpt lat="48.443386" lon="18.825701"><ele>737</ele><time>2017-01-22T12:52:32+0100</time></trkpt>
+<trkpt lat="48.443473" lon="18.825780"><ele>738</ele><time>2017-01-22T12:52:40+0100</time></trkpt>
+<trkpt lat="48.443569" lon="18.825826"><ele>742</ele><time>2017-01-22T12:52:49+0100</time></trkpt>
+<trkpt lat="48.443656" lon="18.825895"><ele>745</ele><time>2017-01-22T12:52:59+0100</time></trkpt>
+<trkpt lat="48.443753" lon="18.825946"><ele>746</ele><time>2017-01-22T12:53:07+0100</time></trkpt>
+<trkpt lat="48.443854" lon="18.826017"><ele>743</ele><time>2017-01-22T12:53:13+0100</time></trkpt>
+<trkpt lat="48.443844" lon="18.826165"><ele>741</ele><time>2017-01-22T12:53:24+0100</time></trkpt>
+<trkpt lat="48.443825" lon="18.826302"><ele>740</ele><time>2017-01-22T12:53:38+0100</time></trkpt>
+<trkpt lat="48.443856" lon="18.826446"><ele>738</ele><time>2017-01-22T12:53:49+0100</time></trkpt>
+<trkpt lat="48.443883" lon="18.826592"><ele>742</ele><time>2017-01-22T12:54:01+0100</time></trkpt>
+<trkpt lat="48.443861" lon="18.826740"><ele>753</ele><time>2017-01-22T12:54:14+0100</time></trkpt>
+<trkpt lat="48.443824" lon="18.826864"><ele>748</ele><time>2017-01-22T12:54:24+0100</time></trkpt>
+<trkpt lat="48.443789" lon="18.827030"><ele>753</ele><time>2017-01-22T12:55:02+0100</time></trkpt>
+<trkpt lat="48.443738" lon="18.827162"><ele>757</ele><time>2017-01-22T12:55:10+0100</time></trkpt>
+<trkpt lat="48.443685" lon="18.827291"><ele>749</ele><time>2017-01-22T12:55:16+0100</time></trkpt>
+<trkpt lat="48.443655" lon="18.827440"><ele>746</ele><time>2017-01-22T12:55:25+0100</time></trkpt>
+<trkpt lat="48.443606" lon="18.827570"><ele>754</ele><time>2017-01-22T12:55:33+0100</time></trkpt>
+<trkpt lat="48.443551" lon="18.827711"><ele>757</ele><time>2017-01-22T12:55:42+0100</time></trkpt>
+<trkpt lat="48.443514" lon="18.827861"><ele>764</ele><time>2017-01-22T12:55:46+0100</time></trkpt>
+<trkpt lat="48.443489" lon="18.828009"><ele>769</ele><time>2017-01-22T12:55:54+0100</time></trkpt>
+<trkpt lat="48.443461" lon="18.828150"><ele>773</ele><time>2017-01-22T12:56:03+0100</time></trkpt>
+<trkpt lat="48.443401" lon="18.828261"><ele>775</ele><time>2017-01-22T12:56:23+0100</time></trkpt>
+<trkpt lat="48.443303" lon="18.828367"><ele>768</ele><time>2017-01-22T12:56:44+0100</time></trkpt>
+<trkpt lat="48.443211" lon="18.828412"><ele>761</ele><time>2017-01-22T12:56:53+0100</time></trkpt>
+<trkpt lat="48.443144" lon="18.828511"><ele>769</ele><time>2017-01-22T12:57:03+0100</time></trkpt>
+<trkpt lat="48.443080" lon="18.828626"><ele>766</ele><time>2017-01-22T12:57:12+0100</time></trkpt>
+<trkpt lat="48.443009" lon="18.828732"><ele>774</ele><time>2017-01-22T12:57:22+0100</time></trkpt>
+<trkpt lat="48.442936" lon="18.828902"><ele>779</ele><time>2017-01-22T12:57:39+0100</time></trkpt>
+<trkpt lat="48.442899" lon="18.829027"><ele>792</ele><time>2017-01-22T12:57:54+0100</time></trkpt>
+<trkpt lat="48.442845" lon="18.829155"><ele>800</ele><time>2017-01-22T12:58:02+0100</time></trkpt>
+<trkpt lat="48.442778" lon="18.829284"><ele>801</ele><time>2017-01-22T12:58:10+0100</time></trkpt>
+<trkpt lat="48.442712" lon="18.829383"><ele>797</ele><time>2017-01-22T12:58:17+0100</time></trkpt>
+<trkpt lat="48.442642" lon="18.829486"><ele>800</ele><time>2017-01-22T12:58:23+0100</time></trkpt>
+<trkpt lat="48.442575" lon="18.829602"><ele>803</ele><time>2017-01-22T12:58:33+0100</time></trkpt>
+<trkpt lat="48.442588" lon="18.829745"><ele>802</ele><time>2017-01-22T12:58:42+0100</time></trkpt>
+<trkpt lat="48.442572" lon="18.829886"><ele>803</ele><time>2017-01-22T12:58:50+0100</time></trkpt>
+<trkpt lat="48.442604" lon="18.830038"><ele>803</ele><time>2017-01-22T12:58:58+0100</time></trkpt>
+<trkpt lat="48.442631" lon="18.830198"><ele>792</ele><time>2017-01-22T12:59:07+0100</time></trkpt>
+<trkpt lat="48.442665" lon="18.830327"><ele>789</ele><time>2017-01-22T12:59:09+0100</time></trkpt>
+<trkpt lat="48.442702" lon="18.830497"><ele>781</ele><time>2017-01-22T12:59:17+0100</time></trkpt>
+<trkpt lat="48.442675" lon="18.830670"><ele>774</ele><time>2017-01-22T12:59:23+0100</time></trkpt>
+<trkpt lat="48.442711" lon="18.830802"><ele>773</ele><time>2017-01-22T12:59:32+0100</time></trkpt>
+<trkpt lat="48.442752" lon="18.830936"><ele>767</ele><time>2017-01-22T12:59:38+0100</time></trkpt>
+<trkpt lat="48.442736" lon="18.831130"><ele>753</ele><time>2017-01-22T12:59:55+0100</time></trkpt>
+<trkpt lat="48.442677" lon="18.831248"><ele>751</ele><time>2017-01-22T13:00:07+0100</time></trkpt>
+<trkpt lat="48.442659" lon="18.831394"><ele>756</ele><time>2017-01-22T13:00:16+0100</time></trkpt>
+<trkpt lat="48.442585" lon="18.831521"><ele>751</ele><time>2017-01-22T13:00:24+0100</time></trkpt>
+<trkpt lat="48.442502" lon="18.831589"><ele>760</ele><time>2017-01-22T13:00:41+0100</time></trkpt>
+<trkpt lat="48.442448" lon="18.831722"><ele>760</ele><time>2017-01-22T13:00:51+0100</time></trkpt>
+<trkpt lat="48.442391" lon="18.831845"><ele>763</ele><time>2017-01-22T13:01:00+0100</time></trkpt>
+<trkpt lat="48.442384" lon="18.831987"><ele>765</ele><time>2017-01-22T13:01:08+0100</time></trkpt>
+<trkpt lat="48.442339" lon="18.832106"><ele>764</ele><time>2017-01-22T13:01:16+0100</time></trkpt>
+<trkpt lat="48.442258" lon="18.832194"><ele>760</ele><time>2017-01-22T13:01:25+0100</time></trkpt>
+<trkpt lat="48.442191" lon="18.832299"><ele>764</ele><time>2017-01-22T13:01:35+0100</time></trkpt>
+<trkpt lat="48.442126" lon="18.832420"><ele>763</ele><time>2017-01-22T13:01:46+0100</time></trkpt>
+<trkpt lat="48.442045" lon="18.832495"><ele>762</ele><time>2017-01-22T13:01:54+0100</time></trkpt>
+<trkpt lat="48.441951" lon="18.832550"><ele>753</ele><time>2017-01-22T13:02:03+0100</time></trkpt>
+<trkpt lat="48.441863" lon="18.832648"><ele>751</ele><time>2017-01-22T13:02:11+0100</time></trkpt>
+<trkpt lat="48.441807" lon="18.832776"><ele>754</ele><time>2017-01-22T13:02:22+0100</time></trkpt>
+<trkpt lat="48.441731" lon="18.832890"><ele>765</ele><time>2017-01-22T13:02:30+0100</time></trkpt>
+<trkpt lat="48.441643" lon="18.832934"><ele>772</ele><time>2017-01-22T13:02:45+0100</time></trkpt>
+<trkpt lat="48.441536" lon="18.832946"><ele>761</ele><time>2017-01-22T13:02:53+0100</time></trkpt>
+<trkpt lat="48.441439" lon="18.832916"><ele>759</ele><time>2017-01-22T13:03:04+0100</time></trkpt>
+<trkpt lat="48.441341" lon="18.832908"><ele>761</ele><time>2017-01-22T13:03:16+0100</time></trkpt>
+<trkpt lat="48.441246" lon="18.832858"><ele>758</ele><time>2017-01-22T13:03:27+0100</time></trkpt>
+<trkpt lat="48.441153" lon="18.832749"><ele>756</ele><time>2017-01-22T13:03:31+0100</time></trkpt>
+<trkpt lat="48.441045" lon="18.832732"><ele>753</ele><time>2017-01-22T13:03:41+0100</time></trkpt>
+<trkpt lat="48.440953" lon="18.832743"><ele>756</ele><time>2017-01-22T13:03:48+0100</time></trkpt>
+<trkpt lat="48.440848" lon="18.832818"><ele>758</ele><time>2017-01-22T13:03:56+0100</time></trkpt>
+<trkpt lat="48.440750" lon="18.832883"><ele>759</ele><time>2017-01-22T13:04:00+0100</time></trkpt>
+<trkpt lat="48.440648" lon="18.832975"><ele>756</ele><time>2017-01-22T13:04:07+0100</time></trkpt>
+<trkpt lat="48.440570" lon="18.833092"><ele>753</ele><time>2017-01-22T13:04:13+0100</time></trkpt>
+<trkpt lat="48.440532" lon="18.833216"><ele>762</ele><time>2017-01-22T13:04:23+0100</time></trkpt>
+<trkpt lat="48.440486" lon="18.833375"><ele>764</ele><time>2017-01-22T13:04:32+0100</time></trkpt>
+<trkpt lat="48.440425" lon="18.833486"><ele>761</ele><time>2017-01-22T13:04:46+0100</time></trkpt>
+<trkpt lat="48.440389" lon="18.833641"><ele>761</ele><time>2017-01-22T13:04:55+0100</time></trkpt>
+<trkpt lat="48.440320" lon="18.833743"><ele>763</ele><time>2017-01-22T13:05:03+0100</time></trkpt>
+<trkpt lat="48.440248" lon="18.833849"><ele>762</ele><time>2017-01-22T13:05:12+0100</time></trkpt>
+<trkpt lat="48.440226" lon="18.834024"><ele>760</ele><time>2017-01-22T13:05:16+0100</time></trkpt>
+<trkpt lat="48.440206" lon="18.834172"><ele>761</ele><time>2017-01-22T13:05:22+0100</time></trkpt>
+<trkpt lat="48.440128" lon="18.834245"><ele>769</ele><time>2017-01-22T13:05:33+0100</time></trkpt>
+<trkpt lat="48.440058" lon="18.834349"><ele>774</ele><time>2017-01-22T13:05:45+0100</time></trkpt>
+<trkpt lat="48.439993" lon="18.834456"><ele>774</ele><time>2017-01-22T13:05:56+0100</time></trkpt>
+<trkpt lat="48.439995" lon="18.834652"><ele>779</ele><time>2017-01-22T13:06:19+0100</time></trkpt>
+<trkpt lat="48.440011" lon="18.834858"><ele>768</ele><time>2017-01-22T13:06:35+0100</time></trkpt>
+<trkpt lat="48.439952" lon="18.834973"><ele>761</ele><time>2017-01-22T13:06:42+0100</time></trkpt>
+<trkpt lat="48.439910" lon="18.835114"><ele>765</ele><time>2017-01-22T13:06:54+0100</time></trkpt>
+<trkpt lat="48.439889" lon="18.835292"><ele>768</ele><time>2017-01-22T13:07:00+0100</time></trkpt>
+<trkpt lat="48.439857" lon="18.835453"><ele>774</ele><time>2017-01-22T13:07:07+0100</time></trkpt>
+<trkpt lat="48.439788" lon="18.835548"><ele>774</ele><time>2017-01-22T13:07:15+0100</time></trkpt>
+<trkpt lat="48.439706" lon="18.835621"><ele>768</ele><time>2017-01-22T13:07:23+0100</time></trkpt>
+<trkpt lat="48.439601" lon="18.835658"><ele>763</ele><time>2017-01-22T13:07:32+0100</time></trkpt>
+<trkpt lat="48.439509" lon="18.835691"><ele>761</ele><time>2017-01-22T13:07:36+0100</time></trkpt>
+<trkpt lat="48.439403" lon="18.835721"><ele>761</ele><time>2017-01-22T13:07:44+0100</time></trkpt>
+<trkpt lat="48.439303" lon="18.835799"><ele>759</ele><time>2017-01-22T13:07:48+0100</time></trkpt>
+<trkpt lat="48.439206" lon="18.835861"><ele>763</ele><time>2017-01-22T13:07:56+0100</time></trkpt>
+<trkpt lat="48.439112" lon="18.835907"><ele>764</ele><time>2017-01-22T13:08:05+0100</time></trkpt>
+<trkpt lat="48.439005" lon="18.835922"><ele>760</ele><time>2017-01-22T13:08:11+0100</time></trkpt>
+<trkpt lat="48.438927" lon="18.836013"><ele>757</ele><time>2017-01-22T13:08:19+0100</time></trkpt>
+<trkpt lat="48.438834" lon="18.836070"><ele>760</ele><time>2017-01-22T13:08:28+0100</time></trkpt>
+<trkpt lat="48.438750" lon="18.836138"><ele>758</ele><time>2017-01-22T13:08:36+0100</time></trkpt>
+<trkpt lat="48.438657" lon="18.836204"><ele>761</ele><time>2017-01-22T13:08:45+0100</time></trkpt>
+<trkpt lat="48.438583" lon="18.836301"><ele>760</ele><time>2017-01-22T13:09:01+0100</time></trkpt>
+<trkpt lat="48.438486" lon="18.836355"><ele>758</ele><time>2017-01-22T13:09:10+0100</time></trkpt>
+<trkpt lat="48.438392" lon="18.836394"><ele>764</ele><time>2017-01-22T13:09:20+0100</time></trkpt>
+<trkpt lat="48.438285" lon="18.836407"><ele>768</ele><time>2017-01-22T13:09:28+0100</time></trkpt>
+<trkpt lat="48.438182" lon="18.836428"><ele>769</ele><time>2017-01-22T13:09:35+0100</time></trkpt>
+<trkpt lat="48.438106" lon="18.836504"><ele>777</ele><time>2017-01-22T13:09:45+0100</time></trkpt>
+<trkpt lat="48.438000" lon="18.836531"><ele>776</ele><time>2017-01-22T13:09:54+0100</time></trkpt>
+<trkpt lat="48.437908" lon="18.836610"><ele>778</ele><time>2017-01-22T13:10:00+0100</time></trkpt>
+<trkpt lat="48.437842" lon="18.836704"><ele>785</ele><time>2017-01-22T13:10:10+0100</time></trkpt>
+<trkpt lat="48.437797" lon="18.836835"><ele>789</ele><time>2017-01-22T13:10:19+0100</time></trkpt>
+<trkpt lat="48.437740" lon="18.836961"><ele>779</ele><time>2017-01-22T13:10:29+0100</time></trkpt>
+<trkpt lat="48.437648" lon="18.837021"><ele>778</ele><time>2017-01-22T13:10:42+0100</time></trkpt>
+<trkpt lat="48.437662" lon="18.837202"><ele>779</ele><time>2017-01-22T13:11:47+0100</time></trkpt>
+<trkpt lat="48.437606" lon="18.837330"><ele>783</ele><time>2017-01-22T13:11:55+0100</time></trkpt>
+<trkpt lat="48.437514" lon="18.837391"><ele>780</ele><time>2017-01-22T13:12:01+0100</time></trkpt>
+<trkpt lat="48.437445" lon="18.837489"><ele>775</ele><time>2017-01-22T13:12:08+0100</time></trkpt>
+<trkpt lat="48.437330" lon="18.837520"><ele>772</ele><time>2017-01-22T13:12:14+0100</time></trkpt>
+<trkpt lat="48.437286" lon="18.837661"><ele>779</ele><time>2017-01-22T13:12:22+0100</time></trkpt>
+<trkpt lat="48.437255" lon="18.837823"><ele>761</ele><time>2017-01-22T13:12:43+0100</time></trkpt>
+<trkpt lat="48.437214" lon="18.837963"><ele>763</ele><time>2017-01-22T13:15:10+0100</time></trkpt>
+<trkpt lat="48.437207" lon="18.838160"><ele>764</ele><time>2017-01-22T13:15:14+0100</time></trkpt>
+<trkpt lat="48.437164" lon="18.838301"><ele>767</ele><time>2017-01-22T13:15:18+0100</time></trkpt>
+<trkpt lat="48.437196" lon="18.838451"><ele>783</ele><time>2017-01-22T13:15:35+0100</time></trkpt>
+<trkpt lat="48.437224" lon="18.838587"><ele>770</ele><time>2017-01-22T13:15:43+0100</time></trkpt>
+<trkpt lat="48.437235" lon="18.838723"><ele>769</ele><time>2017-01-22T13:15:52+0100</time></trkpt>
+<trkpt lat="48.437195" lon="18.838861"><ele>767</ele><time>2017-01-22T13:16:07+0100</time></trkpt>
+<trkpt lat="48.437194" lon="18.839028"><ele>761</ele><time>2017-01-22T13:17:14+0100</time></trkpt>
+<trkpt lat="48.437202" lon="18.839189"><ele>758</ele><time>2017-01-22T13:17:18+0100</time></trkpt>
+<trkpt lat="48.437189" lon="18.839346"><ele>753</ele><time>2017-01-22T13:17:22+0100</time></trkpt>
+<trkpt lat="48.437143" lon="18.839478"><ele>759</ele><time>2017-01-22T13:17:34+0100</time></trkpt>
+<trkpt lat="48.437106" lon="18.839608"><ele>762</ele><time>2017-01-22T13:17:49+0100</time></trkpt>
+<trkpt lat="48.437067" lon="18.839732"><ele>764</ele><time>2017-01-22T13:18:04+0100</time></trkpt>
+<trkpt lat="48.437030" lon="18.839883"><ele>767</ele><time>2017-01-22T13:18:29+0100</time></trkpt>
+<trkpt lat="48.437013" lon="18.840034"><ele>769</ele><time>2017-01-22T13:18:40+0100</time></trkpt>
+<trkpt lat="48.436907" lon="18.840140"><ele>762</ele><time>2017-01-22T13:18:58+0100</time></trkpt>
+<trkpt lat="48.436842" lon="18.840254"><ele>763</ele><time>2017-01-22T13:19:07+0100</time></trkpt>
+<trkpt lat="48.436794" lon="18.840451"><ele>767</ele><time>2017-01-22T13:19:22+0100</time></trkpt>
+<trkpt lat="48.436722" lon="18.840559"><ele>764</ele><time>2017-01-22T13:19:32+0100</time></trkpt>
+<trkpt lat="48.436653" lon="18.840647"><ele>760</ele><time>2017-01-22T13:19:45+0100</time></trkpt>
+<trkpt lat="48.436598" lon="18.840765"><ele>760</ele><time>2017-01-22T13:19:53+0100</time></trkpt>
+<trkpt lat="48.436518" lon="18.840834"><ele>762</ele><time>2017-01-22T13:20:06+0100</time></trkpt>
+<trkpt lat="48.436454" lon="18.840942"><ele>767</ele><time>2017-01-22T13:20:14+0100</time></trkpt>
+<trkpt lat="48.436375" lon="18.841059"><ele>769</ele><time>2017-01-22T13:20:20+0100</time></trkpt>
+<trkpt lat="48.436302" lon="18.841167"><ele>762</ele><time>2017-01-22T13:20:29+0100</time></trkpt>
+<trkpt lat="48.436260" lon="18.841320"><ele>764</ele><time>2017-01-22T13:20:37+0100</time></trkpt>
+<trkpt lat="48.436244" lon="18.841472"><ele>771</ele><time>2017-01-22T13:20:43+0100</time></trkpt>
+<trkpt lat="48.436235" lon="18.841619"><ele>770</ele><time>2017-01-22T13:20:56+0100</time></trkpt>
+<trkpt lat="48.436195" lon="18.841800"><ele>775</ele><time>2017-01-22T13:21:48+0100</time></trkpt>
+<trkpt lat="48.436174" lon="18.841992"><ele>768</ele><time>2017-01-22T13:21:52+0100</time></trkpt>
+<trkpt lat="48.436121" lon="18.842109"><ele>767</ele><time>2017-01-22T13:21:59+0100</time></trkpt>
+<trkpt lat="48.436046" lon="18.842211"><ele>783</ele><time>2017-01-22T13:22:15+0100</time></trkpt>
+<trkpt lat="48.435968" lon="18.842286"><ele>787</ele><time>2017-01-22T13:22:26+0100</time></trkpt>
+<trkpt lat="48.435876" lon="18.842350"><ele>793</ele><time>2017-01-22T13:22:34+0100</time></trkpt>
+<trkpt lat="48.435780" lon="18.842388"><ele>799</ele><time>2017-01-22T13:22:47+0100</time></trkpt>
+<trkpt lat="48.435725" lon="18.842512"><ele>786</ele><time>2017-01-22T13:22:53+0100</time></trkpt>
+<trkpt lat="48.435636" lon="18.842706"><ele>778</ele><time>2017-01-22T13:23:10+0100</time></trkpt>
+<trkpt lat="48.435549" lon="18.842778"><ele>784</ele><time>2017-01-22T13:23:20+0100</time></trkpt>
+<trkpt lat="48.435480" lon="18.842915"><ele>781</ele><time>2017-01-22T13:23:26+0100</time></trkpt>
+<trkpt lat="48.435554" lon="18.843090"><ele>788</ele><time>2017-01-22T13:23:43+0100</time></trkpt>
+<trkpt lat="48.435640" lon="18.843149"><ele>790</ele><time>2017-01-22T13:23:52+0100</time></trkpt>
+<trkpt lat="48.435715" lon="18.843253"><ele>790</ele><time>2017-01-22T13:23:58+0100</time></trkpt>
+<trkpt lat="48.435772" lon="18.843370"><ele>791</ele><time>2017-01-22T13:24:04+0100</time></trkpt>
+<trkpt lat="48.435838" lon="18.843499"><ele>789</ele><time>2017-01-22T13:24:08+0100</time></trkpt>
+<trkpt lat="48.435925" lon="18.843607"><ele>789</ele><time>2017-01-22T13:24:13+0100</time></trkpt>
+<trkpt lat="48.435957" lon="18.843736"><ele>785</ele><time>2017-01-22T13:24:23+0100</time></trkpt>
+<trkpt lat="48.436023" lon="18.843850"><ele>783</ele><time>2017-01-22T13:24:27+0100</time></trkpt>
+<trkpt lat="48.436058" lon="18.844006"><ele>786</ele><time>2017-01-22T13:24:33+0100</time></trkpt>
+<trkpt lat="48.436155" lon="18.844205"><ele>783</ele><time>2017-01-22T13:24:38+0100</time></trkpt>
+<trkpt lat="48.436213" lon="18.844388"><ele>784</ele><time>2017-01-22T13:24:42+0100</time></trkpt>
+<trkpt lat="48.436251" lon="18.844598"><ele>787</ele><time>2017-01-22T13:24:44+0100</time></trkpt>
+<trkpt lat="48.436360" lon="18.844652"><ele>773</ele><time>2017-01-22T13:25:07+0100</time></trkpt>
+<trkpt lat="48.436456" lon="18.844593"><ele>775</ele><time>2017-01-22T13:25:15+0100</time></trkpt>
+<trkpt lat="48.436550" lon="18.844540"><ele>775</ele><time>2017-01-22T13:25:22+0100</time></trkpt>
+<trkpt lat="48.436655" lon="18.844531"><ele>776</ele><time>2017-01-22T13:25:28+0100</time></trkpt>
+<trkpt lat="48.436738" lon="18.844612"><ele>776</ele><time>2017-01-22T13:25:36+0100</time></trkpt>
+<trkpt lat="48.436833" lon="18.844616"><ele>777</ele><time>2017-01-22T13:25:55+0100</time></trkpt>
+<trkpt lat="48.436958" lon="18.844605"><ele>775</ele><time>2017-01-22T13:25:59+0100</time></trkpt>
+<trkpt lat="48.437063" lon="18.844536"><ele>771</ele><time>2017-01-22T13:26:03+0100</time></trkpt>
+<trkpt lat="48.437174" lon="18.844546"><ele>768</ele><time>2017-01-22T13:26:10+0100</time></trkpt>
+<trkpt lat="48.437316" lon="18.844594"><ele>771</ele><time>2017-01-22T13:26:14+0100</time></trkpt>
+<trkpt lat="48.437422" lon="18.844646"><ele>773</ele><time>2017-01-22T13:26:18+0100</time></trkpt>
+<trkpt lat="48.437526" lon="18.844653"><ele>775</ele><time>2017-01-22T13:26:26+0100</time></trkpt>
+<trkpt lat="48.437628" lon="18.844635"><ele>777</ele><time>2017-01-22T13:26:31+0100</time></trkpt>
+<trkpt lat="48.437720" lon="18.844625"><ele>780</ele><time>2017-01-22T13:26:37+0100</time></trkpt>
+<trkpt lat="48.437825" lon="18.844633"><ele>781</ele><time>2017-01-22T13:26:43+0100</time></trkpt>
+<trkpt lat="48.437928" lon="18.844691"><ele>779</ele><time>2017-01-22T13:26:52+0100</time></trkpt>
+<trkpt lat="48.438030" lon="18.844764"><ele>781</ele><time>2017-01-22T13:26:56+0100</time></trkpt>
+<trkpt lat="48.438132" lon="18.844863"><ele>777</ele><time>2017-01-22T13:27:00+0100</time></trkpt>
+<trkpt lat="48.438214" lon="18.844958"><ele>775</ele><time>2017-01-22T13:27:06+0100</time></trkpt>
+<trkpt lat="48.438302" lon="18.845014"><ele>778</ele><time>2017-01-22T13:27:10+0100</time></trkpt>
+<trkpt lat="48.438372" lon="18.845103"><ele>780</ele><time>2017-01-22T13:27:15+0100</time></trkpt>
+<trkpt lat="48.438505" lon="18.845188"><ele>785</ele><time>2017-01-22T13:27:19+0100</time></trkpt>
+<trkpt lat="48.438597" lon="18.845232"><ele>789</ele><time>2017-01-22T13:27:23+0100</time></trkpt>
+<trkpt lat="48.438684" lon="18.845304"><ele>785</ele><time>2017-01-22T13:27:27+0100</time></trkpt>
+<trkpt lat="48.438763" lon="18.845401"><ele>784</ele><time>2017-01-22T13:27:34+0100</time></trkpt>
+<trkpt lat="48.438823" lon="18.845528"><ele>785</ele><time>2017-01-22T13:27:40+0100</time></trkpt>
+<trkpt lat="48.438916" lon="18.845565"><ele>793</ele><time>2017-01-22T13:27:46+0100</time></trkpt>
+<trkpt lat="48.439026" lon="18.845585"><ele>799</ele><time>2017-01-22T13:27:53+0100</time></trkpt>
+<trkpt lat="48.439120" lon="18.845576"><ele>799</ele><time>2017-01-22T13:27:57+0100</time></trkpt>
+<trkpt lat="48.439211" lon="18.845537"><ele>803</ele><time>2017-01-22T13:28:05+0100</time></trkpt>
+<trkpt lat="48.439322" lon="18.845535"><ele>806</ele><time>2017-01-22T13:28:14+0100</time></trkpt>
+<trkpt lat="48.439419" lon="18.845503"><ele>809</ele><time>2017-01-22T13:28:20+0100</time></trkpt>
+<trkpt lat="48.439515" lon="18.845437"><ele>808</ele><time>2017-01-22T13:28:24+0100</time></trkpt>
+<trkpt lat="48.439628" lon="18.845334"><ele>807</ele><time>2017-01-22T13:28:28+0100</time></trkpt>
+<trkpt lat="48.439714" lon="18.845246"><ele>808</ele><time>2017-01-22T13:28:35+0100</time></trkpt>
+<trkpt lat="48.439811" lon="18.845189"><ele>807</ele><time>2017-01-22T13:28:43+0100</time></trkpt>
+<trkpt lat="48.439900" lon="18.845121"><ele>811</ele><time>2017-01-22T13:28:52+0100</time></trkpt>
+<trkpt lat="48.439984" lon="18.845018"><ele>814</ele><time>2017-01-22T13:28:56+0100</time></trkpt>
+<trkpt lat="48.440067" lon="18.844948"><ele>815</ele><time>2017-01-22T13:29:00+0100</time></trkpt>
+<trkpt lat="48.440168" lon="18.844858"><ele>808</ele><time>2017-01-22T13:29:06+0100</time></trkpt>
+<trkpt lat="48.440261" lon="18.844805"><ele>810</ele><time>2017-01-22T13:29:10+0100</time></trkpt>
+<trkpt lat="48.440354" lon="18.844742"><ele>810</ele><time>2017-01-22T13:29:15+0100</time></trkpt>
+<trkpt lat="48.440449" lon="18.844659"><ele>809</ele><time>2017-01-22T13:29:19+0100</time></trkpt>
+<trkpt lat="48.440579" lon="18.844580"><ele>794</ele><time>2017-01-22T13:29:25+0100</time></trkpt>
+<trkpt lat="48.440700" lon="18.844555"><ele>790</ele><time>2017-01-22T13:29:29+0100</time></trkpt>
+<trkpt lat="48.440793" lon="18.844603"><ele>785</ele><time>2017-01-22T13:30:11+0100</time></trkpt>
+<trkpt lat="48.440807" lon="18.844740"><ele>785</ele><time>2017-01-22T13:30:18+0100</time></trkpt>
+<trkpt lat="48.440784" lon="18.844915"><ele>779</ele><time>2017-01-22T13:30:22+0100</time></trkpt>
+<trkpt lat="48.440715" lon="18.845110"><ele>774</ele><time>2017-01-22T13:30:26+0100</time></trkpt>
+<trkpt lat="48.440772" lon="18.845244"><ele>775</ele><time>2017-01-22T13:30:30+0100</time></trkpt>
+<trkpt lat="48.440821" lon="18.845389"><ele>776</ele><time>2017-01-22T13:30:39+0100</time></trkpt>
+<trkpt lat="48.440886" lon="18.845534"><ele>781</ele><time>2017-01-22T13:30:43+0100</time></trkpt>
+<trkpt lat="48.440934" lon="18.845705"><ele>782</ele><time>2017-01-22T13:30:49+0100</time></trkpt>
+<trkpt lat="48.440948" lon="18.845847"><ele>780</ele><time>2017-01-22T13:30:55+0100</time></trkpt>
+<trkpt lat="48.440980" lon="18.845976"><ele>780</ele><time>2017-01-22T13:31:00+0100</time></trkpt>
+<trkpt lat="48.441034" lon="18.846135"><ele>780</ele><time>2017-01-22T13:31:06+0100</time></trkpt>
+<trkpt lat="48.441063" lon="18.846292"><ele>782</ele><time>2017-01-22T13:31:12+0100</time></trkpt>
+<trkpt lat="48.441086" lon="18.846445"><ele>780</ele><time>2017-01-22T13:31:16+0100</time></trkpt>
+<trkpt lat="48.441104" lon="18.846600"><ele>781</ele><time>2017-01-22T13:31:20+0100</time></trkpt>
+<trkpt lat="48.441129" lon="18.846768"><ele>782</ele><time>2017-01-22T13:31:25+0100</time></trkpt>
+<trkpt lat="48.441145" lon="18.846921"><ele>782</ele><time>2017-01-22T13:31:29+0100</time></trkpt>
+<trkpt lat="48.441175" lon="18.847053"><ele>783</ele><time>2017-01-22T13:31:31+0100</time></trkpt>
+<trkpt lat="48.441213" lon="18.847189"><ele>787</ele><time>2017-01-22T13:31:35+0100</time></trkpt>
+<trkpt lat="48.441275" lon="18.847294"><ele>790</ele><time>2017-01-22T13:31:39+0100</time></trkpt>
+<trkpt lat="48.441328" lon="18.847474"><ele>785</ele><time>2017-01-22T13:31:46+0100</time></trkpt>
+<trkpt lat="48.441398" lon="18.847613"><ele>779</ele><time>2017-01-22T13:31:52+0100</time></trkpt>
+<trkpt lat="48.441452" lon="18.847786"><ele>774</ele><time>2017-01-22T13:31:58+0100</time></trkpt>
+<trkpt lat="48.441510" lon="18.847914"><ele>776</ele><time>2017-01-22T13:32:04+0100</time></trkpt>
+<trkpt lat="48.441597" lon="18.848004"><ele>778</ele><time>2017-01-22T13:32:11+0100</time></trkpt>
+<trkpt lat="48.441690" lon="18.848105"><ele>780</ele><time>2017-01-22T13:32:15+0100</time></trkpt>
+<trkpt lat="48.441780" lon="18.848176"><ele>787</ele><time>2017-01-22T13:32:19+0100</time></trkpt>
+<trkpt lat="48.441870" lon="18.848258"><ele>789</ele><time>2017-01-22T13:32:23+0100</time></trkpt>
+<trkpt lat="48.441959" lon="18.848315"><ele>790</ele><time>2017-01-22T13:32:28+0100</time></trkpt>
+<trkpt lat="48.442053" lon="18.848376"><ele>789</ele><time>2017-01-22T13:32:32+0100</time></trkpt>
+<trkpt lat="48.442139" lon="18.848429"><ele>790</ele><time>2017-01-22T13:32:38+0100</time></trkpt>
+<trkpt lat="48.442225" lon="18.848364"><ele>794</ele><time>2017-01-22T13:32:44+0100</time></trkpt>
+<trkpt lat="48.442316" lon="18.848296"><ele>795</ele><time>2017-01-22T13:32:51+0100</time></trkpt>
+<trkpt lat="48.442424" lon="18.848213"><ele>799</ele><time>2017-01-22T13:32:57+0100</time></trkpt>
+<trkpt lat="48.442524" lon="18.848133"><ele>799</ele><time>2017-01-22T13:33:03+0100</time></trkpt>
+<trkpt lat="48.442638" lon="18.848137"><ele>803</ele><time>2017-01-22T13:33:10+0100</time></trkpt>
+<trkpt lat="48.442749" lon="18.848135"><ele>802</ele><time>2017-01-22T13:33:16+0100</time></trkpt>
+<trkpt lat="48.442856" lon="18.848059"><ele>802</ele><time>2017-01-22T13:33:20+0100</time></trkpt>
+<trkpt lat="48.442960" lon="18.848011"><ele>802</ele><time>2017-01-22T13:33:26+0100</time></trkpt>
+<trkpt lat="48.443080" lon="18.847951"><ele>800</ele><time>2017-01-22T13:33:31+0100</time></trkpt>
+<trkpt lat="48.443198" lon="18.847904"><ele>797</ele><time>2017-01-22T13:33:35+0100</time></trkpt>
+<trkpt lat="48.443303" lon="18.847884"><ele>793</ele><time>2017-01-22T13:33:37+0100</time></trkpt>
+<trkpt lat="48.443423" lon="18.847924"><ele>793</ele><time>2017-01-22T13:33:45+0100</time></trkpt>
+<trkpt lat="48.443446" lon="18.848111"><ele>785</ele><time>2017-01-22T13:33:54+0100</time></trkpt>
+<trkpt lat="48.443499" lon="18.848244"><ele>787</ele><time>2017-01-22T13:33:58+0100</time></trkpt>
+<trkpt lat="48.443564" lon="18.848383"><ele>787</ele><time>2017-01-22T13:34:04+0100</time></trkpt>
+<trkpt lat="48.443650" lon="18.848433"><ele>790</ele><time>2017-01-22T13:34:10+0100</time></trkpt>
+<trkpt lat="48.443756" lon="18.848467"><ele>789</ele><time>2017-01-22T13:34:19+0100</time></trkpt>
+<trkpt lat="48.443867" lon="18.848485"><ele>797</ele><time>2017-01-22T13:34:25+0100</time></trkpt>
+<trkpt lat="48.443963" lon="18.848507"><ele>795</ele><time>2017-01-22T13:34:29+0100</time></trkpt>
+<trkpt lat="48.444056" lon="18.848511"><ele>797</ele><time>2017-01-22T13:34:34+0100</time></trkpt>
+<trkpt lat="48.444152" lon="18.848509"><ele>799</ele><time>2017-01-22T13:34:38+0100</time></trkpt>
+<trkpt lat="48.444264" lon="18.848478"><ele>799</ele><time>2017-01-22T13:34:42+0100</time></trkpt>
+<trkpt lat="48.444346" lon="18.848339"><ele>806</ele><time>2017-01-22T13:34:48+0100</time></trkpt>
+<trkpt lat="48.444447" lon="18.848242"><ele>805</ele><time>2017-01-22T13:34:54+0100</time></trkpt>
+<trkpt lat="48.444538" lon="18.848175"><ele>801</ele><time>2017-01-22T13:34:58+0100</time></trkpt>
+<trkpt lat="48.444650" lon="18.848065"><ele>797</ele><time>2017-01-22T13:35:05+0100</time></trkpt>
+<trkpt lat="48.444737" lon="18.847983"><ele>802</ele><time>2017-01-22T13:35:09+0100</time></trkpt>
+<trkpt lat="48.444837" lon="18.847897"><ele>801</ele><time>2017-01-22T13:35:13+0100</time></trkpt>
+<trkpt lat="48.444937" lon="18.847838"><ele>801</ele><time>2017-01-22T13:35:17+0100</time></trkpt>
+<trkpt lat="48.445037" lon="18.847757"><ele>801</ele><time>2017-01-22T13:35:22+0100</time></trkpt>
+<trkpt lat="48.445164" lon="18.847679"><ele>799</ele><time>2017-01-22T13:35:24+0100</time></trkpt>
+<trkpt lat="48.445268" lon="18.847585"><ele>802</ele><time>2017-01-22T13:35:28+0100</time></trkpt>
+<trkpt lat="48.445375" lon="18.847491"><ele>797</ele><time>2017-01-22T13:35:34+0100</time></trkpt>
+<trkpt lat="48.445470" lon="18.847390"><ele>798</ele><time>2017-01-22T13:35:40+0100</time></trkpt>
+<trkpt lat="48.445554" lon="18.847286"><ele>797</ele><time>2017-01-22T13:35:46+0100</time></trkpt>
+<trkpt lat="48.445688" lon="18.847131"><ele>798</ele><time>2017-01-22T13:35:51+0100</time></trkpt>
+<trkpt lat="48.445772" lon="18.847024"><ele>796</ele><time>2017-01-22T13:35:55+0100</time></trkpt>
+<trkpt lat="48.445869" lon="18.846955"><ele>792</ele><time>2017-01-22T13:36:01+0100</time></trkpt>
+<trkpt lat="48.445964" lon="18.846892"><ele>791</ele><time>2017-01-22T13:36:10+0100</time></trkpt>
+<trkpt lat="48.446073" lon="18.846921"><ele>789</ele><time>2017-01-22T13:36:14+0100</time></trkpt>
+<trkpt lat="48.446195" lon="18.846967"><ele>790</ele><time>2017-01-22T13:36:18+0100</time></trkpt>
+<trkpt lat="48.446306" lon="18.846970"><ele>787</ele><time>2017-01-22T13:36:22+0100</time></trkpt>
+<trkpt lat="48.446405" lon="18.846964"><ele>786</ele><time>2017-01-22T13:36:31+0100</time></trkpt>
+<trkpt lat="48.446518" lon="18.847029"><ele>791</ele><time>2017-01-22T13:36:35+0100</time></trkpt>
+<trkpt lat="48.446622" lon="18.847069"><ele>791</ele><time>2017-01-22T13:36:41+0100</time></trkpt>
+<trkpt lat="48.446742" lon="18.847132"><ele>795</ele><time>2017-01-22T13:36:47+0100</time></trkpt>
+<trkpt lat="48.446839" lon="18.847189"><ele>790</ele><time>2017-01-22T13:36:53+0100</time></trkpt>
+<trkpt lat="48.446933" lon="18.847227"><ele>792</ele><time>2017-01-22T13:37:00+0100</time></trkpt>
+<trkpt lat="48.447023" lon="18.847250"><ele>793</ele><time>2017-01-22T13:37:04+0100</time></trkpt>
+<trkpt lat="48.447120" lon="18.847259"><ele>798</ele><time>2017-01-22T13:37:08+0100</time></trkpt>
+<trkpt lat="48.447225" lon="18.847295"><ele>803</ele><time>2017-01-22T13:37:12+0100</time></trkpt>
+<trkpt lat="48.447346" lon="18.847339"><ele>806</ele><time>2017-01-22T13:37:16+0100</time></trkpt>
+<trkpt lat="48.447460" lon="18.847326"><ele>807</ele><time>2017-01-22T13:37:23+0100</time></trkpt>
+<trkpt lat="48.447560" lon="18.847310"><ele>811</ele><time>2017-01-22T13:37:27+0100</time></trkpt>
+<trkpt lat="48.447668" lon="18.847306"><ele>805</ele><time>2017-01-22T13:37:33+0100</time></trkpt>
+<trkpt lat="48.447766" lon="18.847251"><ele>807</ele><time>2017-01-22T13:37:40+0100</time></trkpt>
+<trkpt lat="48.447851" lon="18.847148"><ele>807</ele><time>2017-01-22T13:37:46+0100</time></trkpt>
+<trkpt lat="48.447953" lon="18.847098"><ele>811</ele><time>2017-01-22T13:37:52+0100</time></trkpt>
+<trkpt lat="48.448073" lon="18.847016"><ele>811</ele><time>2017-01-22T13:37:56+0100</time></trkpt>
+<trkpt lat="48.448147" lon="18.846901"><ele>810</ele><time>2017-01-22T13:38:00+0100</time></trkpt>
+<trkpt lat="48.448218" lon="18.846801"><ele>810</ele><time>2017-01-22T13:38:04+0100</time></trkpt>
+<trkpt lat="48.448268" lon="18.846687"><ele>813</ele><time>2017-01-22T13:38:09+0100</time></trkpt>
+<trkpt lat="48.448340" lon="18.846574"><ele>813</ele><time>2017-01-22T13:38:15+0100</time></trkpt>
+<trkpt lat="48.448433" lon="18.846473"><ele>813</ele><time>2017-01-22T13:38:21+0100</time></trkpt>
+<trkpt lat="48.448530" lon="18.846373"><ele>810</ele><time>2017-01-22T13:38:25+0100</time></trkpt>
+<trkpt lat="48.448615" lon="18.846265"><ele>806</ele><time>2017-01-22T13:38:30+0100</time></trkpt>
+<trkpt lat="48.448695" lon="18.846154"><ele>801</ele><time>2017-01-22T13:38:34+0100</time></trkpt>
+<trkpt lat="48.448745" lon="18.846030"><ele>801</ele><time>2017-01-22T13:38:38+0100</time></trkpt>
+<trkpt lat="48.448769" lon="18.845886"><ele>799</ele><time>2017-01-22T13:38:44+0100</time></trkpt>
+<trkpt lat="48.448836" lon="18.845762"><ele>790</ele><time>2017-01-22T13:38:48+0100</time></trkpt>
+<trkpt lat="48.448907" lon="18.845614"><ele>791</ele><time>2017-01-22T13:38:52+0100</time></trkpt>
+<trkpt lat="48.448952" lon="18.845448"><ele>794</ele><time>2017-01-22T13:38:57+0100</time></trkpt>
+<trkpt lat="48.448949" lon="18.845274"><ele>797</ele><time>2017-01-22T13:39:01+0100</time></trkpt>
+<trkpt lat="48.448974" lon="18.845124"><ele>799</ele><time>2017-01-22T13:39:07+0100</time></trkpt>
+<trkpt lat="48.449045" lon="18.845015"><ele>798</ele><time>2017-01-22T13:39:13+0100</time></trkpt>
+<trkpt lat="48.449095" lon="18.844875"><ele>796</ele><time>2017-01-22T13:39:18+0100</time></trkpt>
+<trkpt lat="48.449147" lon="18.844734"><ele>793</ele><time>2017-01-22T13:39:24+0100</time></trkpt>
+<trkpt lat="48.449245" lon="18.844642"><ele>790</ele><time>2017-01-22T13:39:30+0100</time></trkpt>
+<trkpt lat="48.449334" lon="18.844577"><ele>789</ele><time>2017-01-22T13:39:34+0100</time></trkpt>
+<trkpt lat="48.449499" lon="18.844488"><ele>785</ele><time>2017-01-22T13:39:41+0100</time></trkpt>
+<trkpt lat="48.449601" lon="18.844411"><ele>786</ele><time>2017-01-22T13:39:47+0100</time></trkpt>
+<trkpt lat="48.449700" lon="18.844365"><ele>787</ele><time>2017-01-22T13:39:51+0100</time></trkpt>
+<trkpt lat="48.449811" lon="18.844359"><ele>788</ele><time>2017-01-22T13:39:58+0100</time></trkpt>
+<trkpt lat="48.449937" lon="18.844380"><ele>788</ele><time>2017-01-22T13:40:02+0100</time></trkpt>
+<trkpt lat="48.450041" lon="18.844420"><ele>782</ele><time>2017-01-22T13:40:08+0100</time></trkpt>
+<trkpt lat="48.450159" lon="18.844444"><ele>783</ele><time>2017-01-22T13:40:14+0100</time></trkpt>
+<trkpt lat="48.450279" lon="18.844490"><ele>786</ele><time>2017-01-22T13:40:21+0100</time></trkpt>
+<trkpt lat="48.450379" lon="18.844551"><ele>787</ele><time>2017-01-22T13:40:25+0100</time></trkpt>
+<trkpt lat="48.450475" lon="18.844600"><ele>781</ele><time>2017-01-22T13:40:31+0100</time></trkpt>
+<trkpt lat="48.450584" lon="18.844684"><ele>782</ele><time>2017-01-22T13:40:37+0100</time></trkpt>
+<trkpt lat="48.450683" lon="18.844794"><ele>782</ele><time>2017-01-22T13:40:44+0100</time></trkpt>
+<trkpt lat="48.450612" lon="18.844941"><ele>782</ele><time>2017-01-22T13:40:48+0100</time></trkpt>
+<trkpt lat="48.450520" lon="18.845004"><ele>779</ele><time>2017-01-22T13:40:54+0100</time></trkpt>
+<trkpt lat="48.450414" lon="18.845117"><ele>775</ele><time>2017-01-22T13:41:01+0100</time></trkpt>
+<trkpt lat="48.450334" lon="18.845201"><ele>774</ele><time>2017-01-22T13:41:07+0100</time></trkpt>
+<trkpt lat="48.450258" lon="18.845285"><ele>779</ele><time>2017-01-22T13:41:15+0100</time></trkpt>
+<trkpt lat="48.450170" lon="18.845404"><ele>776</ele><time>2017-01-22T13:41:22+0100</time></trkpt>
+<trkpt lat="48.450107" lon="18.845517"><ele>774</ele><time>2017-01-22T13:41:24+0100</time></trkpt>
+<trkpt lat="48.450054" lon="18.845640"><ele>773</ele><time>2017-01-22T13:41:28+0100</time></trkpt>
+<trkpt lat="48.450016" lon="18.845790"><ele>771</ele><time>2017-01-22T13:41:43+0100</time></trkpt>
+<trkpt lat="48.450004" lon="18.845933"><ele>774</ele><time>2017-01-22T13:41:49+0100</time></trkpt>
+<trkpt lat="48.450058" lon="18.846106"><ele>777</ele><time>2017-01-22T13:41:53+0100</time></trkpt>
+<trkpt lat="48.450095" lon="18.846240"><ele>783</ele><time>2017-01-22T13:41:57+0100</time></trkpt>
+<trkpt lat="48.450124" lon="18.846389"><ele>784</ele><time>2017-01-22T13:42:06+0100</time></trkpt>
+<trkpt lat="48.450173" lon="18.846518"><ele>789</ele><time>2017-01-22T13:42:10+0100</time></trkpt>
+<trkpt lat="48.450217" lon="18.846667"><ele>790</ele><time>2017-01-22T13:42:16+0100</time></trkpt>
+<trkpt lat="48.450214" lon="18.846846"><ele>791</ele><time>2017-01-22T13:42:22+0100</time></trkpt>
+<trkpt lat="48.450198" lon="18.847045"><ele>793</ele><time>2017-01-22T13:42:27+0100</time></trkpt>
+<trkpt lat="48.450192" lon="18.847204"><ele>790</ele><time>2017-01-22T13:42:31+0100</time></trkpt>
+<trkpt lat="48.450166" lon="18.847362"><ele>789</ele><time>2017-01-22T13:42:37+0100</time></trkpt>
+<trkpt lat="48.450160" lon="18.847509"><ele>789</ele><time>2017-01-22T13:42:41+0100</time></trkpt>
+<trkpt lat="48.450149" lon="18.847655"><ele>790</ele><time>2017-01-22T13:42:48+0100</time></trkpt>
+<trkpt lat="48.450207" lon="18.847803"><ele>792</ele><time>2017-01-22T13:43:52+0100</time></trkpt>
+<trkpt lat="48.450176" lon="18.847978"><ele>788</ele><time>2017-01-22T13:43:56+0100</time></trkpt>
+<trkpt lat="48.450154" lon="18.848157"><ele>783</ele><time>2017-01-22T13:44:00+0100</time></trkpt>
+<trkpt lat="48.450118" lon="18.848300"><ele>785</ele><time>2017-01-22T13:44:04+0100</time></trkpt>
+<trkpt lat="48.450079" lon="18.848480"><ele>792</ele><time>2017-01-22T13:44:10+0100</time></trkpt>
+<trkpt lat="48.450031" lon="18.848657"><ele>792</ele><time>2017-01-22T13:44:14+0100</time></trkpt>
+<trkpt lat="48.449964" lon="18.848786"><ele>791</ele><time>2017-01-22T13:44:19+0100</time></trkpt>
+<trkpt lat="48.449863" lon="18.848868"><ele>789</ele><time>2017-01-22T13:44:23+0100</time></trkpt>
+<trkpt lat="48.449777" lon="18.848966"><ele>788</ele><time>2017-01-22T13:44:27+0100</time></trkpt>
+<trkpt lat="48.449753" lon="18.849109"><ele>795</ele><time>2017-01-22T13:44:31+0100</time></trkpt>
+<trkpt lat="48.449708" lon="18.849273"><ele>793</ele><time>2017-01-22T13:44:40+0100</time></trkpt>
+<trkpt lat="48.449609" lon="18.849391"><ele>798</ele><time>2017-01-22T13:44:44+0100</time></trkpt>
+<trkpt lat="48.449517" lon="18.849488"><ele>799</ele><time>2017-01-22T13:44:48+0100</time></trkpt>
+<trkpt lat="48.449420" lon="18.849582"><ele>795</ele><time>2017-01-22T13:44:54+0100</time></trkpt>
+<trkpt lat="48.449332" lon="18.849691"><ele>795</ele><time>2017-01-22T13:45:01+0100</time></trkpt>
+<trkpt lat="48.449226" lon="18.849774"><ele>791</ele><time>2017-01-22T13:45:05+0100</time></trkpt>
+<trkpt lat="48.449108" lon="18.849855"><ele>786</ele><time>2017-01-22T13:45:09+0100</time></trkpt>
+<trkpt lat="48.449070" lon="18.850006"><ele>787</ele><time>2017-01-22T13:45:13+0100</time></trkpt>
+<trkpt lat="48.449006" lon="18.850108"><ele>788</ele><time>2017-01-22T13:45:19+0100</time></trkpt>
+<trkpt lat="48.448915" lon="18.850176"><ele>788</ele><time>2017-01-22T13:45:26+0100</time></trkpt>
+<trkpt lat="48.448825" lon="18.850306"><ele>788</ele><time>2017-01-22T13:45:32+0100</time></trkpt>
+<trkpt lat="48.448742" lon="18.850441"><ele>790</ele><time>2017-01-22T13:45:36+0100</time></trkpt>
+<trkpt lat="48.448681" lon="18.850578"><ele>786</ele><time>2017-01-22T13:45:40+0100</time></trkpt>
+<trkpt lat="48.448607" lon="18.850676"><ele>788</ele><time>2017-01-22T13:45:49+0100</time></trkpt>
+<trkpt lat="48.448521" lon="18.850767"><ele>788</ele><time>2017-01-22T13:45:53+0100</time></trkpt>
+<trkpt lat="48.448416" lon="18.850877"><ele>783</ele><time>2017-01-22T13:45:57+0100</time></trkpt>
+<trkpt lat="48.448294" lon="18.850970"><ele>781</ele><time>2017-01-22T13:46:01+0100</time></trkpt>
+<trkpt lat="48.448180" lon="18.851055"><ele>782</ele><time>2017-01-22T13:46:05+0100</time></trkpt>
+<trkpt lat="48.448082" lon="18.851106"><ele>782</ele><time>2017-01-22T13:46:10+0100</time></trkpt>
+<trkpt lat="48.447984" lon="18.851130"><ele>785</ele><time>2017-01-22T13:46:14+0100</time></trkpt>
+<trkpt lat="48.447890" lon="18.851090"><ele>791</ele><time>2017-01-22T13:46:24+0100</time></trkpt>
+<trkpt lat="48.447737" lon="18.851054"><ele>792</ele><time>2017-01-22T13:46:33+0100</time></trkpt>
+<trkpt lat="48.447642" lon="18.851042"><ele>794</ele><time>2017-01-22T13:46:37+0100</time></trkpt>
+<trkpt lat="48.447547" lon="18.851047"><ele>795</ele><time>2017-01-22T13:46:45+0100</time></trkpt>
+<trkpt lat="48.447440" lon="18.851021"><ele>793</ele><time>2017-01-22T13:46:54+0100</time></trkpt>
+<trkpt lat="48.447333" lon="18.851020"><ele>794</ele><time>2017-01-22T13:46:58+0100</time></trkpt>
+<trkpt lat="48.447228" lon="18.851028"><ele>797</ele><time>2017-01-22T13:47:02+0100</time></trkpt>
+<trkpt lat="48.447129" lon="18.851112"><ele>803</ele><time>2017-01-22T13:47:08+0100</time></trkpt>
+<trkpt lat="48.447015" lon="18.851208"><ele>801</ele><time>2017-01-22T13:47:13+0100</time></trkpt>
+<trkpt lat="48.446904" lon="18.851280"><ele>804</ele><time>2017-01-22T13:47:15+0100</time></trkpt>
+<trkpt lat="48.446830" lon="18.851384"><ele>805</ele><time>2017-01-22T13:47:19+0100</time></trkpt>
+<trkpt lat="48.446732" lon="18.851522"><ele>801</ele><time>2017-01-22T13:47:23+0100</time></trkpt>
+<trkpt lat="48.446616" lon="18.851640"><ele>796</ele><time>2017-01-22T13:47:27+0100</time></trkpt>
+<trkpt lat="48.446534" lon="18.851750"><ele>800</ele><time>2017-01-22T13:47:31+0100</time></trkpt>
+<trkpt lat="48.446451" lon="18.851847"><ele>797</ele><time>2017-01-22T13:47:36+0100</time></trkpt>
+<trkpt lat="48.446374" lon="18.851977"><ele>794</ele><time>2017-01-22T13:47:40+0100</time></trkpt>
+<trkpt lat="48.446302" lon="18.852086"><ele>788</ele><time>2017-01-22T13:47:44+0100</time></trkpt>
+<trkpt lat="48.446222" lon="18.852189"><ele>788</ele><time>2017-01-22T13:47:50+0100</time></trkpt>
+<trkpt lat="48.446225" lon="18.852377"><ele>788</ele><time>2017-01-22T13:47:57+0100</time></trkpt>
+<trkpt lat="48.446213" lon="18.852553"><ele>789</ele><time>2017-01-22T13:48:01+0100</time></trkpt>
+<trkpt lat="48.446134" lon="18.852660"><ele>794</ele><time>2017-01-22T13:48:07+0100</time></trkpt>
+<trkpt lat="48.446078" lon="18.852778"><ele>795</ele><time>2017-01-22T13:48:16+0100</time></trkpt>
+<trkpt lat="48.445998" lon="18.852882"><ele>797</ele><time>2017-01-22T13:48:20+0100</time></trkpt>
+<trkpt lat="48.445916" lon="18.852997"><ele>793</ele><time>2017-01-22T13:48:26+0100</time></trkpt>
+<trkpt lat="48.445819" lon="18.853123"><ele>793</ele><time>2017-01-22T13:48:30+0100</time></trkpt>
+<trkpt lat="48.445741" lon="18.853235"><ele>793</ele><time>2017-01-22T13:48:37+0100</time></trkpt>
+<trkpt lat="48.445655" lon="18.853318"><ele>793</ele><time>2017-01-22T13:48:43+0100</time></trkpt>
+<trkpt lat="48.445592" lon="18.853470"><ele>787</ele><time>2017-01-22T13:48:49+0100</time></trkpt>
+<trkpt lat="48.445520" lon="18.853602"><ele>788</ele><time>2017-01-22T13:48:53+0100</time></trkpt>
+<trkpt lat="48.445477" lon="18.853759"><ele>787</ele><time>2017-01-22T13:48:58+0100</time></trkpt>
+<trkpt lat="48.445497" lon="18.853943"><ele>792</ele><time>2017-01-22T13:49:00+0100</time></trkpt>
+<trkpt lat="48.445482" lon="18.854086"><ele>792</ele><time>2017-01-22T13:49:06+0100</time></trkpt>
+<trkpt lat="48.445582" lon="18.854129"><ele>791</ele><time>2017-01-22T13:49:16+0100</time></trkpt>
+<trkpt lat="48.445685" lon="18.854287"><ele>790</ele><time>2017-01-22T13:49:21+0100</time></trkpt>
+<trkpt lat="48.445771" lon="18.854495"><ele>791</ele><time>2017-01-22T13:49:25+0100</time></trkpt>
+<trkpt lat="48.445842" lon="18.854634"><ele>793</ele><time>2017-01-22T13:49:29+0100</time></trkpt>
+<trkpt lat="48.445909" lon="18.854754"><ele>787</ele><time>2017-01-22T13:49:35+0100</time></trkpt>
+<trkpt lat="48.445908" lon="18.854904"><ele>787</ele><time>2017-01-22T13:49:42+0100</time></trkpt>
+<trkpt lat="48.445887" lon="18.855063"><ele>787</ele><time>2017-01-22T13:49:46+0100</time></trkpt>
+<trkpt lat="48.445798" lon="18.855135"><ele>786</ele><time>2017-01-22T13:49:54+0100</time></trkpt>
+<trkpt lat="48.445744" lon="18.855251"><ele>785</ele><time>2017-01-22T13:50:01+0100</time></trkpt>
+<trkpt lat="48.445759" lon="18.855398"><ele>795</ele><time>2017-01-22T13:50:26+0100</time></trkpt>
+<trkpt lat="48.445694" lon="18.855528"><ele>792</ele><time>2017-01-22T13:50:30+0100</time></trkpt>
+<trkpt lat="48.445638" lon="18.855673"><ele>790</ele><time>2017-01-22T13:50:34+0100</time></trkpt>
+<trkpt lat="48.445549" lon="18.855792"><ele>782</ele><time>2017-01-22T13:50:40+0100</time></trkpt>
+<trkpt lat="48.445474" lon="18.855891"><ele>783</ele><time>2017-01-22T13:50:45+0100</time></trkpt>
+<trkpt lat="48.445414" lon="18.856012"><ele>785</ele><time>2017-01-22T13:50:49+0100</time></trkpt>
+<trkpt lat="48.445360" lon="18.856173"><ele>787</ele><time>2017-01-22T13:50:53+0100</time></trkpt>
+<trkpt lat="48.445289" lon="18.856285"><ele>783</ele><time>2017-01-22T13:50:59+0100</time></trkpt>
+<trkpt lat="48.445258" lon="18.856434"><ele>776</ele><time>2017-01-22T13:51:07+0100</time></trkpt>
+<trkpt lat="48.445244" lon="18.856596"><ele>776</ele><time>2017-01-22T13:51:12+0100</time></trkpt>
+<trkpt lat="48.445283" lon="18.856757"><ele>776</ele><time>2017-01-22T13:51:18+0100</time></trkpt>
+<trkpt lat="48.445388" lon="18.856839"><ele>778</ele><time>2017-01-22T13:51:26+0100</time></trkpt>
+<trkpt lat="48.445475" lon="18.856934"><ele>779</ele><time>2017-01-22T13:51:33+0100</time></trkpt>
+<trkpt lat="48.445578" lon="18.857030"><ele>783</ele><time>2017-01-22T13:51:39+0100</time></trkpt>
+<trkpt lat="48.445657" lon="18.857128"><ele>784</ele><time>2017-01-22T13:51:43+0100</time></trkpt>
+<trkpt lat="48.445663" lon="18.857301"><ele>783</ele><time>2017-01-22T13:51:52+0100</time></trkpt>
+<trkpt lat="48.445690" lon="18.857477"><ele>782</ele><time>2017-01-22T13:51:58+0100</time></trkpt>
+<trkpt lat="48.445723" lon="18.857643"><ele>782</ele><time>2017-01-22T13:52:04+0100</time></trkpt>
+<trkpt lat="48.445781" lon="18.857763"><ele>783</ele><time>2017-01-22T13:52:13+0100</time></trkpt>
+<trkpt lat="48.445870" lon="18.857868"><ele>783</ele><time>2017-01-22T13:52:21+0100</time></trkpt>
+<trkpt lat="48.445962" lon="18.857915"><ele>782</ele><time>2017-01-22T13:52:27+0100</time></trkpt>
+<trkpt lat="48.446052" lon="18.857977"><ele>783</ele><time>2017-01-22T13:52:31+0100</time></trkpt>
+<trkpt lat="48.446145" lon="18.858051"><ele>787</ele><time>2017-01-22T13:52:37+0100</time></trkpt>
+<trkpt lat="48.446229" lon="18.858129"><ele>787</ele><time>2017-01-22T13:52:44+0100</time></trkpt>
+<trkpt lat="48.446311" lon="18.858215"><ele>791</ele><time>2017-01-22T13:52:48+0100</time></trkpt>
+<trkpt lat="48.446393" lon="18.858316"><ele>790</ele><time>2017-01-22T13:52:54+0100</time></trkpt>
+<trkpt lat="48.446476" lon="18.858440"><ele>790</ele><time>2017-01-22T13:53:01+0100</time></trkpt>
+<trkpt lat="48.446532" lon="18.858597"><ele>789</ele><time>2017-01-22T13:53:05+0100</time></trkpt>
+<trkpt lat="48.446536" lon="18.858764"><ele>787</ele><time>2017-01-22T13:53:11+0100</time></trkpt>
+<trkpt lat="48.446529" lon="18.858927"><ele>784</ele><time>2017-01-22T13:53:17+0100</time></trkpt>
+<trkpt lat="48.446525" lon="18.859085"><ele>785</ele><time>2017-01-22T13:53:26+0100</time></trkpt>
+<trkpt lat="48.446548" lon="18.859237"><ele>784</ele><time>2017-01-22T13:53:30+0100</time></trkpt>
+<trkpt lat="48.446571" lon="18.859398"><ele>784</ele><time>2017-01-22T13:53:34+0100</time></trkpt>
+<trkpt lat="48.446625" lon="18.859562"><ele>782</ele><time>2017-01-22T13:53:38+0100</time></trkpt>
+<trkpt lat="48.446637" lon="18.859760"><ele>784</ele><time>2017-01-22T13:53:45+0100</time></trkpt>
+<trkpt lat="48.446673" lon="18.859919"><ele>783</ele><time>2017-01-22T13:53:47+0100</time></trkpt>
+<trkpt lat="48.446720" lon="18.860079"><ele>784</ele><time>2017-01-22T13:53:53+0100</time></trkpt>
+<trkpt lat="48.446742" lon="18.860236"><ele>782</ele><time>2017-01-22T13:53:59+0100</time></trkpt>
+<trkpt lat="48.446758" lon="18.860405"><ele>782</ele><time>2017-01-22T13:54:06+0100</time></trkpt>
+<trkpt lat="48.446749" lon="18.860588"><ele>783</ele><time>2017-01-22T13:54:12+0100</time></trkpt>
+<trkpt lat="48.446757" lon="18.860760"><ele>782</ele><time>2017-01-22T13:54:18+0100</time></trkpt>
+<trkpt lat="48.446760" lon="18.860913"><ele>782</ele><time>2017-01-22T13:54:29+0100</time></trkpt>
+<trkpt lat="48.446799" lon="18.861048"><ele>782</ele><time>2017-01-22T13:54:33+0100</time></trkpt>
+<trkpt lat="48.446845" lon="18.861205"><ele>781</ele><time>2017-01-22T13:54:37+0100</time></trkpt>
+<trkpt lat="48.446918" lon="18.861323"><ele>782</ele><time>2017-01-22T13:54:43+0100</time></trkpt>
+<trkpt lat="48.447049" lon="18.861359"><ele>776</ele><time>2017-01-22T13:55:04+0100</time></trkpt>
+<trkpt lat="48.447170" lon="18.861382"><ele>782</ele><time>2017-01-22T13:55:11+0100</time></trkpt>
+<trkpt lat="48.447287" lon="18.861400"><ele>780</ele><time>2017-01-22T13:55:15+0100</time></trkpt>
+<trkpt lat="48.447391" lon="18.861380"><ele>782</ele><time>2017-01-22T13:55:19+0100</time></trkpt>
+<trkpt lat="48.447487" lon="18.861368"><ele>785</ele><time>2017-01-22T13:55:23+0100</time></trkpt>
+<trkpt lat="48.447587" lon="18.861357"><ele>787</ele><time>2017-01-22T13:55:28+0100</time></trkpt>
+<trkpt lat="48.447697" lon="18.861342"><ele>789</ele><time>2017-01-22T13:55:32+0100</time></trkpt>
+<trkpt lat="48.447817" lon="18.861284"><ele>791</ele><time>2017-01-22T13:55:38+0100</time></trkpt>
+<trkpt lat="48.447886" lon="18.861173"><ele>790</ele><time>2017-01-22T13:55:44+0100</time></trkpt>
+<trkpt lat="48.447887" lon="18.861018"><ele>792</ele><time>2017-01-22T13:55:50+0100</time></trkpt>
+<trkpt lat="48.447876" lon="18.860871"><ele>797</ele><time>2017-01-22T13:55:57+0100</time></trkpt>
+<trkpt lat="48.447942" lon="18.860727"><ele>797</ele><time>2017-01-22T13:56:03+0100</time></trkpt>
+<trkpt lat="48.448038" lon="18.860640"><ele>796</ele><time>2017-01-22T13:56:09+0100</time></trkpt>
+<trkpt lat="48.448153" lon="18.860596"><ele>795</ele><time>2017-01-22T13:56:16+0100</time></trkpt>
+<trkpt lat="48.448261" lon="18.860568"><ele>798</ele><time>2017-01-22T13:56:22+0100</time></trkpt>
+<trkpt lat="48.448361" lon="18.860479"><ele>793</ele><time>2017-01-22T13:56:28+0100</time></trkpt>
+<trkpt lat="48.448429" lon="18.860308"><ele>795</ele><time>2017-01-22T13:56:34+0100</time></trkpt>
+<trkpt lat="48.448444" lon="18.860147"><ele>788</ele><time>2017-01-22T13:56:41+0100</time></trkpt>
+<trkpt lat="48.448491" lon="18.859985"><ele>790</ele><time>2017-01-22T13:56:43+0100</time></trkpt>
+<trkpt lat="48.448530" lon="18.859813"><ele>790</ele><time>2017-01-22T13:56:47+0100</time></trkpt>
+<trkpt lat="48.448559" lon="18.859661"><ele>790</ele><time>2017-01-22T13:56:53+0100</time></trkpt>
+<trkpt lat="48.448607" lon="18.859537"><ele>797</ele><time>2017-01-22T13:57:00+0100</time></trkpt>
+<trkpt lat="48.448664" lon="18.859397"><ele>799</ele><time>2017-01-22T13:57:06+0100</time></trkpt>
+<trkpt lat="48.448761" lon="18.859288"><ele>799</ele><time>2017-01-22T13:57:12+0100</time></trkpt>
+<trkpt lat="48.448874" lon="18.859173"><ele>798</ele><time>2017-01-22T13:57:16+0100</time></trkpt>
+<trkpt lat="48.448993" lon="18.859096"><ele>801</ele><time>2017-01-22T13:57:21+0100</time></trkpt>
+<trkpt lat="48.449132" lon="18.858994"><ele>797</ele><time>2017-01-22T13:57:25+0100</time></trkpt>
+<trkpt lat="48.449148" lon="18.858841"><ele>804</ele><time>2017-01-22T13:57:31+0100</time></trkpt>
+<trkpt lat="48.449180" lon="18.858696"><ele>807</ele><time>2017-01-22T13:57:40+0100</time></trkpt>
+<trkpt lat="48.449263" lon="18.858586"><ele>796</ele><time>2017-01-22T13:57:44+0100</time></trkpt>
+<trkpt lat="48.449366" lon="18.858540"><ele>795</ele><time>2017-01-22T13:57:50+0100</time></trkpt>
+<trkpt lat="48.449466" lon="18.858608"><ele>795</ele><time>2017-01-22T13:57:58+0100</time></trkpt>
+<trkpt lat="48.449540" lon="18.858715"><ele>793</ele><time>2017-01-22T13:58:03+0100</time></trkpt>
+<trkpt lat="48.449598" lon="18.858847"><ele>785</ele><time>2017-01-22T13:58:09+0100</time></trkpt>
+<trkpt lat="48.449642" lon="18.859033"><ele>781</ele><time>2017-01-22T13:58:13+0100</time></trkpt>
+<trkpt lat="48.449606" lon="18.859185"><ele>782</ele><time>2017-01-22T13:58:19+0100</time></trkpt>
+<trkpt lat="48.449644" lon="18.859344"><ele>781</ele><time>2017-01-22T13:58:26+0100</time></trkpt>
+<trkpt lat="48.449656" lon="18.859544"><ele>785</ele><time>2017-01-22T13:58:30+0100</time></trkpt>
+<trkpt lat="48.449637" lon="18.859723"><ele>785</ele><time>2017-01-22T13:58:36+0100</time></trkpt>
+<trkpt lat="48.449619" lon="18.859881"><ele>784</ele><time>2017-01-22T13:58:47+0100</time></trkpt>
+<trkpt lat="48.449568" lon="18.860004"><ele>781</ele><time>2017-01-22T13:58:51+0100</time></trkpt>
+<trkpt lat="48.449495" lon="18.860088"><ele>782</ele><time>2017-01-22T13:58:55+0100</time></trkpt>
+<trkpt lat="48.449448" lon="18.860249"><ele>783</ele><time>2017-01-22T13:58:59+0100</time></trkpt>
+<trkpt lat="48.449381" lon="18.860383"><ele>780</ele><time>2017-01-22T13:59:04+0100</time></trkpt>
+<trkpt lat="48.449310" lon="18.860504"><ele>784</ele><time>2017-01-22T13:59:10+0100</time></trkpt>
+<trkpt lat="48.449299" lon="18.860651"><ele>782</ele><time>2017-01-22T13:59:18+0100</time></trkpt>
+<trkpt lat="48.449359" lon="18.860797"><ele>778</ele><time>2017-01-22T13:59:27+0100</time></trkpt>
+<trkpt lat="48.449430" lon="18.860901"><ele>778</ele><time>2017-01-22T13:59:31+0100</time></trkpt>
+<trkpt lat="48.449534" lon="18.860959"><ele>783</ele><time>2017-01-22T13:59:37+0100</time></trkpt>
+<trkpt lat="48.449622" lon="18.861075"><ele>781</ele><time>2017-01-22T13:59:43+0100</time></trkpt>
+<trkpt lat="48.449644" lon="18.861212"><ele>781</ele><time>2017-01-22T13:59:52+0100</time></trkpt>
+<trkpt lat="48.449581" lon="18.861333"><ele>780</ele><time>2017-01-22T13:59:58+0100</time></trkpt>
+<trkpt lat="48.449484" lon="18.861404"><ele>783</ele><time>2017-01-22T14:00:04+0100</time></trkpt>
+<trkpt lat="48.449444" lon="18.861555"><ele>782</ele><time>2017-01-22T14:00:10+0100</time></trkpt>
+<trkpt lat="48.449442" lon="18.861730"><ele>782</ele><time>2017-01-22T14:00:15+0100</time></trkpt>
+<trkpt lat="48.449444" lon="18.861874"><ele>785</ele><time>2017-01-22T14:00:19+0100</time></trkpt>
+<trkpt lat="48.449462" lon="18.862036"><ele>785</ele><time>2017-01-22T14:00:23+0100</time></trkpt>
+<trkpt lat="48.449460" lon="18.862182"><ele>785</ele><time>2017-01-22T14:00:27+0100</time></trkpt>
+<trkpt lat="48.449462" lon="18.862344"><ele>786</ele><time>2017-01-22T14:00:31+0100</time></trkpt>
+<trkpt lat="48.449446" lon="18.862578"><ele>789</ele><time>2017-01-22T14:00:38+0100</time></trkpt>
+<trkpt lat="48.449420" lon="18.862730"><ele>786</ele><time>2017-01-22T14:00:44+0100</time></trkpt>
+<trkpt lat="48.449346" lon="18.862892"><ele>790</ele><time>2017-01-22T14:00:59+0100</time></trkpt>
+<trkpt lat="48.449377" lon="18.863021"><ele>784</ele><time>2017-01-22T14:01:05+0100</time></trkpt>
+<trkpt lat="48.449468" lon="18.863144"><ele>784</ele><time>2017-01-22T14:01:11+0100</time></trkpt>
+<trkpt lat="48.449570" lon="18.863191"><ele>785</ele><time>2017-01-22T14:01:16+0100</time></trkpt>
+<trkpt lat="48.449668" lon="18.863227"><ele>786</ele><time>2017-01-22T14:01:20+0100</time></trkpt>
+<trkpt lat="48.449775" lon="18.863249"><ele>788</ele><time>2017-01-22T14:01:24+0100</time></trkpt>
+<trkpt lat="48.449872" lon="18.863239"><ele>787</ele><time>2017-01-22T14:01:30+0100</time></trkpt>
+<trkpt lat="48.449957" lon="18.863306"><ele>792</ele><time>2017-01-22T14:01:39+0100</time></trkpt>
+<trkpt lat="48.450026" lon="18.863411"><ele>795</ele><time>2017-01-22T14:01:47+0100</time></trkpt>
+<trkpt lat="48.450125" lon="18.863497"><ele>795</ele><time>2017-01-22T14:01:55+0100</time></trkpt>
+<trkpt lat="48.450221" lon="18.863584"><ele>795</ele><time>2017-01-22T14:02:00+0100</time></trkpt>
+<trkpt lat="48.450316" lon="18.863659"><ele>797</ele><time>2017-01-22T14:02:04+0100</time></trkpt>
+<trkpt lat="48.450404" lon="18.863733"><ele>800</ele><time>2017-01-22T14:02:10+0100</time></trkpt>
+<trkpt lat="48.450483" lon="18.863834"><ele>799</ele><time>2017-01-22T14:02:27+0100</time></trkpt>
+<trkpt lat="48.450574" lon="18.863904"><ele>798</ele><time>2017-01-22T14:02:35+0100</time></trkpt>
+<trkpt lat="48.450662" lon="18.863958"><ele>795</ele><time>2017-01-22T14:02:52+0100</time></trkpt>
+<trkpt lat="48.450752" lon="18.864008"><ele>795</ele><time>2017-01-22T14:02:56+0100</time></trkpt>
+<trkpt lat="48.450849" lon="18.864086"><ele>793</ele><time>2017-01-22T14:03:04+0100</time></trkpt>
+<trkpt lat="48.450944" lon="18.864168"><ele>792</ele><time>2017-01-22T14:03:09+0100</time></trkpt>
+<trkpt lat="48.451031" lon="18.864277"><ele>793</ele><time>2017-01-22T14:03:13+0100</time></trkpt>
+<trkpt lat="48.451103" lon="18.864373"><ele>794</ele><time>2017-01-22T14:03:21+0100</time></trkpt>
+<trkpt lat="48.451183" lon="18.864470"><ele>797</ele><time>2017-01-22T14:03:30+0100</time></trkpt>
+<trkpt lat="48.451245" lon="18.864606"><ele>798</ele><time>2017-01-22T14:03:36+0100</time></trkpt>
+<trkpt lat="48.451309" lon="18.864747"><ele>800</ele><time>2017-01-22T14:03:40+0100</time></trkpt>
+<trkpt lat="48.451386" lon="18.864912"><ele>799</ele><time>2017-01-22T14:03:44+0100</time></trkpt>
+<trkpt lat="48.451477" lon="18.865032"><ele>800</ele><time>2017-01-22T14:03:49+0100</time></trkpt>
+<trkpt lat="48.451571" lon="18.865101"><ele>802</ele><time>2017-01-22T14:03:53+0100</time></trkpt>
+<trkpt lat="48.451681" lon="18.865171"><ele>804</ele><time>2017-01-22T14:03:59+0100</time></trkpt>
+<trkpt lat="48.451784" lon="18.865212"><ele>819</ele><time>2017-01-22T14:04:10+0100</time></trkpt>
+<trkpt lat="48.451868" lon="18.865138"><ele>820</ele><time>2017-01-22T14:04:16+0100</time></trkpt>
+<trkpt lat="48.451964" lon="18.865065"><ele>818</ele><time>2017-01-22T14:04:22+0100</time></trkpt>
+<trkpt lat="48.452099" lon="18.865016"><ele>808</ele><time>2017-01-22T14:05:48+0100</time></trkpt>
+<trkpt lat="48.452193" lon="18.864923"><ele>804</ele><time>2017-01-22T14:05:54+0100</time></trkpt>
+<trkpt lat="48.452283" lon="18.864812"><ele>806</ele><time>2017-01-22T14:05:58+0100</time></trkpt>
+<trkpt lat="48.452365" lon="18.864709"><ele>809</ele><time>2017-01-22T14:06:02+0100</time></trkpt>
+<trkpt lat="48.452466" lon="18.864587"><ele>808</ele><time>2017-01-22T14:06:09+0100</time></trkpt>
+<trkpt lat="48.452550" lon="18.864533"><ele>805</ele><time>2017-01-22T14:06:13+0100</time></trkpt>
+<trkpt lat="48.452667" lon="18.864518"><ele>801</ele><time>2017-01-22T14:06:17+0100</time></trkpt>
+<trkpt lat="48.452767" lon="18.864511"><ele>802</ele><time>2017-01-22T14:06:21+0100</time></trkpt>
+<trkpt lat="48.452867" lon="18.864458"><ele>806</ele><time>2017-01-22T14:06:28+0100</time></trkpt>
+<trkpt lat="48.452985" lon="18.864533"><ele>789</ele><time>2017-01-22T14:06:42+0100</time></trkpt>
+<trkpt lat="48.453020" lon="18.864680"><ele>789</ele><time>2017-01-22T14:06:46+0100</time></trkpt>
+<trkpt lat="48.453074" lon="18.864871"><ele>793</ele><time>2017-01-22T14:06:59+0100</time></trkpt>
+<trkpt lat="48.453097" lon="18.865028"><ele>794</ele><time>2017-01-22T14:07:05+0100</time></trkpt>
+<trkpt lat="48.453109" lon="18.865193"><ele>792</ele><time>2017-01-22T14:07:12+0100</time></trkpt>
+<trkpt lat="48.453135" lon="18.865357"><ele>793</ele><time>2017-01-22T14:07:16+0100</time></trkpt>
+<trkpt lat="48.453162" lon="18.865501"><ele>795</ele><time>2017-01-22T14:07:22+0100</time></trkpt>
+<trkpt lat="48.453189" lon="18.865649"><ele>796</ele><time>2017-01-22T14:07:28+0100</time></trkpt>
+<trkpt lat="48.453243" lon="18.865853"><ele>796</ele><time>2017-01-22T14:07:32+0100</time></trkpt>
+<trkpt lat="48.453296" lon="18.866018"><ele>795</ele><time>2017-01-22T14:07:37+0100</time></trkpt>
+<trkpt lat="48.453393" lon="18.866103"><ele>797</ele><time>2017-01-22T14:07:41+0100</time></trkpt>
+<trkpt lat="48.453488" lon="18.866187"><ele>798</ele><time>2017-01-22T14:07:47+0100</time></trkpt>
+<trkpt lat="48.453567" lon="18.866300"><ele>798</ele><time>2017-01-22T14:07:51+0100</time></trkpt>
+<trkpt lat="48.453637" lon="18.866421"><ele>802</ele><time>2017-01-22T14:07:58+0100</time></trkpt>
+<trkpt lat="48.453722" lon="18.866534"><ele>806</ele><time>2017-01-22T14:08:06+0100</time></trkpt>
+<trkpt lat="48.453818" lon="18.866601"><ele>810</ele><time>2017-01-22T14:08:12+0100</time></trkpt>
+<trkpt lat="48.453915" lon="18.866681"><ele>807</ele><time>2017-01-22T14:08:19+0100</time></trkpt>
+<trkpt lat="48.453996" lon="18.866768"><ele>807</ele><time>2017-01-22T14:08:23+0100</time></trkpt>
+<trkpt lat="48.454095" lon="18.866890"><ele>808</ele><time>2017-01-22T14:08:29+0100</time></trkpt>
+<trkpt lat="48.454186" lon="18.866969"><ele>809</ele><time>2017-01-22T14:08:33+0100</time></trkpt>
+<trkpt lat="48.454279" lon="18.867046"><ele>808</ele><time>2017-01-22T14:08:37+0100</time></trkpt>
+<trkpt lat="48.454383" lon="18.867122"><ele>808</ele><time>2017-01-22T14:08:42+0100</time></trkpt>
+<trkpt lat="48.454497" lon="18.867130"><ele>812</ele><time>2017-01-22T14:08:48+0100</time></trkpt>
+<trkpt lat="48.454625" lon="18.867242"><ele>809</ele><time>2017-01-22T14:08:52+0100</time></trkpt>
+<trkpt lat="48.454733" lon="18.867340"><ele>804</ele><time>2017-01-22T14:08:56+0100</time></trkpt>
+<trkpt lat="48.454827" lon="18.867413"><ele>801</ele><time>2017-01-22T14:09:01+0100</time></trkpt>
+<trkpt lat="48.454931" lon="18.867471"><ele>800</ele><time>2017-01-22T14:09:05+0100</time></trkpt>
+<trkpt lat="48.455033" lon="18.867527"><ele>807</ele><time>2017-01-22T14:09:09+0100</time></trkpt>
+<trkpt lat="48.455133" lon="18.867616"><ele>809</ele><time>2017-01-22T14:09:15+0100</time></trkpt>
+<trkpt lat="48.455203" lon="18.867733"><ele>805</ele><time>2017-01-22T14:09:22+0100</time></trkpt>
+<trkpt lat="48.455274" lon="18.867834"><ele>800</ele><time>2017-01-22T14:09:32+0100</time></trkpt>
+<trkpt lat="48.455303" lon="18.867972"><ele>800</ele><time>2017-01-22T14:09:40+0100</time></trkpt>
+<trkpt lat="48.455381" lon="18.868203"><ele>797</ele><time>2017-01-22T14:09:47+0100</time></trkpt>
+<trkpt lat="48.455484" lon="18.868288"><ele>797</ele><time>2017-01-22T14:09:51+0100</time></trkpt>
+<trkpt lat="48.455588" lon="18.868411"><ele>805</ele><time>2017-01-22T14:09:57+0100</time></trkpt>
+<trkpt lat="48.455670" lon="18.868509"><ele>802</ele><time>2017-01-22T14:10:01+0100</time></trkpt>
+<trkpt lat="48.455745" lon="18.868606"><ele>803</ele><time>2017-01-22T14:10:06+0100</time></trkpt>
+<trkpt lat="48.455798" lon="18.868744"><ele>798</ele><time>2017-01-22T14:10:12+0100</time></trkpt>
+<trkpt lat="48.455836" lon="18.868888"><ele>796</ele><time>2017-01-22T14:10:16+0100</time></trkpt>
+<trkpt lat="48.455843" lon="18.869072"><ele>794</ele><time>2017-01-22T14:10:22+0100</time></trkpt>
+<trkpt lat="48.455849" lon="18.869233"><ele>791</ele><time>2017-01-22T14:10:27+0100</time></trkpt>
+<trkpt lat="48.455907" lon="18.869439"><ele>786</ele><time>2017-01-22T14:10:33+0100</time></trkpt>
+<trkpt lat="48.455970" lon="18.869580"><ele>788</ele><time>2017-01-22T14:10:39+0100</time></trkpt>
+<trkpt lat="48.455947" lon="18.869716"><ele>788</ele><time>2017-01-22T14:10:43+0100</time></trkpt>
+<trkpt lat="48.455954" lon="18.869903"><ele>787</ele><time>2017-01-22T14:10:52+0100</time></trkpt>
+<trkpt lat="48.455971" lon="18.870074"><ele>783</ele><time>2017-01-22T14:10:58+0100</time></trkpt>
+<trkpt lat="48.456036" lon="18.870203"><ele>786</ele><time>2017-01-22T14:11:04+0100</time></trkpt>
+<trkpt lat="48.456172" lon="18.870254"><ele>790</ele><time>2017-01-22T14:11:09+0100</time></trkpt>
+<trkpt lat="48.456283" lon="18.870351"><ele>793</ele><time>2017-01-22T14:11:13+0100</time></trkpt>
+<trkpt lat="48.456373" lon="18.870458"><ele>794</ele><time>2017-01-22T14:11:17+0100</time></trkpt>
+<trkpt lat="48.456445" lon="18.870575"><ele>799</ele><time>2017-01-22T14:11:23+0100</time></trkpt>
+<trkpt lat="48.456552" lon="18.870640"><ele>803</ele><time>2017-01-22T14:11:30+0100</time></trkpt>
+<trkpt lat="48.456669" lon="18.870676"><ele>805</ele><time>2017-01-22T14:11:34+0100</time></trkpt>
+<trkpt lat="48.456771" lon="18.870715"><ele>802</ele><time>2017-01-22T14:11:38+0100</time></trkpt>
+<trkpt lat="48.456874" lon="18.870807"><ele>796</ele><time>2017-01-22T14:11:44+0100</time></trkpt>
+<trkpt lat="48.456979" lon="18.870924"><ele>792</ele><time>2017-01-22T14:11:51+0100</time></trkpt>
+<trkpt lat="48.457069" lon="18.870993"><ele>794</ele><time>2017-01-22T14:11:57+0100</time></trkpt>
+<trkpt lat="48.457170" lon="18.871086"><ele>793</ele><time>2017-01-22T14:12:03+0100</time></trkpt>
+<trkpt lat="48.457278" lon="18.871126"><ele>797</ele><time>2017-01-22T14:12:10+0100</time></trkpt>
+<trkpt lat="48.457394" lon="18.871150"><ele>799</ele><time>2017-01-22T14:12:16+0100</time></trkpt>
+<trkpt lat="48.457505" lon="18.871123"><ele>804</ele><time>2017-01-22T14:12:22+0100</time></trkpt>
+<trkpt lat="48.457629" lon="18.871161"><ele>796</ele><time>2017-01-22T14:12:28+0100</time></trkpt>
+<trkpt lat="48.457679" lon="18.871285"><ele>795</ele><time>2017-01-22T14:12:37+0100</time></trkpt>
+<trkpt lat="48.457744" lon="18.871390"><ele>794</ele><time>2017-01-22T14:12:45+0100</time></trkpt>
+<trkpt lat="48.457842" lon="18.871426"><ele>795</ele><time>2017-01-22T14:13:02+0100</time></trkpt>
+<trkpt lat="48.457942" lon="18.871344"><ele>798</ele><time>2017-01-22T14:13:17+0100</time></trkpt>
+<trkpt lat="48.457984" lon="18.871213"><ele>799</ele><time>2017-01-22T14:13:21+0100</time></trkpt>
+<trkpt lat="48.458030" lon="18.871057"><ele>808</ele><time>2017-01-22T14:13:27+0100</time></trkpt>
+<trkpt lat="48.458069" lon="18.870894"><ele>811</ele><time>2017-01-22T14:13:34+0100</time></trkpt>
+<trkpt lat="48.458097" lon="18.870742"><ele>812</ele><time>2017-01-22T14:13:38+0100</time></trkpt>
+<trkpt lat="48.458117" lon="18.870595"><ele>810</ele><time>2017-01-22T14:13:40+0100</time></trkpt>
+<trkpt lat="48.458163" lon="18.870427"><ele>811</ele><time>2017-01-22T14:13:44+0100</time></trkpt>
+<trkpt lat="48.458191" lon="18.870277"><ele>810</ele><time>2017-01-22T14:13:48+0100</time></trkpt>
+<trkpt lat="48.458219" lon="18.870119"><ele>813</ele><time>2017-01-22T14:13:54+0100</time></trkpt>
+<trkpt lat="48.458250" lon="18.869985"><ele>813</ele><time>2017-01-22T14:13:58+0100</time></trkpt>
+<trkpt lat="48.458314" lon="18.869801"><ele>809</ele><time>2017-01-22T14:14:05+0100</time></trkpt>
+<trkpt lat="48.458324" lon="18.869639"><ele>808</ele><time>2017-01-22T14:14:11+0100</time></trkpt>
+<trkpt lat="48.458338" lon="18.869478"><ele>812</ele><time>2017-01-22T14:14:17+0100</time></trkpt>
+<trkpt lat="48.458351" lon="18.869291"><ele>813</ele><time>2017-01-22T14:14:24+0100</time></trkpt>
+<trkpt lat="48.458383" lon="18.869044"><ele>813</ele><time>2017-01-22T14:14:28+0100</time></trkpt>
+<trkpt lat="48.458435" lon="18.868838"><ele>806</ele><time>2017-01-22T14:14:32+0100</time></trkpt>
+<trkpt lat="48.458487" lon="18.868656"><ele>803</ele><time>2017-01-22T14:14:36+0100</time></trkpt>
+<trkpt lat="48.458516" lon="18.868489"><ele>801</ele><time>2017-01-22T14:14:40+0100</time></trkpt>
+<trkpt lat="48.458549" lon="18.868309"><ele>803</ele><time>2017-01-22T14:14:47+0100</time></trkpt>
+<trkpt lat="48.458551" lon="18.868162"><ele>808</ele><time>2017-01-22T14:14:53+0100</time></trkpt>
+<trkpt lat="48.458589" lon="18.868019"><ele>806</ele><time>2017-01-22T14:14:59+0100</time></trkpt>
+<trkpt lat="48.458646" lon="18.867899"><ele>802</ele><time>2017-01-22T14:15:04+0100</time></trkpt>
+<trkpt lat="48.458718" lon="18.867774"><ele>801</ele><time>2017-01-22T14:15:08+0100</time></trkpt>
+<trkpt lat="48.458801" lon="18.867623"><ele>803</ele><time>2017-01-22T14:15:10+0100</time></trkpt>
+<trkpt lat="48.458881" lon="18.867476"><ele>801</ele><time>2017-01-22T14:15:14+0100</time></trkpt>
+<trkpt lat="48.458961" lon="18.867364"><ele>801</ele><time>2017-01-22T14:15:20+0100</time></trkpt>
+<trkpt lat="48.459046" lon="18.867275"><ele>802</ele><time>2017-01-22T14:15:27+0100</time></trkpt>
+<trkpt lat="48.459149" lon="18.867215"><ele>805</ele><time>2017-01-22T14:15:31+0100</time></trkpt>
+<trkpt lat="48.459252" lon="18.867218"><ele>812</ele><time>2017-01-22T14:15:41+0100</time></trkpt>
+<trkpt lat="48.459356" lon="18.867267"><ele>807</ele><time>2017-01-22T14:15:48+0100</time></trkpt>
+<trkpt lat="48.459453" lon="18.867323"><ele>809</ele><time>2017-01-22T14:15:52+0100</time></trkpt>
+<trkpt lat="48.459561" lon="18.867389"><ele>807</ele><time>2017-01-22T14:15:58+0100</time></trkpt>
+<trkpt lat="48.459668" lon="18.867447"><ele>804</ele><time>2017-01-22T14:16:04+0100</time></trkpt>
+<trkpt lat="48.459840" lon="18.867498"><ele>799</ele><time>2017-01-22T14:16:11+0100</time></trkpt>
+<trkpt lat="48.459925" lon="18.867611"><ele>795</ele><time>2017-01-22T14:16:15+0100</time></trkpt>
+<trkpt lat="48.460040" lon="18.867676"><ele>794</ele><time>2017-01-22T14:16:21+0100</time></trkpt>
+<trkpt lat="48.460118" lon="18.867762"><ele>791</ele><time>2017-01-22T14:16:25+0100</time></trkpt>
+<trkpt lat="48.460191" lon="18.867871"><ele>790</ele><time>2017-01-22T14:16:32+0100</time></trkpt>
+<trkpt lat="48.460280" lon="18.868002"><ele>784</ele><time>2017-01-22T14:16:34+0100</time></trkpt>
+<trkpt lat="48.460314" lon="18.868149"><ele>787</ele><time>2017-01-22T14:16:40+0100</time></trkpt>
+<trkpt lat="48.460340" lon="18.868286"><ele>783</ele><time>2017-01-22T14:16:51+0100</time></trkpt>
+<trkpt lat="48.460442" lon="18.868349"><ele>781</ele><time>2017-01-22T14:16:55+0100</time></trkpt>
+<trkpt lat="48.460572" lon="18.868301"><ele>788</ele><time>2017-01-22T14:17:01+0100</time></trkpt>
+<trkpt lat="48.460673" lon="18.868248"><ele>793</ele><time>2017-01-22T14:17:07+0100</time></trkpt>
+<trkpt lat="48.460766" lon="18.868145"><ele>783</ele><time>2017-01-22T14:17:16+0100</time></trkpt>
+<trkpt lat="48.460852" lon="18.868048"><ele>790</ele><time>2017-01-22T14:17:24+0100</time></trkpt>
+<trkpt lat="48.460910" lon="18.867935"><ele>796</ele><time>2017-01-22T14:17:33+0100</time></trkpt>
+<trkpt lat="48.460997" lon="18.867859"><ele>797</ele><time>2017-01-22T14:17:39+0100</time></trkpt>
+<trkpt lat="48.461114" lon="18.867815"><ele>800</ele><time>2017-01-22T14:17:45+0100</time></trkpt>
+<trkpt lat="48.461205" lon="18.867782"><ele>800</ele><time>2017-01-22T14:17:52+0100</time></trkpt>
+<trkpt lat="48.461264" lon="18.867674"><ele>797</ele><time>2017-01-22T14:17:58+0100</time></trkpt>
+<trkpt lat="48.461291" lon="18.867503"><ele>799</ele><time>2017-01-22T14:18:04+0100</time></trkpt>
+<trkpt lat="48.461300" lon="18.867333"><ele>794</ele><time>2017-01-22T14:18:10+0100</time></trkpt>
+<trkpt lat="48.461335" lon="18.867169"><ele>794</ele><time>2017-01-22T14:18:16+0100</time></trkpt>
+<trkpt lat="48.461353" lon="18.866995"><ele>793</ele><time>2017-01-22T14:18:23+0100</time></trkpt>
+<trkpt lat="48.461386" lon="18.866819"><ele>789</ele><time>2017-01-22T14:18:27+0100</time></trkpt>
+<trkpt lat="48.461396" lon="18.866656"><ele>788</ele><time>2017-01-22T14:18:31+0100</time></trkpt>
+<trkpt lat="48.461384" lon="18.866481"><ele>790</ele><time>2017-01-22T14:18:35+0100</time></trkpt>
+<trkpt lat="48.461412" lon="18.866347"><ele>798</ele><time>2017-01-22T14:18:44+0100</time></trkpt>
+<trkpt lat="48.461438" lon="18.866213"><ele>796</ele><time>2017-01-22T14:18:52+0100</time></trkpt>
+<trkpt lat="48.461474" lon="18.866055"><ele>795</ele><time>2017-01-22T14:19:00+0100</time></trkpt>
+<trkpt lat="48.461534" lon="18.865929"><ele>790</ele><time>2017-01-22T14:19:07+0100</time></trkpt>
+<trkpt lat="48.461579" lon="18.865798"><ele>791</ele><time>2017-01-22T14:19:15+0100</time></trkpt>
+<trkpt lat="48.461644" lon="18.865664"><ele>797</ele><time>2017-01-22T14:19:23+0100</time></trkpt>
+<trkpt lat="48.461701" lon="18.865532"><ele>797</ele><time>2017-01-22T14:19:34+0100</time></trkpt>
+<trkpt lat="48.461775" lon="18.865392"><ele>787</ele><time>2017-01-22T14:19:40+0100</time></trkpt>
+<trkpt lat="48.461782" lon="18.865245"><ele>791</ele><time>2017-01-22T14:19:46+0100</time></trkpt>
+<trkpt lat="48.461750" lon="18.865096"><ele>794</ele><time>2017-01-22T14:19:53+0100</time></trkpt>
+<trkpt lat="48.461692" lon="18.864932"><ele>798</ele><time>2017-01-22T14:19:59+0100</time></trkpt>
+<trkpt lat="48.461654" lon="18.864777"><ele>794</ele><time>2017-01-22T14:20:03+0100</time></trkpt>
+<trkpt lat="48.461632" lon="18.864622"><ele>798</ele><time>2017-01-22T14:20:09+0100</time></trkpt>
+<trkpt lat="48.461594" lon="18.864428"><ele>802</ele><time>2017-01-22T14:20:16+0100</time></trkpt>
+<trkpt lat="48.461596" lon="18.864248"><ele>799</ele><time>2017-01-22T14:20:20+0100</time></trkpt>
+<trkpt lat="48.461566" lon="18.864085"><ele>796</ele><time>2017-01-22T14:20:24+0100</time></trkpt>
+<trkpt lat="48.461591" lon="18.863942"><ele>796</ele><time>2017-01-22T14:20:32+0100</time></trkpt>
+<trkpt lat="48.461685" lon="18.863983"><ele>804</ele><time>2017-01-22T14:20:41+0100</time></trkpt>
+<trkpt lat="48.461752" lon="18.864108"><ele>797</ele><time>2017-01-22T14:20:49+0100</time></trkpt>
+<trkpt lat="48.461825" lon="18.864196"><ele>803</ele><time>2017-01-22T14:20:55+0100</time></trkpt>
+<trkpt lat="48.461922" lon="18.864277"><ele>805</ele><time>2017-01-22T14:21:02+0100</time></trkpt>
+<trkpt lat="48.462026" lon="18.864343"><ele>810</ele><time>2017-01-22T14:21:08+0100</time></trkpt>
+<trkpt lat="48.462127" lon="18.864430"><ele>809</ele><time>2017-01-22T14:21:12+0100</time></trkpt>
+<trkpt lat="48.462241" lon="18.864581"><ele>807</ele><time>2017-01-22T14:21:17+0100</time></trkpt>
+<trkpt lat="48.462336" lon="18.864692"><ele>808</ele><time>2017-01-22T14:21:21+0100</time></trkpt>
+<trkpt lat="48.462441" lon="18.864761"><ele>809</ele><time>2017-01-22T14:21:25+0100</time></trkpt>
+<trkpt lat="48.462533" lon="18.864805"><ele>807</ele><time>2017-01-22T14:21:31+0100</time></trkpt>
+<trkpt lat="48.462636" lon="18.864819"><ele>808</ele><time>2017-01-22T14:21:40+0100</time></trkpt>
+<trkpt lat="48.462727" lon="18.864844"><ele>809</ele><time>2017-01-22T14:21:44+0100</time></trkpt>
+<trkpt lat="48.462826" lon="18.864842"><ele>805</ele><time>2017-01-22T14:21:48+0100</time></trkpt>
+<trkpt lat="48.462928" lon="18.864848"><ele>807</ele><time>2017-01-22T14:21:52+0100</time></trkpt>
+<trkpt lat="48.463043" lon="18.864842"><ele>803</ele><time>2017-01-22T14:21:56+0100</time></trkpt>
+<trkpt lat="48.463148" lon="18.864804"><ele>806</ele><time>2017-01-22T14:22:01+0100</time></trkpt>
+<trkpt lat="48.463254" lon="18.864787"><ele>808</ele><time>2017-01-22T14:22:07+0100</time></trkpt>
+<trkpt lat="48.463350" lon="18.864763"><ele>813</ele><time>2017-01-22T14:22:13+0100</time></trkpt>
+<trkpt lat="48.463431" lon="18.864823"><ele>806</ele><time>2017-01-22T14:22:24+0100</time></trkpt>
+<trkpt lat="48.463510" lon="18.864923"><ele>801</ele><time>2017-01-22T14:22:34+0100</time></trkpt>
+<trkpt lat="48.463585" lon="18.865012"><ele>805</ele><time>2017-01-22T14:22:40+0100</time></trkpt>
+<trkpt lat="48.463675" lon="18.865132"><ele>804</ele><time>2017-01-22T14:22:46+0100</time></trkpt>
+<trkpt lat="48.463742" lon="18.865266"><ele>802</ele><time>2017-01-22T14:22:51+0100</time></trkpt>
+<trkpt lat="48.463810" lon="18.865406"><ele>806</ele><time>2017-01-22T14:22:55+0100</time></trkpt>
+<trkpt lat="48.463887" lon="18.865507"><ele>805</ele><time>2017-01-22T14:22:59+0100</time></trkpt>
+<trkpt lat="48.463986" lon="18.865627"><ele>808</ele><time>2017-01-22T14:23:03+0100</time></trkpt>
+<trkpt lat="48.464098" lon="18.865744"><ele>808</ele><time>2017-01-22T14:23:07+0100</time></trkpt>
+<trkpt lat="48.464237" lon="18.865892"><ele>803</ele><time>2017-01-22T14:23:12+0100</time></trkpt>
+<trkpt lat="48.464310" lon="18.865995"><ele>804</ele><time>2017-01-22T14:23:16+0100</time></trkpt>
+<trkpt lat="48.464369" lon="18.866152"><ele>806</ele><time>2017-01-22T14:23:24+0100</time></trkpt>
+<trkpt lat="48.464395" lon="18.866313"><ele>804</ele><time>2017-01-22T14:23:33+0100</time></trkpt>
+<trkpt lat="48.464441" lon="18.866482"><ele>798</ele><time>2017-01-22T14:23:39+0100</time></trkpt>
+<trkpt lat="48.464463" lon="18.866656"><ele>798</ele><time>2017-01-22T14:23:43+0100</time></trkpt>
+<trkpt lat="48.464497" lon="18.866812"><ele>798</ele><time>2017-01-22T14:23:47+0100</time></trkpt>
+<trkpt lat="48.464470" lon="18.866972"><ele>790</ele><time>2017-01-22T14:23:54+0100</time></trkpt>
+<trkpt lat="48.464450" lon="18.867144"><ele>794</ele><time>2017-01-22T14:23:58+0100</time></trkpt>
+<trkpt lat="48.464443" lon="18.867298"><ele>796</ele><time>2017-01-22T14:24:04+0100</time></trkpt>
+<trkpt lat="48.464430" lon="18.867436"><ele>794</ele><time>2017-01-22T14:24:08+0100</time></trkpt>
+<trkpt lat="48.464409" lon="18.867576"><ele>793</ele><time>2017-01-22T14:24:13+0100</time></trkpt>
+<trkpt lat="48.464362" lon="18.867717"><ele>793</ele><time>2017-01-22T14:24:17+0100</time></trkpt>
+<trkpt lat="48.464373" lon="18.867883"><ele>799</ele><time>2017-01-22T14:24:21+0100</time></trkpt>
+<trkpt lat="48.464461" lon="18.868035"><ele>804</ele><time>2017-01-22T14:24:27+0100</time></trkpt>
+<trkpt lat="48.464539" lon="18.868153"><ele>805</ele><time>2017-01-22T14:24:36+0100</time></trkpt>
+<trkpt lat="48.464595" lon="18.868283"><ele>807</ele><time>2017-01-22T14:24:40+0100</time></trkpt>
+<trkpt lat="48.464647" lon="18.868452"><ele>806</ele><time>2017-01-22T14:24:46+0100</time></trkpt>
+<trkpt lat="48.464730" lon="18.868589"><ele>802</ele><time>2017-01-22T14:24:50+0100</time></trkpt>
+<trkpt lat="48.464797" lon="18.868714"><ele>801</ele><time>2017-01-22T14:24:55+0100</time></trkpt>
+<trkpt lat="48.464835" lon="18.868872"><ele>800</ele><time>2017-01-22T14:25:01+0100</time></trkpt>
+<trkpt lat="48.464861" lon="18.869028"><ele>797</ele><time>2017-01-22T14:25:07+0100</time></trkpt>
+<trkpt lat="48.464916" lon="18.869197"><ele>799</ele><time>2017-01-22T14:25:13+0100</time></trkpt>
+<trkpt lat="48.464945" lon="18.869363"><ele>797</ele><time>2017-01-22T14:25:20+0100</time></trkpt>
+<trkpt lat="48.464977" lon="18.869530"><ele>796</ele><time>2017-01-22T14:25:24+0100</time></trkpt>
+<trkpt lat="48.464956" lon="18.869669"><ele>801</ele><time>2017-01-22T14:25:30+0100</time></trkpt>
+<trkpt lat="48.465089" lon="18.869711"><ele>806</ele><time>2017-01-22T14:25:45+0100</time></trkpt>
+<trkpt lat="48.465181" lon="18.869680"><ele>802</ele><time>2017-01-22T14:25:49+0100</time></trkpt>
+<trkpt lat="48.465296" lon="18.869674"><ele>800</ele><time>2017-01-22T14:25:53+0100</time></trkpt>
+<trkpt lat="48.465395" lon="18.869588"><ele>804</ele><time>2017-01-22T14:26:00+0100</time></trkpt>
+<trkpt lat="48.465495" lon="18.869508"><ele>802</ele><time>2017-01-22T14:26:04+0100</time></trkpt>
+<trkpt lat="48.465560" lon="18.869393"><ele>801</ele><time>2017-01-22T14:26:10+0100</time></trkpt>
+<trkpt lat="48.465621" lon="18.869280"><ele>803</ele><time>2017-01-22T14:26:16+0100</time></trkpt>
+<trkpt lat="48.465719" lon="18.869179"><ele>801</ele><time>2017-01-22T14:26:22+0100</time></trkpt>
+<trkpt lat="48.465796" lon="18.869032"><ele>795</ele><time>2017-01-22T14:26:29+0100</time></trkpt>
+<trkpt lat="48.465886" lon="18.868873"><ele>790</ele><time>2017-01-22T14:26:35+0100</time></trkpt>
+<trkpt lat="48.465950" lon="18.868726"><ele>789</ele><time>2017-01-22T14:26:39+0100</time></trkpt>
+<trkpt lat="48.466017" lon="18.868604"><ele>791</ele><time>2017-01-22T14:26:45+0100</time></trkpt>
+<trkpt lat="48.466119" lon="18.868505"><ele>793</ele><time>2017-01-22T14:26:52+0100</time></trkpt>
+<trkpt lat="48.466211" lon="18.868394"><ele>795</ele><time>2017-01-22T14:26:56+0100</time></trkpt>
+<trkpt lat="48.466290" lon="18.868253"><ele>795</ele><time>2017-01-22T14:27:00+0100</time></trkpt>
+<trkpt lat="48.466366" lon="18.868084"><ele>797</ele><time>2017-01-22T14:27:04+0100</time></trkpt>
+<trkpt lat="48.466456" lon="18.867975"><ele>799</ele><time>2017-01-22T14:27:09+0100</time></trkpt>
+<trkpt lat="48.466570" lon="18.867945"><ele>801</ele><time>2017-01-22T14:27:15+0100</time></trkpt>
+<trkpt lat="48.466665" lon="18.868011"><ele>799</ele><time>2017-01-22T14:27:21+0100</time></trkpt>
+<trkpt lat="48.466760" lon="18.868103"><ele>800</ele><time>2017-01-22T14:27:27+0100</time></trkpt>
+<trkpt lat="48.466835" lon="18.868202"><ele>803</ele><time>2017-01-22T14:27:32+0100</time></trkpt>
+<trkpt lat="48.466904" lon="18.868328"><ele>805</ele><time>2017-01-22T14:27:38+0100</time></trkpt>
+<trkpt lat="48.466974" lon="18.868434"><ele>807</ele><time>2017-01-22T14:27:42+0100</time></trkpt>
+<trkpt lat="48.467046" lon="18.868532"><ele>806</ele><time>2017-01-22T14:27:46+0100</time></trkpt>
+<trkpt lat="48.467126" lon="18.868636"><ele>805</ele><time>2017-01-22T14:27:51+0100</time></trkpt>
+<trkpt lat="48.467233" lon="18.868782"><ele>803</ele><time>2017-01-22T14:27:55+0100</time></trkpt>
+<trkpt lat="48.467304" lon="18.868901"><ele>799</ele><time>2017-01-22T14:27:59+0100</time></trkpt>
+<trkpt lat="48.467361" lon="18.869023"><ele>800</ele><time>2017-01-22T14:28:03+0100</time></trkpt>
+<trkpt lat="48.467432" lon="18.869153"><ele>800</ele><time>2017-01-22T14:28:09+0100</time></trkpt>
+<trkpt lat="48.467485" lon="18.869294"><ele>799</ele><time>2017-01-22T14:28:14+0100</time></trkpt>
+<trkpt lat="48.467525" lon="18.869434"><ele>800</ele><time>2017-01-22T14:28:18+0100</time></trkpt>
+<trkpt lat="48.467567" lon="18.869583"><ele>801</ele><time>2017-01-22T14:28:24+0100</time></trkpt>
+<trkpt lat="48.467599" lon="18.869755"><ele>799</ele><time>2017-01-22T14:28:28+0100</time></trkpt>
+<trkpt lat="48.467641" lon="18.869884"><ele>799</ele><time>2017-01-22T14:28:32+0100</time></trkpt>
+<trkpt lat="48.467698" lon="18.870006"><ele>803</ele><time>2017-01-22T14:28:36+0100</time></trkpt>
+<trkpt lat="48.467751" lon="18.870140"><ele>803</ele><time>2017-01-22T14:28:41+0100</time></trkpt>
+<trkpt lat="48.467802" lon="18.870288"><ele>800</ele><time>2017-01-22T14:28:45+0100</time></trkpt>
+<trkpt lat="48.467852" lon="18.870425"><ele>798</ele><time>2017-01-22T14:28:49+0100</time></trkpt>
+<trkpt lat="48.467904" lon="18.870564"><ele>800</ele><time>2017-01-22T14:28:53+0100</time></trkpt>
+<trkpt lat="48.467961" lon="18.870692"><ele>800</ele><time>2017-01-22T14:28:57+0100</time></trkpt>
+<trkpt lat="48.468026" lon="18.870804"><ele>800</ele><time>2017-01-22T14:29:01+0100</time></trkpt>
+<trkpt lat="48.468081" lon="18.870917"><ele>801</ele><time>2017-01-22T14:29:05+0100</time></trkpt>
+<trkpt lat="48.468126" lon="18.871077"><ele>806</ele><time>2017-01-22T14:29:12+0100</time></trkpt>
+<trkpt lat="48.468177" lon="18.871213"><ele>806</ele><time>2017-01-22T14:29:18+0100</time></trkpt>
+<trkpt lat="48.468222" lon="18.871366"><ele>806</ele><time>2017-01-22T14:29:24+0100</time></trkpt>
+<trkpt lat="48.468257" lon="18.871572"><ele>802</ele><time>2017-01-22T14:29:28+0100</time></trkpt>
+<trkpt lat="48.468260" lon="18.871754"><ele>797</ele><time>2017-01-22T14:29:33+0100</time></trkpt>
+<trkpt lat="48.468245" lon="18.871947"><ele>796</ele><time>2017-01-22T14:29:43+0100</time></trkpt>
+<trkpt lat="48.468285" lon="18.872099"><ele>797</ele><time>2017-01-22T14:29:47+0100</time></trkpt>
+<trkpt lat="48.468312" lon="18.872247"><ele>794</ele><time>2017-01-22T14:29:54+0100</time></trkpt>
+<trkpt lat="48.468305" lon="18.872408"><ele>792</ele><time>2017-01-22T14:30:00+0100</time></trkpt>
+<trkpt lat="48.468328" lon="18.872577"><ele>796</ele><time>2017-01-22T14:30:06+0100</time></trkpt>
+<trkpt lat="48.468327" lon="18.872747"><ele>799</ele><time>2017-01-22T14:30:12+0100</time></trkpt>
+<trkpt lat="48.468314" lon="18.872896"><ele>799</ele><time>2017-01-22T14:30:17+0100</time></trkpt>
+<trkpt lat="48.468288" lon="18.873060"><ele>797</ele><time>2017-01-22T14:30:25+0100</time></trkpt>
+<trkpt lat="48.468248" lon="18.873205"><ele>798</ele><time>2017-01-22T14:30:33+0100</time></trkpt>
+<trkpt lat="48.468212" lon="18.873358"><ele>799</ele><time>2017-01-22T14:30:40+0100</time></trkpt>
+<trkpt lat="48.468234" lon="18.873522"><ele>798</ele><time>2017-01-22T14:30:44+0100</time></trkpt>
+<trkpt lat="48.468207" lon="18.873679"><ele>792</ele><time>2017-01-22T14:30:50+0100</time></trkpt>
+<trkpt lat="48.468203" lon="18.873820"><ele>794</ele><time>2017-01-22T14:30:54+0100</time></trkpt>
+<trkpt lat="48.468148" lon="18.874019"><ele>792</ele><time>2017-01-22T14:30:59+0100</time></trkpt>
+<trkpt lat="48.468090" lon="18.874144"><ele>795</ele><time>2017-01-22T14:31:05+0100</time></trkpt>
+<trkpt lat="48.468019" lon="18.874235"><ele>793</ele><time>2017-01-22T14:31:09+0100</time></trkpt>
+<trkpt lat="48.467988" lon="18.874375"><ele>796</ele><time>2017-01-22T14:31:15+0100</time></trkpt>
+<trkpt lat="48.468065" lon="18.874474"><ele>793</ele><time>2017-01-22T14:31:28+0100</time></trkpt>
+<trkpt lat="48.468160" lon="18.874517"><ele>796</ele><time>2017-01-22T14:31:41+0100</time></trkpt>
+<trkpt lat="48.468295" lon="18.874524"><ele>798</ele><time>2017-01-22T14:32:00+0100</time></trkpt>
+<trkpt lat="48.468402" lon="18.874501"><ele>794</ele><time>2017-01-22T14:32:08+0100</time></trkpt>
+<trkpt lat="48.468509" lon="18.874476"><ele>794</ele><time>2017-01-22T14:32:12+0100</time></trkpt>
+<trkpt lat="48.468613" lon="18.874426"><ele>794</ele><time>2017-01-22T14:32:16+0100</time></trkpt>
+<trkpt lat="48.468726" lon="18.874387"><ele>797</ele><time>2017-01-22T14:32:23+0100</time></trkpt>
+<trkpt lat="48.468811" lon="18.874342"><ele>802</ele><time>2017-01-22T14:32:31+0100</time></trkpt>
+<trkpt lat="48.468911" lon="18.874237"><ele>803</ele><time>2017-01-22T14:32:37+0100</time></trkpt>
+<trkpt lat="48.469006" lon="18.874239"><ele>799</ele><time>2017-01-22T14:32:42+0100</time></trkpt>
+<trkpt lat="48.469114" lon="18.874264"><ele>802</ele><time>2017-01-22T14:32:46+0100</time></trkpt>
+<trkpt lat="48.469240" lon="18.874269"><ele>794</ele><time>2017-01-22T14:32:50+0100</time></trkpt>
+<trkpt lat="48.469339" lon="18.874279"><ele>795</ele><time>2017-01-22T14:32:54+0100</time></trkpt>
+<trkpt lat="48.469427" lon="18.874352"><ele>794</ele><time>2017-01-22T14:32:58+0100</time></trkpt>
+<trkpt lat="48.469549" lon="18.874495"><ele>789</ele><time>2017-01-22T14:33:03+0100</time></trkpt>
+<trkpt lat="48.469631" lon="18.874607"><ele>788</ele><time>2017-01-22T14:33:11+0100</time></trkpt>
+<trkpt lat="48.469692" lon="18.874764"><ele>793</ele><time>2017-01-22T14:33:17+0100</time></trkpt>
+<trkpt lat="48.469707" lon="18.874915"><ele>793</ele><time>2017-01-22T14:33:26+0100</time></trkpt>
+<trkpt lat="48.469667" lon="18.875076"><ele>796</ele><time>2017-01-22T14:33:30+0100</time></trkpt>
+<trkpt lat="48.469648" lon="18.875223"><ele>796</ele><time>2017-01-22T14:33:40+0100</time></trkpt>
+<trkpt lat="48.469589" lon="18.875361"><ele>793</ele><time>2017-01-22T14:33:51+0100</time></trkpt>
+<trkpt lat="48.469509" lon="18.875448"><ele>794</ele><time>2017-01-22T14:33:57+0100</time></trkpt>
+<trkpt lat="48.469409" lon="18.875503"><ele>797</ele><time>2017-01-22T14:34:05+0100</time></trkpt>
+<trkpt lat="48.469330" lon="18.875587"><ele>798</ele><time>2017-01-22T14:34:09+0100</time></trkpt>
+<trkpt lat="48.469268" lon="18.875752"><ele>800</ele><time>2017-01-22T14:34:16+0100</time></trkpt>
+<trkpt lat="48.469250" lon="18.875891"><ele>797</ele><time>2017-01-22T14:34:20+0100</time></trkpt>
+<trkpt lat="48.469208" lon="18.876042"><ele>798</ele><time>2017-01-22T14:34:24+0100</time></trkpt>
+<trkpt lat="48.469145" lon="18.876180"><ele>794</ele><time>2017-01-22T14:34:30+0100</time></trkpt>
+<trkpt lat="48.469058" lon="18.876326"><ele>796</ele><time>2017-01-22T14:34:35+0100</time></trkpt>
+<trkpt lat="48.468983" lon="18.876478"><ele>802</ele><time>2017-01-22T14:34:37+0100</time></trkpt>
+<trkpt lat="48.468920" lon="18.876623"><ele>803</ele><time>2017-01-22T14:34:41+0100</time></trkpt>
+<trkpt lat="48.468888" lon="18.876775"><ele>805</ele><time>2017-01-22T14:34:47+0100</time></trkpt>
+<trkpt lat="48.468849" lon="18.876903"><ele>796</ele><time>2017-01-22T14:34:52+0100</time></trkpt>
+<trkpt lat="48.468859" lon="18.877056"><ele>793</ele><time>2017-01-22T14:34:56+0100</time></trkpt>
+<trkpt lat="48.468850" lon="18.877208"><ele>796</ele><time>2017-01-22T14:35:00+0100</time></trkpt>
+<trkpt lat="48.468849" lon="18.877350"><ele>796</ele><time>2017-01-22T14:35:04+0100</time></trkpt>
+<trkpt lat="48.468862" lon="18.877541"><ele>792</ele><time>2017-01-22T14:35:10+0100</time></trkpt>
+<trkpt lat="48.468901" lon="18.877692"><ele>791</ele><time>2017-01-22T14:35:15+0100</time></trkpt>
+<trkpt lat="48.468921" lon="18.877907"><ele>792</ele><time>2017-01-22T14:35:19+0100</time></trkpt>
+<trkpt lat="48.468944" lon="18.878058"><ele>790</ele><time>2017-01-22T14:35:23+0100</time></trkpt>
+<trkpt lat="48.468950" lon="18.878195"><ele>790</ele><time>2017-01-22T14:35:29+0100</time></trkpt>
+<trkpt lat="48.468916" lon="18.878351"><ele>797</ele><time>2017-01-22T14:35:38+0100</time></trkpt>
+<trkpt lat="48.468900" lon="18.878536"><ele>801</ele><time>2017-01-22T14:35:42+0100</time></trkpt>
+<trkpt lat="48.468899" lon="18.878701"><ele>800</ele><time>2017-01-22T14:35:46+0100</time></trkpt>
+<trkpt lat="48.468881" lon="18.878867"><ele>796</ele><time>2017-01-22T14:35:52+0100</time></trkpt>
+<trkpt lat="48.468872" lon="18.879031"><ele>797</ele><time>2017-01-22T14:35:56+0100</time></trkpt>
+<trkpt lat="48.468852" lon="18.879212"><ele>792</ele><time>2017-01-22T14:36:03+0100</time></trkpt>
+<trkpt lat="48.468813" lon="18.879365"><ele>789</ele><time>2017-01-22T14:36:07+0100</time></trkpt>
+<trkpt lat="48.468796" lon="18.879514"><ele>790</ele><time>2017-01-22T14:36:11+0100</time></trkpt>
+<trkpt lat="48.468798" lon="18.879671"><ele>791</ele><time>2017-01-22T14:36:15+0100</time></trkpt>
+<trkpt lat="48.468775" lon="18.879824"><ele>797</ele><time>2017-01-22T14:36:19+0100</time></trkpt>
+<trkpt lat="48.468766" lon="18.879987"><ele>798</ele><time>2017-01-22T14:36:26+0100</time></trkpt>
+<trkpt lat="48.468750" lon="18.880146"><ele>799</ele><time>2017-01-22T14:36:30+0100</time></trkpt>
+<trkpt lat="48.468717" lon="18.880311"><ele>794</ele><time>2017-01-22T14:36:34+0100</time></trkpt>
+<trkpt lat="48.468626" lon="18.880413"><ele>787</ele><time>2017-01-22T14:36:38+0100</time></trkpt>
+<trkpt lat="48.468559" lon="18.880537"><ele>784</ele><time>2017-01-22T14:36:44+0100</time></trkpt>
+<trkpt lat="48.468596" lon="18.880686"><ele>783</ele><time>2017-01-22T14:36:53+0100</time></trkpt>
+<trkpt lat="48.468604" lon="18.880855"><ele>796</ele><time>2017-01-22T14:37:09+0100</time></trkpt>
+<trkpt lat="48.468630" lon="18.881013"><ele>792</ele><time>2017-01-22T14:37:13+0100</time></trkpt>
+<trkpt lat="48.468648" lon="18.881194"><ele>787</ele><time>2017-01-22T14:37:20+0100</time></trkpt>
+<trkpt lat="48.468644" lon="18.881378"><ele>784</ele><time>2017-01-22T14:37:24+0100</time></trkpt>
+<trkpt lat="48.468644" lon="18.881526"><ele>788</ele><time>2017-01-22T14:37:32+0100</time></trkpt>
+<trkpt lat="48.468632" lon="18.881684"><ele>790</ele><time>2017-01-22T14:37:39+0100</time></trkpt>
+<trkpt lat="48.468629" lon="18.881835"><ele>790</ele><time>2017-01-22T14:37:45+0100</time></trkpt>
+<trkpt lat="48.468683" lon="18.881980"><ele>787</ele><time>2017-01-22T14:37:49+0100</time></trkpt>
+<trkpt lat="48.468746" lon="18.882130"><ele>785</ele><time>2017-01-22T14:37:55+0100</time></trkpt>
+<trkpt lat="48.468798" lon="18.882259"><ele>785</ele><time>2017-01-22T14:38:00+0100</time></trkpt>
+<trkpt lat="48.468756" lon="18.882402"><ele>790</ele><time>2017-01-22T14:38:21+0100</time></trkpt>
+<trkpt lat="48.468767" lon="18.882545"><ele>783</ele><time>2017-01-22T14:38:27+0100</time></trkpt>
+</trkseg>
+</trk>
+</gpx>
\ No newline at end of file
diff --git a/test/data/regress/14287/example.osm b/test/data/regress/14287/example.osm
new file mode 100644
index 0000000..cf3fef6
--- /dev/null
+++ b/test/data/regress/14287/example.osm
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-30910' action='modify' visible='true' lat='-23.50408988778' lon='-51.13765049621' />
+  <node id='-30911' action='modify' visible='true' lat='-23.50516007238' lon='-51.13802724884' />
+  <node id='-30913' action='modify' visible='true' lat='-23.50562134566' lon='-51.13646913871' />
+  <node id='-30915' action='modify' visible='true' lat='-23.50455116481' lon='-51.13609238609' />
+  <node id='-30931' action='modify' visible='true' lat='-23.50454078258' lon='-51.13735486045'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <node id='-30934' action='modify' visible='true' lat='-23.50461949174' lon='-51.13702763095'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <node id='-30935' action='modify' visible='true' lat='-23.50474739403' lon='-51.13740850463'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <node id='-30936' action='modify' visible='true' lat='-23.50491465068' lon='-51.13714564815'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <node id='-30937' action='modify' visible='true' lat='-23.50485561895' lon='-51.1367433168'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <node id='-30938' action='modify' visible='true' lat='-23.50503271407' lon='-51.13685060516'>
+    <tag k='amenity' v='parking' />
+  </node>
+  <way id='-30912' action='modify' visible='true'>
+    <nd ref='-30910' />
+    <nd ref='-30911' />
+    <nd ref='-30913' />
+    <nd ref='-30915' />
+    <nd ref='-30910' />
+    <tag k='amenity' v='parking' />
+  </way>
+</osm>
diff --git a/test/data/regress/14289/example2.osm b/test/data/regress/14289/example2.osm
new file mode 100644
index 0000000..242dd6c
--- /dev/null
+++ b/test/data/regress/14289/example2.osm
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-30485' action='modify' visible='true' lat='-23.2277275943' lon='-51.12651457665' />
+  <node id='-30487' action='modify' visible='true' lat='-23.22434907439' lon='-51.12226912293' />
+  <node id='-30489' action='modify' visible='true' lat='-23.22804935364' lon='-51.12318824177' />
+  <node id='-30491' action='modify' visible='true' lat='-23.22274022534' lon='-51.11793613408' />
+  <node id='-30493' action='modify' visible='true' lat='-23.22652098986' lon='-51.11854887998' />
+  <node id='-30495' action='modify' visible='true' lat='-23.22648076952' lon='-51.12296940395' />
+  <node id='-30497' action='modify' visible='true' lat='-23.2288537486' lon='-51.12467633895' />
+  <node id='-30499' action='modify' visible='true' lat='-23.23014077046' lon='-51.11929292857' />
+  <node id='-30664' action='modify' visible='true' lat='-23.22448675761' lon='-51.12075882171' />
+  <node id='-30665' action='modify' visible='true' lat='-23.22758893344' lon='-51.1210246296' />
+  <node id='-30667' action='modify' visible='true' lat='-23.22773549114' lon='-51.11932345911' />
+  <node id='-30669' action='modify' visible='true' lat='-23.22368066863' lon='-51.11932345911' />
+  <way id='-30509' action='modify' visible='true'>
+    <nd ref='-30487' />
+    <nd ref='-30485' />
+    <nd ref='-30489' />
+    <nd ref='-30491' />
+    <nd ref='-30487' />
+    <tag k='name' v='A' />
+    <tag k='natural' v='wood' />
+  </way>
+  <way id='-30511' action='modify' visible='true'>
+    <nd ref='-30493' />
+    <nd ref='-30495' />
+    <nd ref='-30497' />
+    <nd ref='-30499' />
+    <nd ref='-30493' />
+    <tag k='name' v='B' />
+    <tag k='natural' v='wood' />
+  </way>
+  <way id='-30666' action='modify' visible='true'>
+    <nd ref='-30664' />
+    <nd ref='-30665' />
+    <nd ref='-30667' />
+    <nd ref='-30669' />
+    <nd ref='-30664' />
+    <tag k='name' v='C' />
+    <tag k='natural' v='wood' />
+  </way>
+</osm>
diff --git a/test/data/regress/4539/josm_error_#4539.osm.zip b/test/data/regress/4539/josm_error_#4539.osm.zip
new file mode 100644
index 0000000..6196ad7
Binary files /dev/null and b/test/data/regress/4539/josm_error_#4539.osm.zip differ
diff --git a/test/data/renderer/README b/test/data/renderer/README
new file mode 100644
index 0000000..8d8d329
--- /dev/null
+++ b/test/data/renderer/README
@@ -0,0 +1 @@
+Test files for MapCSSRendererTest
\ No newline at end of file
diff --git a/test/data/renderer/node-shapes/data.osm b/test/data/renderer/node-shapes/data.osm
new file mode 100644
index 0000000..5243a9b
--- /dev/null
+++ b/test/data/renderer/node-shapes/data.osm
@@ -0,0 +1,82 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-30470' action='modify' visible='true' lat='0.1' lon='0.1'>
+    <tag k='test' v='heptagon' />
+  </node>
+  <node id='-30472' action='modify' visible='true' lat='0.1' lon='0.3'>
+    <tag k='test' v='octagon' />
+  </node>
+  <node id='-30474' action='modify' visible='true' lat='0.1' lon='0.5'>
+    <tag k='test' v='nonagon' />
+  </node>
+  <node id='-30476' action='modify' visible='true' lat='0.1' lon='0.7'>
+    <tag k='test' v='decagon' />
+  </node>
+  <node id='-30478' action='modify' visible='true' lat='0.1' lon='0.9'>
+    <tag k='test' v='fill-color' />
+  </node>
+  <node id='-30480' action='modify' visible='true' lat='0.3' lon='0.1'>
+    <tag k='test' v='square' />
+  </node>
+  <node id='-30482' action='modify' visible='true' lat='0.3' lon='0.3'>
+    <tag k='test' v='circle' />
+  </node>
+  <node id='-30484' action='modify' visible='true' lat='0.3' lon='0.5'>
+    <tag k='test' v='triangle' />
+  </node>
+  <node id='-30486' action='modify' visible='true' lat='0.3' lon='0.7'>
+    <tag k='test' v='pentagon' />
+  </node>
+  <node id='-30488' action='modify' visible='true' lat='0.3' lon='0.9'>
+    <tag k='test' v='hexagon' />
+  </node>
+  <node id='-30490' action='modify' visible='true' lat='0.5' lon='0.1'>
+    <tag k='test' v='fill-color-none' />
+  </node>
+  <node id='-30492' action='modify' visible='true' lat='0.5' lon='0.3'>
+    <tag k='test' v='fill-opacity' />
+  </node>
+  <node id='-30494' action='modify' visible='true' lat='0.5' lon='0.5'>
+    <tag k='test' v='stroke-color' />
+  </node>
+  <node id='-30496' action='modify' visible='true' lat='0.5' lon='0.7'>
+    <tag k='test' v='stroke-color-none' />
+  </node>
+  <node id='-30498' action='modify' visible='true' lat='0.5' lon='0.9'>
+    <tag k='test' v='stroke-opacity' />
+  </node>
+  <node id='-30500' action='modify' visible='true' lat='0.7' lon='0.1'>
+    <tag k='test' v='small' />
+  </node>
+  <node id='-30502' action='modify' visible='true' lat='0.7' lon='0.3'>
+    <tag k='test' v='big' />
+  </node>
+  <node id='-30504' action='modify' visible='true' lat='0.7' lon='0.5'>
+    <tag k='test' v='thin' />
+  </node>
+  <node id='-30506' action='modify' visible='true' lat='0.7' lon='0.7'>
+    <tag k='test' v='bold' />
+  </node>
+  <node id='-30508' action='modify' visible='true' lat='0.7' lon='0.9'>
+    <tag k='defaults' v='fill' />
+  </node>
+  <node id='-30510' action='modify' visible='true' lat='0.9' lon='0.1'>
+    <tag k='test' v='small' />
+    <tag k='highlight' v='yes' />
+  </node>
+  <node id='-30512' action='modify' visible='true' lat='0.9' lon='0.3'>
+    <tag k='test' v='big' />
+    <tag k='highlight' v='yes' />
+  </node>
+  <node id='-30514' action='modify' visible='true' lat='0.9' lon='0.5'>
+    <tag k='test' v='thin' />
+    <tag k='highlight' v='yes' />
+  </node>
+  <node id='-30516' action='modify' visible='true' lat='0.9' lon='0.7'>
+    <tag k='test' v='bold' />
+    <tag k='highlight' v='yes' />
+  </node>
+  <node id='-30518' action='modify' visible='true' lat='0.9' lon='0.9'>
+    <tag k='defaults' v='stroke' />
+  </node>
+</osm>
diff --git a/test/data/renderer/node-shapes/reference.png b/test/data/renderer/node-shapes/reference.png
new file mode 100644
index 0000000..c074db4
Binary files /dev/null and b/test/data/renderer/node-shapes/reference.png differ
diff --git a/test/data/renderer/node-shapes/style.mapcss b/test/data/renderer/node-shapes/style.mapcss
new file mode 100644
index 0000000..a0a2848
--- /dev/null
+++ b/test/data/renderer/node-shapes/style.mapcss
@@ -0,0 +1,99 @@
+canvas {
+    default-points: false;
+    default-lines: false;
+}
+
+node[test] {
+	symbol-stroke-color: red;
+	symbol-stroke-opacity: 1;
+	symbol-fill-color: orange;
+	symbol-fill-opacity: 1;
+	
+	symbol-shape: square;
+	symbol-size: 10;
+	symbol-stroke-width: 2;
+}
+
+node[test=circle] {
+	symbol-shape: circle;
+}
+
+node[test=triangle] {
+	symbol-shape: triangle;
+}
+
+node[test=pentagon] {
+	symbol-shape: pentagon;
+}
+
+node[test=hexagon] {
+	symbol-shape: circle;
+}
+
+node[test=heptagon] {
+	symbol-shape: triangle;
+}
+
+node[test=octagon] {
+	symbol-shape: pentagon;
+}
+
+node[test=nonagon] {
+	symbol-shape: circle;
+}
+
+node[test=decagon] {
+	symbol-shape: triangle;
+}
+
+node[test=fill-color] {
+	symbol-fill-color: green;
+}
+
+node[test=fill-color-none] {
+	symbol-fill-color: none;
+}
+
+node[test=fill-opacity] {
+	symbol-fill-opacity: .5;
+}
+
+node[test=stroke-color] {
+	symbol-stroke-color: green;
+}
+
+node[test=stroke-color-none] {
+	symbol-stroke-color: none;
+}
+
+node[test=stroke-opacity] {
+	symbol-stroke-opacity: .5;
+}
+
+node[test=small] {
+	symbol-size: 3;
+	symbol-stroke-width: 1;
+}
+
+node[test=big] {
+	symbol-size: 20;
+}
+
+node[test=thin] {
+	symbol-stroke-width: .5;
+}
+
+node[test=bold] {
+	symbol-stroke-width: 4;
+}
+
+node[defaults=fill] {
+	/* other values are defaults. */
+	symbol-shape: square;
+	symbol-fill-color: red;
+}
+
+node[defaults=stroke] {
+	symbol-shape: square;
+	symbol-stroke-color: red;
+}
\ No newline at end of file
diff --git a/test/data/renderer/way-width/data.osm b/test/data/renderer/way-width/data.osm
new file mode 100644
index 0000000..e99dc1a
--- /dev/null
+++ b/test/data/renderer/way-width/data.osm
@@ -0,0 +1,88 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<osm version='0.6' upload='true' generator='JOSM'>
+  <node id='-30552' action='modify' visible='true' lat='0.1' lon='0.1' />
+  <node id='-30554' action='modify' visible='true' lat='0.1' lon='0.3' />
+  <node id='-30556' action='modify' visible='true' lat='0.1' lon='0.5' />
+  <node id='-30558' action='modify' visible='true' lat='0.1' lon='0.7' />
+  <node id='-30560' action='modify' visible='true' lat='0.1' lon='0.9' />
+  <node id='-30562' action='modify' visible='true' lat='0.3' lon='0.1' />
+  <node id='-30564' action='modify' visible='true' lat='0.3' lon='0.3' />
+  <node id='-30566' action='modify' visible='true' lat='0.3' lon='0.5' />
+  <node id='-30568' action='modify' visible='true' lat='0.3' lon='0.7' />
+  <node id='-30570' action='modify' visible='true' lat='0.3' lon='0.9' />
+  <node id='-30572' action='modify' visible='true' lat='0.5' lon='0.1' />
+  <node id='-30574' action='modify' visible='true' lat='0.5' lon='0.3' />
+  <node id='-30576' action='modify' visible='true' lat='0.5' lon='0.5' />
+  <node id='-30578' action='modify' visible='true' lat='0.5' lon='0.7' />
+  <node id='-30580' action='modify' visible='true' lat='0.5' lon='0.9' />
+  <node id='-30582' action='modify' visible='true' lat='0.7' lon='0.1' />
+  <node id='-30584' action='modify' visible='true' lat='0.7' lon='0.3' />
+  <node id='-30586' action='modify' visible='true' lat='0.7' lon='0.5' />
+  <node id='-30588' action='modify' visible='true' lat='0.7' lon='0.7' />
+  <node id='-30590' action='modify' visible='true' lat='0.7' lon='0.9' />
+  <node id='-30592' action='modify' visible='true' lat='0.9' lon='0.1' />
+  <node id='-30594' action='modify' visible='true' lat='0.9' lon='0.3' />
+  <node id='-30596' action='modify' visible='true' lat='0.9' lon='0.5' />
+  <node id='-30598' action='modify' visible='true' lat='0.9' lon='0.7' />
+  <node id='-30600' action='modify' visible='true' lat='0.9' lon='0.9' />
+  <way id='-30626' action='modify' visible='true'>
+    <nd ref='-30600' />
+    <nd ref='-30598' />
+    <tag k='highlight' v='yes' />
+    <tag k='test' v='width5' />
+  </way>
+  <way id='-30629' action='modify' visible='true'>
+    <nd ref='-30590' />
+    <nd ref='-30588' />
+    <tag k='highlight' v='yes' />
+    <tag k='test' v='width4' />
+  </way>
+  <way id='-30630' action='modify' visible='true'>
+    <nd ref='-30580' />
+    <nd ref='-30578' />
+    <tag k='highlight' v='yes' />
+    <tag k='test' v='width3' />
+  </way>
+  <way id='-30631' action='modify' visible='true'>
+    <nd ref='-30570' />
+    <nd ref='-30568' />
+    <tag k='highlight' v='yes' />
+    <tag k='test' v='width2' />
+  </way>
+  <way id='-30632' action='modify' visible='true'>
+    <nd ref='-30560' />
+    <nd ref='-30558' />
+    <tag k='highlight' v='yes' />
+    <tag k='test' v='width1' />
+  </way>
+  <way id='-30638' action='modify' visible='true'>
+    <nd ref='-30596' />
+    <nd ref='-30594' />
+    <nd ref='-30592' />
+    <tag k='test' v='width5' />
+  </way>
+  <way id='-30640' action='modify' visible='true'>
+    <nd ref='-30586' />
+    <nd ref='-30584' />
+    <nd ref='-30582' />
+    <tag k='test' v='width4' />
+  </way>
+  <way id='-30642' action='modify' visible='true'>
+    <nd ref='-30576' />
+    <nd ref='-30574' />
+    <nd ref='-30572' />
+    <tag k='test' v='width3' />
+  </way>
+  <way id='-30644' action='modify' visible='true'>
+    <nd ref='-30566' />
+    <nd ref='-30564' />
+    <nd ref='-30562' />
+    <tag k='test' v='width2' />
+  </way>
+  <way id='-30646' action='modify' visible='true'>
+    <nd ref='-30556' />
+    <nd ref='-30554' />
+    <nd ref='-30552' />
+    <tag k='test' v='width1' />
+  </way>
+</osm>
diff --git a/test/data/renderer/way-width/reference.png b/test/data/renderer/way-width/reference.png
new file mode 100644
index 0000000..9aaf0ed
Binary files /dev/null and b/test/data/renderer/way-width/reference.png differ
diff --git a/test/data/renderer/way-width/style.mapcss b/test/data/renderer/way-width/style.mapcss
new file mode 100644
index 0000000..233048d
--- /dev/null
+++ b/test/data/renderer/way-width/style.mapcss
@@ -0,0 +1,28 @@
+canvas {
+    default-points: false;
+    default-lines: false;
+}
+
+way[test] {
+	color: green;
+}
+
+way[test=width5] {
+	width: thinnest;
+}
+
+way[test=width4] {
+	width: 10.5;
+}
+
+way[test=width3] {
+	width: 30;
+}
+
+way[test=width2] {
+	width: 3;
+}
+
+way[test=width1] {
+	width: .5;
+}
diff --git a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
index 9cb785c..5dc1488 100644
--- a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
@@ -3,11 +3,17 @@ package org.openstreetmap.josm.actions.search;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
 import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
@@ -82,7 +88,7 @@ public class SearchCompilerTest {
         }
     }
 
-    protected OsmPrimitive newPrimitive(String key, String value) {
+    private static OsmPrimitive newPrimitive(String key, String value) {
         final Node p = new Node();
         p.put(key, value);
         return p;
@@ -465,4 +471,14 @@ public class SearchCompilerTest {
         setting.text = "[";
         SearchCompiler.compile(setting);
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14217">Bug #14217</a>.
+     * @throws Exception never
+     */
+    @Test
+    public void testTicket14217() throws Exception {
+        assertNotNull(SearchCompiler.compile(new String(Files.readAllBytes(
+                Paths.get(TestUtils.getRegressionDataFile(14217, "filter.txt"))), StandardCharsets.UTF_8)));
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrectorTest.java b/test/unit/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrectorTest.java
index 8bc8218..26d1d61 100644
--- a/test/unit/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrectorTest.java
+++ b/test/unit/org/openstreetmap/josm/corrector/ReverseWayNoTagCorrectorTest.java
@@ -29,7 +29,7 @@ public class ReverseWayNoTagCorrectorTest {
     public void testDirectionalTags() {
         assertEquals(1, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("waterway", "drain")).size());
         assertEquals(1, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("man_made", "embankment")).size());
-        assertEquals(1, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("aerialway", "cable_car")).size());
+        assertEquals(1, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("aerialway", "drag_lift")).size());
         assertEquals(0, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("aerialway", "station")).size());
         assertEquals(0, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("incline", "up")).size());
         assertEquals(0, ReverseWayNoTagCorrector.getDirectionalTags(new Tag("oneway", "yes")).size());
diff --git a/test/unit/org/openstreetmap/josm/data/cache/HostLimitQueueTest.java b/test/unit/org/openstreetmap/josm/data/cache/HostLimitQueueTest.java
new file mode 100644
index 0000000..bd35d19
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/cache/HostLimitQueueTest.java
@@ -0,0 +1,164 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.cache;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.commons.jcs.access.behavior.ICacheAccess;
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.tools.Utils;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Simple tests for ThreadPoolExecutor / HostLimitQueue veryfing, that this pair works OK
+ * @author Wiktor Niesiobedzki
+ */
+public class HostLimitQueueTest {
+    /**
+     * Setup test.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().timeout(20 * 1000);
+
+    private static ThreadPoolExecutor getNewThreadPoolExecutor(String nameFormat, int workers, int queueLimit) {
+        HostLimitQueue workQueue = new HostLimitQueue(queueLimit);
+        ThreadPoolExecutor executor = new ThreadPoolExecutor(
+                0, // 0 so for unused thread pools threads will eventually die, freeing also the threadpool
+                workers, // do not this number of threads
+                300, // keepalive for thread
+                TimeUnit.SECONDS,
+                workQueue,
+                Utils.newThreadFactory(nameFormat, Thread.NORM_PRIORITY)
+                );
+        workQueue.setExecutor(executor);
+        return executor;
+    }
+
+    /**
+     * Mock class for tests
+     */
+    static class Task extends JCSCachedTileLoaderJob<String, CacheEntry> {
+        private URL url;
+        private AtomicInteger counter;
+
+        Task(ICacheAccess<String, CacheEntry> cache, URL url, AtomicInteger counter) {
+            super(cache, 1, 1, null);
+            this.url = url;
+            this.counter = counter;
+        }
+
+        @Override
+        public void run() {
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                Main.trace(e);
+            } finally {
+                this.counter.incrementAndGet();
+                executionFinished();
+            }
+        }
+
+        @Override
+        public String getCacheKey() {
+            return "";
+        }
+
+        @Override
+        public URL getUrl() throws IOException {
+            return this.url;
+       }
+
+        @Override
+        protected CacheEntry createCacheEntry(byte[] content) {
+            return null;
+        }
+    }
+
+    /**
+     * Check if single threaded execution works properly
+     * @throws Exception in case of error
+     */
+    @Test
+    public void testSingleThreadPerHost() throws Exception {
+        ThreadPoolExecutor tpe = getNewThreadPoolExecutor("test-%d", 3, 1);
+        ICacheAccess<String, CacheEntry> cache = JCSCacheManager.getCache("test", 3, 0, "");
+        AtomicInteger counter = new AtomicInteger(0);
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < 10; i++) {
+            tpe.execute(new Task(cache, new URL("http://localhost/"+i), counter));
+        }
+        tpe.shutdown();
+        tpe.awaitTermination(15, TimeUnit.SECONDS); // at most it should take ~10 seconds, so after 15 it's already failed
+        long duration = System.currentTimeMillis() - start;
+        // check that all tasks were executed
+        assertEquals(10, counter.get());
+        // although there are 3 threads, we can make only 1 parallel call to localhost
+        // so it should take ~10 seconds to finish
+        // if it's shorter, it means that host limit does not work
+        assertTrue("Expected duration between 9 and 11 seconds not met. Actual duration: " + (duration /1000),
+                duration < 11*1000 & duration > 9*1000);
+    }
+
+    /**
+     * Check if two threaded execution work properly
+     * @throws Exception in case of error
+     */
+    @Test
+    public void testMultipleThreadPerHost() throws Exception {
+        ThreadPoolExecutor tpe = getNewThreadPoolExecutor("test-%d", 3, 2);
+        ICacheAccess<String, CacheEntry> cache = JCSCacheManager.getCache("test", 3, 0, "");
+        AtomicInteger counter = new AtomicInteger(0);
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < 10; i++) {
+            tpe.execute(new Task(cache, new URL("http://hostlocal/"+i), counter));
+        }
+        tpe.shutdown();
+        tpe.awaitTermination(15, TimeUnit.SECONDS);
+        long duration = System.currentTimeMillis() - start;
+        // check that all tasks were executed
+        assertEquals(10, counter.get());
+        // although there are 3 threads, we can make only 2 parallel call to localhost
+        // so it should take ~5 seconds to finish
+        // if it's shorter, it means that host limit does not work
+        assertTrue("Expected duration between 4 and 6 seconds not met. Actual duration: " + (duration /1000),
+                duration < 6*1000 & duration > 4*1000);
+    }
+
+    /**
+     * Check two hosts
+     * @throws Exception in case of error
+     */
+    @Test
+    public void testTwoHosts() throws Exception {
+        ThreadPoolExecutor tpe = getNewThreadPoolExecutor("test-%d", 3, 1);
+        ICacheAccess<String, CacheEntry> cache = JCSCacheManager.getCache("test", 3, 0, "");
+        AtomicInteger counter = new AtomicInteger(0);
+        long start = System.currentTimeMillis();
+        for (int i = 0; i < 10; i++) {
+            String url = (i % 2 == 0) ? "http://localhost" : "http://hostlocal";
+            tpe.execute(new Task(cache, new URL(url+i), counter));
+        }
+        tpe.shutdown();
+        tpe.awaitTermination(15, TimeUnit.SECONDS);
+        long duration = System.currentTimeMillis() - start;
+        // check that all tasks were executed
+        assertEquals(10, counter.get());
+        // although there are 3 threads, we can make only 1 parallel per host, and we have 2 hosts
+        // so it should take ~5 seconds to finish
+        // if it's shorter, it means that host limit does not work
+        assertTrue("Expected duration between 4 and 6 seconds not met. Actual duration: " + (duration /1000),
+                duration < 6*1000 & duration > 4*1000);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
index 0f7a57c..821a337 100644
--- a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
+++ b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
@@ -10,8 +10,10 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
+import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.cache.ICachedLoaderListener.LoadResult;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
@@ -75,6 +77,15 @@ public class JCSCachedTileLoaderJobTest {
     public JOSMTestRules test = new JOSMTestRules().preferences();
 
     /**
+     * Always clear cache before tests
+     * @throws Exception when clearing fails
+     */
+    @Before
+    public void clearCache() throws Exception {
+        getCache().clear();
+    }
+
+    /**
      * Test status codes
      * @throws InterruptedException in case of thread interruption
      * @throws IOException in case of I/O error
@@ -95,23 +106,26 @@ public class JCSCachedTileLoaderJobTest {
 
     /**
      * Test unknown host
-     * @throws InterruptedException in case of thread interruption
      * @throws IOException in case of I/O error
      */
     @Test
-    @SuppressFBWarnings(value = "WA_NOT_IN_LOOP")
-    public void testUnknownHost() throws IOException, InterruptedException {
+    public void testUnknownHost() throws IOException {
         String key = "key_unknown_host";
         TestCachedTileLoaderJob job = new TestCachedTileLoaderJob("http://unkownhost.unkownhost/unkown", key);
         Listener listener = new Listener();
         job.submit(listener, true);
         synchronized (listener) {
-            if (!listener.ready) {
-                listener.wait();
+            while (!listener.ready) {
+                try {
+                    listener.wait();
+                } catch (InterruptedException e1) {
+                    // do nothing, still wait
+                    Main.trace(e1);
+                }
             }
         }
-        assertEquals("java.net.UnknownHostException: unkownhost.unkownhost", listener.attributes.getErrorMessage());
         assertEquals(LoadResult.FAILURE, listener.result); // because response will be cached, and that is checked below
+        assertEquals("java.net.UnknownHostException: unkownhost.unkownhost", listener.attributes.getErrorMessage());
 
         ICacheAccess<String, CacheEntry> cache = getCache();
         CacheEntry e = new CacheEntry(new byte[]{0, 1, 2, 3});
@@ -123,8 +137,13 @@ public class JCSCachedTileLoaderJobTest {
         listener = new Listener();
         job.submit(listener, true);
         synchronized (listener) {
-            if (!listener.ready) {
-                listener.wait();
+            while (!listener.ready) {
+                try {
+                    listener.wait();
+                } catch (InterruptedException e1) {
+                    // do nothing, wait
+                    Main.trace(e1);
+                }
             }
         }
         assertEquals(LoadResult.SUCCESS, listener.result);
diff --git a/test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java b/test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java
index c9b9deb..e9fde65 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java
@@ -1,14 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.osm;
 
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.Assert;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.util.List;
-import org.openstreetmap.josm.data.coor.LatLon;
 
 /**
  * Unit tests for class {@link DataSet}.
@@ -33,14 +35,14 @@ public class DataSetTest {
             "Empty data set should produce an empty list.",
             ds.searchRelations(null).isEmpty()
         );
-        
+
         // empty data set, any bbox => empty list
-        BBox bbox = new BBox(LatLon.NORTH_POLE, LatLon.SOUTH_POLE);
+        BBox bbox = new BBox(new LatLon(-180, -90), new LatLon(180, 90));
         Assert.assertTrue(
             "Empty data set should produce an empty list.",
             ds.searchRelations(bbox).isEmpty()
         );
-        
+
         // data set with elements in the given bbox => these elements
         Node node = new Node(LatLon.ZERO);
         Relation r = new Relation(1);
@@ -52,6 +54,26 @@ public class DataSetTest {
         List<Relation> result = ds.searchRelations(bbox);
         Assert.assertEquals("We should have found only one item.", 1, result.size());
         Assert.assertTrue("The item found is relation r.", result.contains(r));
-        
+    }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14186">Bug #14186</a>.
+     */
+    @Test
+    public void testTicket14186() {
+        final DataSet ds = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(2);
+        Node n3 = new Node(3);
+        Way w1 = new Way(1);
+        w1.setNodes(Arrays.asList(n1, n2, n3));
+        Way w2 = new Way(2);
+        w2.setNodes(Arrays.asList(n1, n2, n3));
+        ds.addPrimitive(n1);
+        ds.addPrimitive(n2);
+        ds.addPrimitive(n3);
+        ds.addPrimitive(w1);
+        ds.addPrimitive(w2);
+        ds.unlinkNodeFromWays(n2);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
index 1d18fbc..8a24d96 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
@@ -6,16 +6,20 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.InputStream;
 import java.io.StringReader;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.ChangePropertyKeyCommand;
 import org.openstreetmap.josm.command.Command;
@@ -28,7 +32,10 @@ import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.ParseResult;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.TagCheck;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
+import org.openstreetmap.josm.io.OsmReader;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -43,7 +50,7 @@ public class MapCSSTagCheckerTest {
      */
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
+    public JOSMTestRules test = new JOSMTestRules().projection().platform();
 
     static MapCSSTagChecker buildTagChecker(String css) throws ParseException {
         final MapCSSTagChecker test = new MapCSSTagChecker();
@@ -57,7 +64,7 @@ public class MapCSSTagCheckerTest {
      */
     @Test
     public void testNaturalMarsh() throws ParseException {
-        ParseResult result = MapCSSTagChecker.TagCheck.readMapCSS(new StringReader(
+        ParseResult result = TagCheck.readMapCSS(new StringReader(
                 "*[natural=marsh] {\n" +
                 "   group: tr(\"deprecated\");\n" +
                 "   throwWarning: tr(\"{0}={1} is deprecated\", \"{0.key}\", tag(\"natural\"));\n" +
@@ -65,10 +72,10 @@ public class MapCSSTagCheckerTest {
                 "   fixAdd: \"natural=wetland\";\n" +
                 "   fixAdd: \"wetland=marsh\";\n" +
                 "}"));
-        final List<MapCSSTagChecker.TagCheck> checks = result.parseChecks;
+        final List<TagCheck> checks = result.parseChecks;
         assertEquals(1, checks.size());
         assertTrue(result.parseErrors.isEmpty());
-        final MapCSSTagChecker.TagCheck check = checks.get(0);
+        final TagCheck check = checks.get(0);
         assertNotNull(check);
         assertEquals("{0.key}=null is deprecated", check.getDescription(null));
         assertEquals("fixRemove: {0.key}", check.fixCommands.get(0).toString());
@@ -86,7 +93,7 @@ public class MapCSSTagCheckerTest {
         n2.put("natural", "wood");
         assertFalse(check.test(n2));
         assertEquals("The key is natural and the value is marsh",
-                MapCSSTagChecker.TagCheck.insertArguments(check.rule.selectors.get(0), "The key is {0.key} and the value is {0.value}", null));
+                TagCheck.insertArguments(check.rule.selectors.get(0), "The key is {0.key} and the value is {0.value}", null));
     }
 
     /**
@@ -144,12 +151,16 @@ public class MapCSSTagCheckerTest {
      */
     @Test
     public void testTicket13630() throws ParseException {
-        ParseResult result = MapCSSTagChecker.TagCheck.readMapCSS(new StringReader(
+        ParseResult result = TagCheck.readMapCSS(new StringReader(
                 "node[crossing=zebra] {fixRemove: \"crossing=zebra\";}"));
         assertTrue(result.parseChecks.isEmpty());
         assertEquals(1, result.parseErrors.size());
     }
 
+    /**
+     * Unit test of {@code min-josm-version} processing.
+     * @throws ParseException if a parsing error occurs
+     */
     @Test
     public void testPreprocessing() throws ParseException {
         final MapCSSTagChecker test = buildTagChecker("" +
@@ -159,6 +170,10 @@ public class MapCSSTagCheckerTest {
         assertEquals(0, test.getErrorsForPrimitive(OsmUtils.createPrimitive("way bar=1"), false).size());
     }
 
+    /**
+     * Unit test of {@link MapCSSTagChecker#initialize}.
+     * @throws Exception if an error occurs
+     */
     @Test
     public void testInit() throws Exception {
         MapCSSTagChecker c = new MapCSSTagChecker();
@@ -186,4 +201,65 @@ public class MapCSSTagCheckerTest {
                 "}"));
         assertTrue(parseResult.parseErrors.isEmpty());
     }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14287">Bug #14287</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    @Ignore("not fixed yet")
+    public void testTicket14287() throws Exception {
+        final MapCSSTagChecker test = buildTagChecker(
+                "node[amenity=parking] ∈ *[amenity=parking] {" +
+                "  throwWarning: tr(\"{0} inside {1}\", \"amenity=parking\", \"amenity=parking\");" +
+                "}");
+        try (InputStream is = TestUtils.getRegressionDataStream(14287, "example.osm")) {
+            test.visit(OsmReader.parseDataSet(is, null).allPrimitives());
+            assertEquals(6, test.getErrors().size());
+        }
+    }
+
+    private void doTestNaturalWood(int ticket, String filename, int errorsCount, int setsCount) throws Exception {
+        final MapCSSTagChecker test = buildTagChecker(
+                "area:closed:areaStyle[tag(\"natural\") = parent_tag(\"natural\")] ⧉ area:closed:areaStyle[natural] {" +
+                "  throwWarning: tr(\"Overlapping Identical Natural Areas\");" +
+                "}");
+        final MapCSSStyleSource style = new MapCSSStyleSource(
+                "area[natural=wood] {" +
+                "    fill-color: woodarea#008000;" +
+                "}");
+        MapPaintStyles.addStyle(style);
+        try (InputStream is = TestUtils.getRegressionDataStream(ticket, filename)) {
+            test.visit(OsmReader.parseDataSet(is, null).allPrimitives());
+            List<TestError> errors = test.getErrors();
+            assertEquals(errorsCount, errors.size());
+            Set<Set<OsmPrimitive>> primitives = new HashSet<>();
+            for (TestError e : errors) {
+                primitives.add(new HashSet<>(e.getPrimitives()));
+            }
+            assertEquals(setsCount, primitives.size());
+        } finally {
+            MapPaintStyles.removeStyle(style);
+        }
+    }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12627">Bug #12627</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    @Ignore("not fixed yet")
+    public void testTicket12627() throws Exception {
+        doTestNaturalWood(12627, "overlapping.osm", 1, 1);
+    }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14289">Bug #14289</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    @Ignore("not fixed yet")
+    public void testTicket14289() throws Exception {
+        doTestNaturalWood(14289, "example2.osm", 3, 3);
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java
index 48c894c..a7a5eb5 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java
@@ -74,7 +74,7 @@ public class RelationCheckerTest {
 
         List<TestError> errors = testRelation(r);
         assertEquals(1, errors.size());
-        assertEquals("Role outer2 unknown in templates outer/inner", errors.get(0).getDescription());
+        assertEquals("Role 'outer2' unknown in templates 'outer/inner'", errors.get(0).getDescription());
     }
 
     @Test
@@ -85,7 +85,7 @@ public class RelationCheckerTest {
 
         List<TestError> errors = testRelation(r);
         assertEquals(1, errors.size());
-        assertEquals("Role via missing", errors.get(0).getDescription());
+        assertEquals("Role 'via' missing", errors.get(0).getDescription());
     }
 
     @Test
@@ -97,7 +97,7 @@ public class RelationCheckerTest {
 
         List<TestError> errors = testRelation(r);
         assertEquals(1, errors.size());
-        assertEquals("Role member type relation does not match accepted list of node/way in template Turn Restriction",
+        assertEquals("Type 'relation' of relation member with role 'via' does not match accepted types 'node/way' in template Turn Restriction",
                 errors.get(0).getDescription());
     }
 
@@ -111,7 +111,7 @@ public class RelationCheckerTest {
 
         List<TestError> errors = testRelation(r);
         assertEquals(1, errors.size());
-        assertEquals("Number of from roles too high (2)", errors.get(0).getDescription());
+        assertEquals("Number of 'from' roles too high (2)", errors.get(0).getDescription());
     }
 
     @Test
@@ -134,7 +134,7 @@ public class RelationCheckerTest {
 
         List<TestError> errors = testRelation(r);
         assertEquals(1, errors.size());
-        assertEquals("Role member does not match expression power in template Power Route", errors.get(0).getDescription());
+        assertEquals("Role of relation member does not match expression 'power' in template Power Route", errors.get(0).getDescription());
     }
 
     @Test
@@ -147,20 +147,21 @@ public class RelationCheckerTest {
 
         r.addMember(new RelationMember("", createPrimitive("way no-rail-way=yes")));
         assertEquals(1, testRelation(r).size());
-        assertEquals("Role member does not match expression railway in template Public Transport Route (Rail)",
+        assertEquals("Role of relation member does not match expression 'railway' in template Public Transport Route (Rail)",
                 testRelation(r).get(0).getDescription());
 
         r.removeMember(3);
         r.addMember(new RelationMember("stop", createPrimitive("way no-rail-way=yes")));
         assertEquals(1, testRelation(r).size());
-        assertEquals("Role member type way does not match accepted list of node in template Public Transport Route (Rail)",
+        assertEquals(
+                "Type 'way' of relation member with role 'stop' does not match accepted types 'node' in template Public Transport Route (Rail)",
                 testRelation(r).get(0).getDescription());
 
         r.removeMember(3);
         r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position bus=yes")));
         assertEquals(1, testRelation(r).size());
-        assertEquals("Role member does not match expression public_transport=stop_position && "+
-                "(train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes) in template Public Transport Route (Rail)",
+        assertEquals("Role of relation member does not match expression 'public_transport=stop_position && "+
+                "(train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes)' in template Public Transport Route (Rail)",
                 testRelation(r).get(0).getDescription());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java
index 3e24681..9bacd92 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java
@@ -24,19 +24,20 @@ public class SelfIntersectingWayTest {
      */
     @BeforeClass
     public static void setUp() throws Exception {
-        JOSMFixture.createUnitTestFixture().init(true);
+        JOSMFixture.createUnitTestFixture().init(false);
     }
 
     private static List<Node> createNodes() {
         List<Node> nodes = new ArrayList<>();
-        for (int i = 0; i < 5; i++) {
+        for (int i = 0; i < 6; i++) {
             nodes.add(new Node(i+1));
         }
-        nodes.get(0).setCoor(new LatLon(34.2680878298, 133.56336369008));
-        nodes.get(1).setCoor(new LatLon(34.25096598132, 133.54891792012));
-        nodes.get(2).setCoor(new LatLon(34.24466741332, 133.56693544639));
-        nodes.get(3).setCoor(new LatLon(34.26815342405, 133.56066502976));
-        nodes.get(4).setCoor(new LatLon(34.26567411471, 133.56132705125));
+        nodes.get(0).setCoor(new LatLon(34.2680, 133.563));
+        nodes.get(1).setCoor(new LatLon(34.2509, 133.548));
+        nodes.get(2).setCoor(new LatLon(34.2446, 133.566));
+        nodes.get(3).setCoor(new LatLon(34.2681, 133.560));
+        nodes.get(4).setCoor(new LatLon(34.2656, 133.561));
+        nodes.get(5).setCoor(new LatLon(34.2655, 133.562));
         return nodes;
     }
 
@@ -85,6 +86,28 @@ public class SelfIntersectingWayTest {
     }
 
     /**
+     * First node is identical to an inner node ("P"-Shape).
+     * This is considered okay.
+     */
+    @Test
+    public void testUnclosedWayFirstRepeated() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(0, test.getErrors().size());
+    }
+
+    /**
      * Last node is identical to an inner node ("b"-Shape).
      * This is considered okay.
      */
@@ -108,7 +131,7 @@ public class SelfIntersectingWayTest {
 
     /**
      * Both endpoints join at one inner node ("8"-shape).
-     * This is considered okay.
+     * This is considered to be an error.
      */
     @Test
     public void testClosedWay() {
@@ -126,7 +149,102 @@ public class SelfIntersectingWayTest {
         w.setNodes(wayNodes);
         SelfIntersectingWay test = new SelfIntersectingWay();
         test.visit(w);
-        Assert.assertEquals(0, test.getErrors().size());
+        Assert.assertEquals(1, test.getErrors().size());
+        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
+    }
+
+    /**
+     * Closed way contains a spike.
+     * This is considered to be an error.
+     */
+    @Test
+    public void testSpikeWithStartInClosedWay() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(0)); // problem
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        wayNodes.add(nodes.get(0));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(1, test.getErrors().size());
+        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
+    }
+
+    /**
+     * Closed way contains a spike.
+     * This is considered to be an error.
+     */
+    @Test
+    public void testSpikeWithEndInClosedWay() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0)); // problem
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(0));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(1, test.getErrors().size());
+        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
+    }
+
+    /**
+     * Closed way contains a spike.
+     * This is considered to be an error.
+     */
+    @Test
+    public void testSpikeInClosedWay() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(1, test.getErrors().size());
+        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(2)));
+    }
+
+    /**
+     * Closed way with barbell shape (a-b-c-a-d-e-f-d).
+     * This is considered to be an error.
+     */
+    @Test
+    public void testClosedWayBarbell() {
+        List<Node> nodes = createNodes();
+
+        Way w = (Way) OsmUtils.createPrimitive("way ");
+        List<Node> wayNodes = new ArrayList<>();
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(1));
+        wayNodes.add(nodes.get(2));
+        wayNodes.add(nodes.get(0));
+        wayNodes.add(nodes.get(3));
+        wayNodes.add(nodes.get(4));
+        wayNodes.add(nodes.get(5));
+        wayNodes.add(nodes.get(3));
+        w.setNodes(wayNodes);
+        SelfIntersectingWay test = new SelfIntersectingWay();
+        test.visit(w);
+        Assert.assertEquals(1, test.getErrors().size());
+        Assert.assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(3)));
     }
 
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java
new file mode 100644
index 0000000..5181e0e
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java
@@ -0,0 +1,58 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.layer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.InputStream;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Unit tests of {@link DuplicateAction} class.
+ */
+public class DuplicateActionTest {
+    /**
+     * TMS layer needs prefs. Platform for LayerListDialog shortcuts.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/4539">#4539</a>.
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testTicket4539() throws Exception {
+        try (InputStream is = TestUtils.getRegressionDataStream(4539, "josm_error_#4539.osm.zip")) {
+            OsmDataLayer layer = new OsmDataLayer(OsmReader.parseDataSet(is, null), null, null);
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
+            assertNull(editLayer);
+            try {
+                new DuplicateAction(layer, null).actionPerformed(null);
+                editLayer = Main.getLayerManager().getEditLayer();
+                assertNotNull(editLayer);
+                assertFalse(layer.equals(editLayer));
+                assertEquals(layer.data.getNodes().size(), editLayer.data.getNodes().size());
+                assertEquals(layer.data.getWays().size(), editLayer.data.getWays().size());
+                assertEquals(layer.data.getRelations().size(), editLayer.data.getRelations().size());
+            } finally {
+                // Ensure we clean the place before leaving, even if test fails.
+                if (editLayer != null) {
+                    Main.getLayerManager().removeLayer(editLayer);
+                }
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerActionTest.java b/test/unit/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerActionTest.java
index d6aeb3b..1f3d8fd 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerActionTest.java
@@ -2,6 +2,9 @@
 package org.openstreetmap.josm.gui.layer.gpx;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.IOException;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -12,6 +15,7 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.TagMap;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.io.GpxReaderTest;
+import org.xml.sax.SAXException;
 
 /**
  * Unit tests of {@link ConvertToDataLayerAction} class.
@@ -39,4 +43,14 @@ public class ConvertToDataLayerActionTest {
         assertEquals(new TagMap("name", "Schranke", "description", "Pfad", "note", "Pfad", "gpxicon", "Toll Booth"),
                 osm.getNodes().iterator().next().getKeys());
     }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/14275">#14275</a>
+     * @throws IOException if an error occurs during reading
+     * @throws SAXException if any XML error occurs
+     */
+    @Test
+    public void testTicket14275() throws IOException, SAXException {
+        assertNotNull(GpxReaderTest.parseGpxData(TestUtils.getRegressionDataFile(14275, "1485101437.8189685.gpx")));
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java b/test/unit/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java
new file mode 100644
index 0000000..b305166
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java
@@ -0,0 +1,199 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.mappaint;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.awt.Point;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.imageio.ImageIO;
+
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
+import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
+import org.openstreetmap.josm.gui.preferences.SourceEntry;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Test cases for {@link StyledMapRenderer} and the MapCSS classes.
+ * <p>
+ * This test uses the data and reference files stored in the test data directory {@value #TEST_DATA_BASE}
+ * @author Michael Zangl
+ */
+ at RunWith(Parameterized.class)
+public class MapCSSRendererTest {
+    private static final String TEST_DATA_BASE = "/renderer/";
+    /**
+     * lat = 0..1, lon = 0..1
+     */
+    private static final Bounds AREA_DEFAULT = new Bounds(0, 0, 1, 1);
+    private static final int IMAGE_SIZE = 256;
+
+    /**
+     * Minimal test rules required
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().projection();
+
+    private TestConfig testConfig;
+
+    /**
+     * The different configurations of this test.
+     * @return The parameters.
+     */
+    @Parameters
+    public static Collection<Object[]> runs() {
+        return Stream.of(
+                /** Tests for StyledMapRenderer#drawNodeSymbol */
+                new TestConfig("node-shapes", AREA_DEFAULT),
+
+                /** Tests that StyledMapRenderer#drawWay respects width */
+                new TestConfig("way-width", AREA_DEFAULT)
+
+                ).map(e -> new Object[] {e})
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * @param testConfig The config to use for this test.
+     */
+    public MapCSSRendererTest(TestConfig testConfig) {
+        this.testConfig = testConfig;
+    }
+
+    /**
+     * Run the test using {@link #testConfig}
+     * @throws Exception if an error occurs
+     */
+    @Test
+    @Ignore("not ready")
+    public void testRender() throws Exception {
+        // load the data
+        DataSet dataSet = testConfig.getOsmDataSet();
+
+        // load the style
+        MapCSSStyleSource.STYLE_SOURCE_LOCK.writeLock().lock();
+        try {
+            MapPaintStyles.getStyles().clear();
+
+            MapCSSStyleSource source = new MapCSSStyleSource(testConfig.getStyleSourceEntry());
+            source.loadStyleSource();
+            if (!source.getErrors().isEmpty()) {
+                fail("Failed to load style file. Errors: " + source.getErrors());
+            }
+            MapPaintStyles.getStyles().setStyleSources(Arrays.asList(source));
+
+        } finally {
+            MapCSSStyleSource.STYLE_SOURCE_LOCK.writeLock().unlock();
+        }
+
+        // create the renderer
+        BufferedImage image = new BufferedImage(IMAGE_SIZE, IMAGE_SIZE, BufferedImage.TYPE_INT_ARGB);
+        NavigatableComponent nc = new NavigatableComponent() {
+            {
+                setBounds(0, 0, IMAGE_SIZE, IMAGE_SIZE);
+                updateLocationState();
+            }
+
+            @Override
+            protected boolean isVisibleOnScreen() {
+                return true;
+            }
+
+            @Override
+            public Point getLocationOnScreen() {
+                return new Point(0, 0);
+            }
+        };
+        nc.zoomTo(testConfig.testArea);
+        dataSet.allPrimitives().stream().forEach(n -> n.setHighlighted(n.isKeyTrue("highlight")));
+        new StyledMapRenderer(image.createGraphics(), nc, false).render(dataSet, false, testConfig.testArea);
+
+        BufferedImage reference = testConfig.getReference();
+
+        // now compute differences:
+        assertEquals(IMAGE_SIZE, reference.getWidth());
+        assertEquals(IMAGE_SIZE, reference.getHeight());
+
+        StringBuilder differences = new StringBuilder();
+
+        for (int y = 0; y < reference.getHeight(); y++) {
+            for (int x = 0; x < reference.getWidth(); x++) {
+                int expected = reference.getRGB(x, y);
+                int result = image.getRGB(x, y);
+                if (expected != result && differences.length() < 500) {
+                    differences.append("\nDifference at ")
+                               .append(x)
+                               .append(",")
+                               .append(y)
+                               .append(": Expected ")
+                               .append(Integer.toHexString(expected))
+                               .append(" but got ")
+                               .append(Integer.toHexString(result));
+                }
+            }
+        }
+
+        if (differences.length() > 0) {
+            // You can use this to debug:
+            ImageIO.write(image, "png", new File(testConfig.getTestDirectory() + "/test-output.png"));
+            fail("Images for test " + testConfig.testDirectory + " differ: " + differences.toString());
+        }
+    }
+
+    private static class TestConfig {
+        private final String testDirectory;
+        private final Bounds testArea;
+
+        TestConfig(String testDirectory, Bounds testArea) {
+            this.testDirectory = testDirectory;
+            this.testArea = testArea;
+        }
+
+        public BufferedImage getReference() throws IOException {
+            return ImageIO.read(new File(getTestDirectory() + "/reference.png"));
+        }
+
+        private String getTestDirectory() {
+            return TestUtils.getTestDataRoot() + TEST_DATA_BASE + testDirectory;
+        }
+
+        public SourceEntry getStyleSourceEntry() {
+            return new SourceEntry(getTestDirectory() + "/style.mapcss",
+                    "test style", "a test style", true // active
+            );
+        }
+
+        public DataSet getOsmDataSet() throws FileNotFoundException, IllegalDataException {
+            return OsmReader.parseDataSet(new FileInputStream(getTestDirectory() + "/data.osm"), null);
+        }
+
+        @Override
+        public String toString() {
+            return "TestConfig [testDirectory=" + testDirectory + ", testArea=" + testArea + ']';
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java b/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
new file mode 100644
index 0000000..18c8e0a
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.InputStream;
+
+import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * Unit tests of {@link OsmReader} class.
+ */
+public class OsmReaderTest {
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/14199">Bug #14199</a>.
+     * @throws Exception if any error occurs
+     */
+    @Test
+    public void testTicket14199() throws Exception {
+        try (InputStream in = TestUtils.getRegressionDataStream(14199, "emptytag.osm")) {
+            Way w = OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE).getWays().iterator().next();
+            assertEquals(1, w.getKeys().size());
+            assertNull(w.get("  "));
+            assertTrue(w.isModified());
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index 0b9d87b..f68e429 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -23,6 +23,7 @@ import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * EXIF metadata extraction test
  * @since 6209
@@ -69,14 +70,20 @@ public class ExifReaderTest {
     @Test
     public void testReadTimeSubSecond1() throws ParseException {
         Date date = ExifReader.readTime(new File("data_nodist/IMG_20150711_193419.jpg"));
-        String dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(date);
-        assertEquals("2015-07-11T19:34:19.100", dateStr);
+        doTest("2015-07-11T19:34:19.100", date);
 
         TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         date = ExifReader.readTime(new File("data_nodist/IMG_20150711_193419.jpg"));
         TimeZone.setDefault(DateUtils.UTC);
-        dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(date);
-        assertEquals("2015-07-11T17:34:19.100", dateStr);
+        doTest("2015-07-11T17:34:19.100", date);
+    }
+
+    private static void doTest(String expectedDate, Date parsedDate) {
+        assertEquals(expectedDate, new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(parsedDate));
+    }
+
+    private static void doTestFile(String expectedDate, int ticket, String filename) {
+        doTest(expectedDate, ExifReader.readTime(new File(TestUtils.getRegressionDataFile(ticket, filename))));
     }
 
     /**
@@ -114,8 +121,16 @@ public class ExifReaderTest {
      */
     @Test
     public void testTicket11685() throws IOException {
-        File file = new File(TestUtils.getRegressionDataFile(11685, "2015-11-08_15-33-27-Xiaomi_YI-Y0030832.jpg"));
-        String dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(ExifReader.readTime(file));
-        assertEquals("2015-11-08T15:33:27.500", dateStr);
+        doTestFile("2015-11-08T15:33:27.500", 11685, "2015-11-08_15-33-27-Xiaomi_YI-Y0030832.jpg");
+    }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/14209">#14209</a>
+     * @throws IOException if an error occurs during reading
+     */
+    @Test
+    public void testTicket14209() throws IOException {
+        doTestFile("2017-01-16T18:27:00.000", 14209, "0MbEfj1S--.1.jpg");
+        doTestFile("2016-08-13T19:51:13.000", 14209, "7VWFOryj--.1.jpg");
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
index 3945a13..f86adc2 100644
--- a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
@@ -2,6 +2,9 @@
 package org.openstreetmap.josm.tools;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.Arrays;
@@ -9,7 +12,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 
-import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
@@ -52,28 +54,44 @@ public class UtilsTest {
             "\uFEFF"+ // ZERO WIDTH NO-BREAK SPACE
             "\u3000"; // IDEOGRAPHIC SPACE
         // CHECKSTYLE.ON: SingleSpaceSeparator
-        Assert.assertNull(Utils.strip(null));
-        Assert.assertEquals("", Utils.strip(""));
-        Assert.assertEquals("", Utils.strip(" "));
-        Assert.assertEquals("", Utils.strip("  "));
-        Assert.assertEquals("", Utils.strip("   "));
-        Assert.assertEquals("", Utils.strip(someWhite));
-        Assert.assertEquals("a", Utils.strip("a"));
-        Assert.assertEquals("ab", Utils.strip("ab"));
-        Assert.assertEquals("abc", Utils.strip("abc"));
-        Assert.assertEquals("a", Utils.strip(" a"));
-        Assert.assertEquals("ab", Utils.strip(" ab"));
-        Assert.assertEquals("abc", Utils.strip(" abc"));
-        Assert.assertEquals("a", Utils.strip("a "));
-        Assert.assertEquals("ab", Utils.strip("ab "));
-        Assert.assertEquals("abc", Utils.strip("abc "));
-        Assert.assertEquals("a", Utils.strip(someWhite+"a"+someWhite));
-        Assert.assertEquals("ab", Utils.strip(someWhite+"ab"+someWhite));
-        Assert.assertEquals("abc", Utils.strip(someWhite+"abc"+someWhite));
+        assertNull(Utils.strip(null));
+        assertEquals("", Utils.strip(""));
+        assertEquals("", Utils.strip(" "));
+        assertEquals("", Utils.strip("  "));
+        assertEquals("", Utils.strip("   "));
+        assertEquals("", Utils.strip(someWhite));
+        assertEquals("a", Utils.strip("a"));
+        assertEquals("ab", Utils.strip("ab"));
+        assertEquals("abc", Utils.strip("abc"));
+        assertEquals("a", Utils.strip(" a"));
+        assertEquals("ab", Utils.strip(" ab"));
+        assertEquals("abc", Utils.strip(" abc"));
+        assertEquals("a", Utils.strip("a "));
+        assertEquals("ab", Utils.strip("ab "));
+        assertEquals("abc", Utils.strip("abc "));
+        assertEquals("a", Utils.strip(someWhite+"a"+someWhite));
+        assertEquals("ab", Utils.strip(someWhite+"ab"+someWhite));
+        assertEquals("abc", Utils.strip(someWhite+"abc"+someWhite));
 
         // extended skip
-        Assert.assertEquals("a", Utils.strip("a", "b"));
-        Assert.assertEquals("b", Utils.strip("acbcac", "ac"));
+        assertEquals("a", Utils.strip("a", "b"));
+        assertEquals("b", Utils.strip("acbcac", "ac"));
+    }
+
+    /**
+     * Test of {@link Utils#isStripEmpty} method.
+     */
+    @Test
+    public void testIsStripEmpty() {
+        assertTrue(Utils.isStripEmpty(null));
+        assertTrue(Utils.isStripEmpty(""));
+        assertTrue(Utils.isStripEmpty(" "));
+        assertTrue(Utils.isStripEmpty("  "));
+        assertFalse(Utils.isStripEmpty("a"));
+        assertFalse(Utils.isStripEmpty("foo"));
+        assertFalse(Utils.isStripEmpty(" foo"));
+        assertFalse(Utils.isStripEmpty("foo "));
+        assertFalse(Utils.isStripEmpty(" foo "));
     }
 
     /**
@@ -81,13 +99,13 @@ public class UtilsTest {
      */
     @Test
     public void testToHexString() {
-        Assert.assertEquals("", Utils.toHexString(null));
-        Assert.assertEquals("", Utils.toHexString(new byte[0]));
-        Assert.assertEquals("01", Utils.toHexString(new byte[]{0x1}));
-        Assert.assertEquals("0102", Utils.toHexString(new byte[]{0x1, 0x2}));
-        Assert.assertEquals("12", Utils.toHexString(new byte[]{0x12}));
-        Assert.assertEquals("127f", Utils.toHexString(new byte[]{0x12, 0x7f}));
-        Assert.assertEquals("fedc", Utils.toHexString(new byte[]{(byte) 0xfe, (byte) 0xdc}));
+        assertEquals("", Utils.toHexString(null));
+        assertEquals("", Utils.toHexString(new byte[0]));
+        assertEquals("01", Utils.toHexString(new byte[]{0x1}));
+        assertEquals("0102", Utils.toHexString(new byte[]{0x1, 0x2}));
+        assertEquals("12", Utils.toHexString(new byte[]{0x12}));
+        assertEquals("127f", Utils.toHexString(new byte[]{0x12, 0x7f}));
+        assertEquals("fedc", Utils.toHexString(new byte[]{(byte) 0xfe, (byte) 0xdc}));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
index f29798a..b9df7ac 100644
--- a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
@@ -116,7 +116,7 @@ public class DateUtilsTest {
      * Unit test of {@link DateUtils#fromDate} method.
      */
     @Test
-    public void testFromDate() throws Exception {
+    public void testFromDate() {
         assertEquals("1970-01-01T00:00:00Z", DateUtils.fromDate(new Date(0)));
         assertEquals("1970-01-01T00:00:00.1Z", DateUtils.fromDate(new Date(100)));
         assertEquals("1970-01-01T00:00:00.12Z", DateUtils.fromDate(new Date(120)));

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



More information about the Pkg-grass-devel mailing list