[josm] 01/09: Imported Upstream version 0.0.svn10526+dfsg

Bas Couwenberg sebastic at debian.org
Tue Jul 12 12:25:44 UTC 2016


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

sebastic pushed a commit to branch master
in repository josm.

commit dcdc43bf96374b8dbbf8a5e4d5bde408032a6882
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Jul 12 12:00:24 2016 +0200

    Imported Upstream version 0.0.svn10526+dfsg
---
 .classpath                                         |    2 +-
 CONTRIBUTION                                       |    1 +
 README                                             |    2 +-
 REVISION                                           |    6 +-
 build.xml                                          |   11 +-
 data/defaultpresets.xml                            |  147 +-
 data/validator/combinations.mapcss                 |   35 +-
 data/validator/deprecated.mapcss                   |   25 +-
 data/validator/geometry.mapcss                     |   17 +-
 data/validator/ignoretags.cfg                      |    7 +-
 eclipse/formatter.xml                              |  295 ++++
 geticons.pl                                        |    2 +-
 i18n/build.xml                                     |    8 +-
 i18n/convpreset.pl                                 |   59 +-
 i18n/po/af.po                                      |  303 +++-
 i18n/po/am.po                                      |  303 +++-
 i18n/po/ar.po                                      |  303 +++-
 i18n/po/ast.po                                     |  311 +++-
 i18n/po/az.po                                      |  303 +++-
 i18n/po/be.po                                      |  349 ++++-
 i18n/po/bg.po                                      |  307 +++-
 i18n/po/bn.po                                      |  303 +++-
 i18n/po/br.po                                      |  303 +++-
 i18n/po/bs.po                                      |  303 +++-
 i18n/po/ca.po                                      |  311 +++-
 i18n/po/ca at valencia.po                             |  311 +++-
 i18n/po/cs.po                                      |  351 ++++-
 i18n/po/cy.po                                      |  303 +++-
 i18n/po/da.po                                      |  349 ++++-
 i18n/po/de.po                                      |  374 +++--
 i18n/po/de_DE.po                                   |  303 +++-
 i18n/po/el.po                                      |  307 +++-
 i18n/po/en_AU.po                                   |  305 +++-
 i18n/po/en_CA.po                                   |  303 +++-
 i18n/po/en_GB.po                                   |  345 ++++-
 i18n/po/eo.po                                      |  303 +++-
 i18n/po/es.po                                      |  455 ++++--
 i18n/po/et.po                                      |  307 +++-
 i18n/po/eu.po                                      |  303 +++-
 i18n/po/fa.po                                      |  303 +++-
 i18n/po/fi.po                                      |  305 +++-
 i18n/po/fil.po                                     |  303 +++-
 i18n/po/fo.po                                      |  303 +++-
 i18n/po/fr.po                                      |  335 ++++-
 i18n/po/ga.po                                      |  303 +++-
 i18n/po/gl.po                                      |  305 +++-
 i18n/po/he.po                                      |  303 +++-
 i18n/po/hi.po                                      |  303 +++-
 i18n/po/hr.po                                      |  303 +++-
 i18n/po/ht.po                                      |  303 +++-
 i18n/po/hu.po                                      |  325 ++++-
 i18n/po/hy.po                                      |  303 +++-
 i18n/po/ia.po                                      |  303 +++-
 i18n/po/id.po                                      |  311 +++-
 i18n/po/is.po                                      |  303 +++-
 i18n/po/it.po                                      |  311 +++-
 i18n/po/ja.po                                      |  331 ++++-
 i18n/po/ka.po                                      |  303 +++-
 i18n/po/km.po                                      |  307 +++-
 i18n/po/ko.po                                      |  303 +++-
 i18n/po/ky.po                                      |  303 +++-
 i18n/po/lb.po                                      |  303 +++-
 i18n/po/lo.po                                      |  303 +++-
 i18n/po/lt.po                                      |  313 +++-
 i18n/po/lv.po                                      |  303 +++-
 i18n/po/mk.po                                      |  303 +++-
 i18n/po/mr.po                                      |  303 +++-
 i18n/po/ms.po                                      |  303 +++-
 i18n/po/nb.po                                      |  303 +++-
 i18n/po/nds.po                                     |  303 +++-
 i18n/po/nl.po                                      |  382 +++--
 i18n/po/nn.po                                      |  303 +++-
 i18n/po/oc.po                                      |  303 +++-
 i18n/po/pa.po                                      |  303 +++-
 i18n/po/pl.po                                      |  405 ++++--
 i18n/po/pt.po                                      |  313 +++-
 i18n/po/pt_BR.po                                   |  362 +++--
 i18n/po/rm.po                                      |  303 +++-
 i18n/po/ro.po                                      |  303 +++-
 i18n/po/ru.po                                      |  370 +++--
 i18n/po/sk.po                                      |  326 ++++-
 i18n/po/sl.po                                      |  307 +++-
 i18n/po/sq.po                                      |  303 +++-
 i18n/po/sr.po                                      |  303 +++-
 i18n/po/sv.po                                      |  376 +++--
 i18n/po/ta.po                                      |  303 +++-
 i18n/po/te.po                                      |  303 +++-
 i18n/po/th.po                                      |  303 +++-
 i18n/po/tr.po                                      |  309 +++-
 i18n/po/ug.po                                      |  303 +++-
 i18n/po/uk.po                                      |  349 ++++-
 i18n/po/ur.po                                      |  303 +++-
 i18n/po/vi.po                                      |  311 +++-
 i18n/po/wae.po                                     |  303 +++-
 i18n/po/zh_CN.po                                   | 1502 +++++++++++---------
 i18n/po/zh_TW.po                                   |  311 +++-
 images/presets/ferry.png                           |  Bin 170 -> 0 bytes
 images/presets/station16.png                       |  Bin 0 -> 415 bytes
 linux/latest/etc/default/josm-latest               |    9 +
 linux/latest/usr/bin/josm-latest                   |    4 +
 linux/tested/etc/default/josm                      |    9 +
 linux/tested/usr/bin/josm                          |    4 +
 patches/javacc.patch                               |   13 +
 scripts/SyncEditorImageryIndex.groovy              |   40 +-
 .../jcs/auxiliary/disk/block/BlockDisk.java        |   22 +-
 .../auxiliary/disk/indexed/IndexedDiskCache.java   |    8 +-
 .../remote/http/server/RemoteHttpCacheServlet.java |    2 +-
 .../remote/util/RemoteCacheRequestFactory.java     |    2 +-
 .../memory/soft/SoftReferenceMemoryCache.java      |    4 +-
 .../apache/commons/jcs/utils/timing/SleepUtil.java |   50 -
 src/org/openstreetmap/josm/Main.java               |  321 +++--
 .../openstreetmap/josm/actions/AboutAction.java    |    4 +-
 .../josm/actions/AbstractInfoAction.java           |   11 +-
 .../josm/actions/AbstractSelectAction.java         |    4 +-
 .../josm/actions/AddImageryLayerAction.java        |    9 +-
 .../openstreetmap/josm/actions/AddNodeAction.java  |   14 +-
 .../josm/actions/AlignInCircleAction.java          |    9 +-
 .../josm/actions/AlignInLineAction.java            |   21 +-
 .../josm/actions/AutoScaleAction.java              |   24 +-
 .../josm/actions/CombineWayAction.java             |   17 +-
 src/org/openstreetmap/josm/actions/CopyAction.java |   20 +-
 .../josm/actions/CopyCoordinatesAction.java        |    8 +-
 .../josm/actions/CreateCircleAction.java           |   13 +-
 .../josm/actions/CreateMultipolygonAction.java     |   35 +-
 .../openstreetmap/josm/actions/DeleteAction.java   |    6 +-
 .../josm/actions/DeleteLayerAction.java            |    4 +-
 .../josm/actions/DistributeAction.java             |    9 +-
 .../josm/actions/DownloadPrimitiveAction.java      |    2 +-
 .../josm/actions/DownloadReferrersAction.java      |    8 +-
 .../josm/actions/DuplicateAction.java              |    9 +-
 .../josm/actions/ExtensionFileFilter.java          |   78 +-
 .../josm/actions/FollowLineAction.java             |   11 +-
 .../josm/actions/GpxExportAction.java              |    2 +-
 .../josm/actions/HistoryInfoAction.java            |    4 +-
 .../josm/actions/HistoryInfoWebAction.java         |    2 +-
 .../josm/actions/ImageryAdjustAction.java          |    2 -
 src/org/openstreetmap/josm/actions/InfoAction.java |    9 +-
 .../josm/actions/JoinAreasAction.java              |   23 +-
 .../josm/actions/JoinNodeWayAction.java            |   11 +-
 src/org/openstreetmap/josm/actions/JosmAction.java |  190 ++-
 .../josm/actions/MapRectifierWMSmenuAction.java    |    4 +-
 .../josm/actions/MergeLayerAction.java             |    4 +-
 .../josm/actions/MergeNodesAction.java             |   15 +-
 .../josm/actions/MergeSelectionAction.java         |   24 +-
 .../openstreetmap/josm/actions/MirrorAction.java   |    9 +-
 src/org/openstreetmap/josm/actions/MoveAction.java |   40 +-
 .../openstreetmap/josm/actions/MoveNodeAction.java |   11 +-
 src/org/openstreetmap/josm/actions/NewAction.java  |    2 +-
 .../openstreetmap/josm/actions/OpenFileAction.java |    4 +-
 .../josm/actions/OrthogonalizeAction.java          |   32 +-
 .../openstreetmap/josm/actions/PasteAction.java    |    6 +-
 .../josm/actions/PasteTagsAction.java              |    8 +-
 .../openstreetmap/josm/actions/PurgeAction.java    |   18 +-
 .../josm/actions/ReverseWayAction.java             |   18 +-
 .../openstreetmap/josm/actions/SaveActionBase.java |    2 +-
 .../josm/actions/SelectAllAction.java              |    6 +-
 .../josm/actions/SelectByInternalPointAction.java  |    4 +-
 .../SelectNonBranchingWaySequencesAction.java      |    4 +-
 .../josm/actions/SessionLoadAction.java            |    8 +-
 .../josm/actions/SessionSaveAsAction.java          |    4 +-
 .../josm/actions/ShowStatusReportAction.java       |    6 +-
 .../josm/actions/SimplifyWayAction.java            |   11 +-
 .../openstreetmap/josm/actions/SplitWayAction.java |   21 +-
 .../openstreetmap/josm/actions/UnGlueAction.java   |   41 +-
 .../josm/actions/UnJoinNodeWayAction.java          |    9 +-
 .../josm/actions/UnselectAllAction.java            |    4 +-
 .../josm/actions/UpdateDataAction.java             |   20 +-
 .../josm/actions/UpdateModifiedAction.java         |    7 +-
 .../josm/actions/UpdateSelectionAction.java        |   18 +-
 .../openstreetmap/josm/actions/UploadAction.java   |    9 +-
 .../josm/actions/UploadNotesAction.java            |    2 +-
 .../josm/actions/UploadSelectionAction.java        |   16 +-
 .../openstreetmap/josm/actions/ValidateAction.java |   14 +-
 .../josm/actions/ViewportFollowToggleAction.java   |    2 +-
 .../josm/actions/WireframeToggleAction.java        |    2 +-
 .../openstreetmap/josm/actions/ZoomToAction.java   |   23 +-
 .../ChangesetContentDownloadTask.java              |    1 +
 .../actions/downloadtasks/ChangesetQueryTask.java  |    3 +-
 .../actions/downloadtasks/DownloadGpsTask.java     |    8 +-
 .../actions/downloadtasks/DownloadNotesTask.java   |    6 +-
 .../downloadtasks/DownloadOsmChangeTask.java       |    4 +-
 .../downloadtasks/DownloadOsmCompressedTask.java   |    2 +-
 .../actions/downloadtasks/DownloadOsmTask.java     |   10 +-
 .../downloadtasks/DownloadReferrersTask.java       |    2 -
 .../actions/downloadtasks/DownloadSessionTask.java |    2 +-
 .../actions/downloadtasks/DownloadTaskList.java    |    4 +-
 .../josm/actions/mapmode/AddNoteAction.java        |    3 +-
 .../josm/actions/mapmode/DeleteAction.java         |   48 +-
 .../josm/actions/mapmode/DrawAction.java           |   68 +-
 .../josm/actions/mapmode/ExtrudeAction.java        |   17 +-
 .../actions/mapmode/ImproveWayAccuracyAction.java  |   20 +-
 .../josm/actions/mapmode/ModifiersSpec.java        |    2 +
 .../josm/actions/mapmode/ParallelWayAction.java    |   17 +-
 .../josm/actions/mapmode/SelectAction.java         |   71 +-
 .../actions/relation/AddSelectionToRelations.java  |    2 +-
 .../actions/relation/DeleteRelationsAction.java    |   11 +-
 .../actions/relation/DownloadMembersAction.java    |    2 +-
 .../DownloadSelectedIncompleteMembersAction.java   |    2 +-
 .../actions/relation/DuplicateRelationAction.java  |    4 +-
 .../josm/actions/relation/EditRelationAction.java  |    8 +-
 .../actions/relation/RecentRelationsAction.java    |   29 +-
 .../josm/actions/relation/SelectMembersAction.java |    4 +-
 .../actions/relation/SelectRelationAction.java     |    4 +-
 .../josm/actions/search/SearchAction.java          |  143 +-
 .../josm/actions/search/SearchCompiler.java        |    4 +-
 .../actions/upload/ApiPreconditionCheckerHook.java |    5 +-
 .../josm/actions/upload/FixDataHook.java           |    2 +
 .../josm/actions/upload/ValidateUploadHook.java    |    5 +-
 src/org/openstreetmap/josm/command/AddCommand.java |    4 +-
 .../josm/command/AddPrimitivesCommand.java         |    8 +-
 src/org/openstreetmap/josm/command/Command.java    |   26 +-
 .../openstreetmap/josm/command/MoveCommand.java    |    4 +-
 .../openstreetmap/josm/command/PurgeCommand.java   |    6 +-
 .../openstreetmap/josm/command/RotateCommand.java  |    2 +
 .../openstreetmap/josm/command/ScaleCommand.java   |    2 +-
 .../openstreetmap/josm/command/SelectCommand.java  |    6 +-
 .../josm/command/SequenceCommand.java              |    8 +
 .../josm/command/conflict/ConflictAddCommand.java  |    4 +-
 .../command/conflict/ConflictResolveCommand.java   |    4 +-
 .../RelationMemberConflictResolverCommand.java     |    6 +-
 .../conflict/WayNodesConflictResolverCommand.java  |    2 +-
 src/org/openstreetmap/josm/data/AutosaveTask.java  |   61 +-
 .../josm/data/CustomConfigurator.java              |   56 +-
 src/org/openstreetmap/josm/data/DataSource.java    |    9 +
 src/org/openstreetmap/josm/data/Preferences.java   |   13 +-
 .../openstreetmap/josm/data/UndoRedoHandler.java   |   84 +-
 src/org/openstreetmap/josm/data/Version.java       |    8 +-
 .../josm/data/cache/CacheEntryAttributes.java      |   10 +-
 .../josm/data/cache/HostLimitQueue.java            |    6 +-
 .../josm/data/cache/JCSCacheManager.java           |   20 +-
 .../josm/data/cache/JCSCachedTileLoaderJob.java    |   12 +-
 .../josm/data/conflict/ConflictCollection.java     |    2 +-
 .../openstreetmap/josm/data/coor/CachedLatLon.java |   17 +-
 .../openstreetmap/josm/data/coor/EastNorth.java    |   20 +
 src/org/openstreetmap/josm/data/coor/LatLon.java   |   10 +-
 src/org/openstreetmap/josm/data/gpx/GpxData.java   |    2 +-
 src/org/openstreetmap/josm/data/gpx/WayPoint.java  |    2 +-
 .../CachedAttributionBingAerialTileSource.java     |    2 +-
 .../josm/data/imagery/ImageryInfo.java             |    2 +-
 .../josm/data/imagery/ImageryLayerInfo.java        |    2 +-
 .../josm/data/imagery/TMSCachedTileLoaderJob.java  |    8 +-
 .../josm/data/imagery/TemplatedWMSTileSource.java  |   28 +-
 .../josm/data/imagery/WMTSTileSource.java          |    6 +-
 .../josm/data/osm/AbstractPrimitive.java           |    4 +-
 src/org/openstreetmap/josm/data/osm/BBox.java      |   30 +-
 src/org/openstreetmap/josm/data/osm/Changeset.java |    2 +-
 .../josm/data/osm/ChangesetDataSet.java            |    2 +-
 src/org/openstreetmap/josm/data/osm/DataSet.java   |  102 +-
 .../josm/data/osm/DatasetConsistencyTest.java      |    2 +-
 src/org/openstreetmap/josm/data/osm/Filter.java    |    2 +-
 .../josm/data/osm/MultipolygonBuilder.java         |    2 +
 src/org/openstreetmap/josm/data/osm/Node.java      |    2 +-
 .../openstreetmap/josm/data/osm/OsmPrimitive.java  |    8 +-
 .../josm/data/osm/event/DatasetEventManager.java   |   25 +-
 .../josm/data/osm/history/HistoryDataSet.java      |   20 +-
 .../josm/data/osm/history/HistoryOsmPrimitive.java |    2 +-
 .../josm/data/osm/history/HistoryRelation.java     |    2 +-
 .../osm/visitor/paint/AbstractMapRenderer.java     |    4 +-
 .../data/osm/visitor/paint/MapRendererFactory.java |    8 +-
 .../josm/data/osm/visitor/paint/PaintColors.java   |    2 +-
 .../data/osm/visitor/paint/StyledMapRenderer.java  |    8 +-
 .../osm/visitor/paint/WireframeMapRenderer.java    |    2 +-
 .../osm/visitor/paint/relations/Multipolygon.java  |    2 +-
 .../visitor/paint/relations/MultipolygonCache.java |   19 +-
 .../data/preferences/ParametrizedEnumProperty.java |    1 +
 .../josm/data/projection/CustomProjection.java     |    5 +-
 .../josm/data/projection/Projection.java           |    3 +-
 .../josm/data/projection/Projections.java          |    3 +-
 .../josm/data/projection/proj/AbstractProj.java    |    4 +-
 .../josm/data/projection/proj/AlbersEqualArea.java |   26 +-
 .../projection/proj/LambertAzimuthalEqualArea.java |   58 +-
 .../projection/proj/LambertConformalConic.java     |    6 +-
 .../josm/data/projection/proj/Mercator.java        |    2 +-
 .../josm/data/projection/proj/ObliqueMercator.java |   16 +-
 .../data/projection/proj/PolarStereographic.java   |    2 +-
 .../josm/data/validation/OsmValidator.java         |   34 +-
 .../josm/data/validation/PaintVisitor.java         |    4 +-
 .../josm/data/validation/Severity.java             |    2 +
 .../openstreetmap/josm/data/validation/Test.java   |    2 +-
 .../josm/data/validation/TestError.java            |    2 +-
 .../data/validation/routines/DomainValidator.java  |   60 +-
 .../data/validation/routines/EmailValidator.java   |    2 +-
 .../validation/routines/InetAddressValidator.java  |    4 +-
 .../data/validation/routines/RegexValidator.java   |    4 +-
 .../data/validation/routines/UrlValidator.java     |    7 +-
 .../josm/data/validation/tests/Addresses.java      |    2 +
 .../josm/data/validation/tests/Coastlines.java     |    7 +-
 .../data/validation/tests/ConditionalKeys.java     |    2 +
 .../josm/data/validation/tests/DuplicateNode.java  |    2 +-
 .../josm/data/validation/tests/Highways.java       |    2 +
 .../josm/data/validation/tests/InternetTags.java   |   34 +-
 .../josm/data/validation/tests/LongSegment.java    |    2 +-
 .../data/validation/tests/MapCSSTagChecker.java    |    8 +-
 .../data/validation/tests/OverlappingWays.java     |    2 +-
 .../josm/data/validation/tests/PowerLines.java     |   17 +-
 .../data/validation/tests/RelationChecker.java     |   18 +-
 .../josm/data/validation/tests/TagChecker.java     |   16 +-
 .../josm/data/validation/tests/UnclosedWays.java   |    6 +-
 .../data/validation/tests/UnconnectedWays.java     |   11 +-
 .../josm/data/validation/tests/UntaggedWay.java    |   18 +-
 .../data/validation/tests/WronglyOrderedWays.java  |    2 +
 .../josm/data/validation/util/ValUtil.java         |    8 +-
 .../josm/gui/DefaultNameFormatter.java             |    6 +-
 src/org/openstreetmap/josm/gui/ExtendedDialog.java |    4 +-
 .../josm/gui/HelpAwareOptionPane.java              |    6 +-
 .../openstreetmap/josm/gui/IconToggleButton.java   |    2 +
 src/org/openstreetmap/josm/gui/ImageryMenu.java    |   34 +-
 .../openstreetmap/josm/gui/MainApplication.java    |   73 +-
 src/org/openstreetmap/josm/gui/MainFrame.java      |  246 ++++
 src/org/openstreetmap/josm/gui/MainMenu.java       |   36 +-
 src/org/openstreetmap/josm/gui/MainPanel.java      |  172 +++
 src/org/openstreetmap/josm/gui/MapFrame.java       |   48 +-
 src/org/openstreetmap/josm/gui/MapMover.java       |   99 +-
 src/org/openstreetmap/josm/gui/MapScaler.java      |   41 +-
 src/org/openstreetmap/josm/gui/MapStatus.java      |   17 +-
 src/org/openstreetmap/josm/gui/MapView.java        |  217 ++-
 src/org/openstreetmap/josm/gui/MapViewState.java   |  454 ++++++
 .../josm/gui/NavigatableComponent.java             |  351 ++---
 src/org/openstreetmap/josm/gui/ScrollViewport.java |    2 +-
 .../openstreetmap/josm/gui/SelectionManager.java   |    6 +-
 src/org/openstreetmap/josm/gui/SideButton.java     |   49 +-
 src/org/openstreetmap/josm/gui/SplashScreen.java   |    4 +-
 .../josm/gui/bbox/SlippyMapBBoxChooser.java        |    4 +-
 .../josm/gui/bbox/TileSelectionBBoxChooser.java    |    4 +-
 .../josm/gui/conflict/pair/ComparePairType.java    |    4 +-
 .../josm/gui/conflict/pair/ConflictResolver.java   |   22 +-
 .../josm/gui/conflict/pair/ListMergeModel.java     |    2 +-
 .../josm/gui/conflict/pair/ListMerger.java         |   27 +-
 .../gui/conflict/pair/nodes/NodeListMerger.java    |    6 +-
 .../pair/properties/PropertiesMergeModel.java      |    4 +-
 .../pair/relation/RelationMemberMerger.java        |    6 +-
 .../relation/RelationMemberTableCellRenderer.java  |    4 +-
 .../josm/gui/conflict/pair/tags/TagMergeItem.java  |    2 +-
 .../josm/gui/conflict/pair/tags/TagMerger.java     |    2 +-
 .../tags/CombinePrimitiveResolverDialog.java       |    4 +-
 .../tags/PasteTagsConflictResolverDialog.java      |    6 +-
 .../tags/RelationMemberConflictDecision.java       |    2 +-
 .../tags/RelationMemberConflictResolver.java       |    6 +-
 .../josm/gui/dialogs/ChangesetDialog.java          |   33 +-
 .../josm/gui/dialogs/CommandStackDialog.java       |   20 +-
 .../josm/gui/dialogs/ConflictDialog.java           |   23 +-
 .../josm/gui/dialogs/ConflictResolutionDialog.java |   16 +-
 .../DeleteFromRelationConfirmationDialog.java      |    6 +-
 .../josm/gui/dialogs/DialogsPanel.java             |    7 +-
 .../josm/gui/dialogs/FilterDialog.java             |   14 +-
 .../josm/gui/dialogs/FilterTableModel.java         |    6 +-
 .../josm/gui/dialogs/InspectPrimitiveDialog.java   |    2 +-
 .../josm/gui/dialogs/LayerListDialog.java          |   49 +-
 .../josm/gui/dialogs/MapPaintDialog.java           |   10 +-
 .../josm/gui/dialogs/NotesDialog.java              |   74 +-
 .../josm/gui/dialogs/RelationListDialog.java       |   48 +-
 .../josm/gui/dialogs/SelectionListDialog.java      |   75 +-
 .../josm/gui/dialogs/ToggleDialog.java             |   25 +-
 .../josm/gui/dialogs/UserListDialog.java           |   38 +-
 .../josm/gui/dialogs/ValidatorDialog.java          |   63 +-
 .../dialogs/changeset/ChangesetCacheManager.java   |   32 +-
 .../dialogs/changeset/ChangesetContentPanel.java   |   52 +-
 .../dialogs/changeset/ChangesetDetailPanel.java    |   67 +-
 .../changeset/ChangesetDiscussionPanel.java        |    3 +-
 .../changeset/ChangesetInSelectionListModel.java   |   14 +-
 .../ChangesetsInActiveDataLayerListModel.java      |   14 +-
 .../changeset/DownloadChangesetContentAction.java  |    7 +-
 .../changeset/SingleChangesetDownloadPanel.java    |    9 +-
 .../query/AdvancedChangesetQueryPanel.java         |   16 +-
 .../changeset/query/BasicChangesetQueryPanel.java  |    2 +-
 .../changeset/query/ChangesetQueryDialog.java      |   17 +-
 .../changeset/query/UrlBasedQueryPanel.java        |    2 +-
 .../gui/dialogs/layer/ActivateLayerAction.java     |   29 +-
 .../josm/gui/dialogs/layer/DeleteLayerAction.java  |    4 +-
 .../josm/gui/dialogs/layer/DuplicateAction.java    |    5 +-
 .../gui/dialogs/layer/LayerVisibilityAction.java   |    2 +-
 .../josm/gui/dialogs/layer/MergeAction.java        |    4 +-
 .../josm/gui/dialogs/layer/MoveDownAction.java     |    2 +-
 .../josm/gui/dialogs/layer/MoveUpAction.java       |    4 +-
 .../gui/dialogs/properties/PropertiesDialog.java   |   37 +-
 .../josm/gui/dialogs/properties/TagEditHelper.java |   12 +-
 .../gui/dialogs/relation/ChildRelationBrowser.java |    6 +-
 .../dialogs/relation/GenericRelationEditor.java    |   13 +-
 .../josm/gui/dialogs/relation/MemberTable.java     |   40 +-
 .../relation/MemberTableLinkedCellRenderer.java    |    8 +-
 .../gui/dialogs/relation/MemberTableModel.java     |    2 +-
 .../relation/ParentRelationLoadingTask.java        |    2 +-
 .../relation/ReferringRelationsBrowser.java        |   12 +-
 .../dialogs/relation/RelationDialogManager.java    |   25 +-
 .../josm/gui/dialogs/relation/RelationTree.java    |    6 +-
 .../relation/SelectionTableColumnModel.java        |    2 +-
 .../gui/dialogs/relation/SelectionTableModel.java  |   38 +-
 .../actions/AddSelectedAfterSelection.java         |    6 +-
 .../relation/actions/AddSelectedAtEndAction.java   |    6 +-
 .../relation/actions/AddSelectedAtStartAction.java |    6 +-
 .../actions/AddSelectedBeforeSelection.java        |    6 +-
 .../gui/dialogs/relation/actions/CancelAction.java |    2 +-
 .../gui/dialogs/relation/actions/OKAction.java     |    2 +-
 .../relation/actions/PasteMembersAction.java       |    6 +-
 .../relation/actions/RemoveSelectedAction.java     |    2 +-
 .../dialogs/relation/actions/SetRoleAction.java    |    2 +-
 .../gui/dialogs/validator/ValidatorTreePanel.java  |    4 +-
 .../josm/gui/download/BookmarkSelection.java       |    2 +-
 .../josm/gui/download/BoundingBoxSelection.java    |    2 +-
 .../josm/gui/download/DownloadDialog.java          |   20 +-
 .../josm/gui/download/DownloadObjectDialog.java    |    2 +
 .../josm/gui/download/DownloadSelection.java       |    2 +-
 .../josm/gui/help/ContextSensitiveHelpAction.java  |    2 +-
 .../josm/gui/history/HistoryBrowserDialog.java     |   12 +-
 .../gui/history/HistoryBrowserDialogManager.java   |   26 +-
 .../josm/gui/history/HistoryBrowserModel.java      |   41 +-
 .../josm/gui/history/NodeListViewer.java           |   10 +-
 .../josm/gui/history/VersionInfoPanel.java         |    4 +-
 .../josm/gui/io/AbstractUploadTask.java            |   18 +-
 .../josm/gui/io/ChangesetManagementPanel.java      |    2 +-
 .../io/DownloadPrimitivesWithReferrersTask.java    |    6 +-
 .../josm/gui/io/RecentlyOpenedFilesMenu.java       |    2 +-
 .../openstreetmap/josm/gui/io/SaveLayerTask.java   |    2 +-
 .../josm/gui/io/SaveLayersDialog.java              |   15 +-
 .../josm/gui/io/TagSettingsPanel.java              |    2 +-
 .../openstreetmap/josm/gui/io/UploadDialog.java    |    7 +-
 .../josm/gui/io/UploadPrimitivesTask.java          |    2 +-
 .../josm/gui/io/UploadSelectionDialog.java         |    6 +-
 .../josm/gui/io/UploadStrategySpecification.java   |    2 +-
 .../josm/gui/io/UploadedObjectsSummaryPanel.java   |    2 +-
 .../josm/gui/layer/AbstractMapViewPaintable.java   |   55 +-
 .../josm/gui/layer/AbstractTileSourceLayer.java    |  100 +-
 src/org/openstreetmap/josm/gui/layer/GpxLayer.java |    2 +-
 .../openstreetmap/josm/gui/layer/ImageryLayer.java |   14 +-
 src/org/openstreetmap/josm/gui/layer/Layer.java    |   60 +-
 .../openstreetmap/josm/gui/layer/LayerManager.java |  113 +-
 .../josm/gui/layer/MainLayerManager.java           |  135 +-
 .../josm/gui/layer/MapViewGraphics.java            |   62 +
 .../josm/gui/layer/MapViewPaintable.java           |   69 +
 .../josm/gui/layer/NativeScaleLayer.java           |    2 +-
 .../openstreetmap/josm/gui/layer/NoteLayer.java    |   24 +-
 .../openstreetmap/josm/gui/layer/OsmDataLayer.java |   38 +-
 .../josm/gui/layer/ValidatorLayer.java             |   26 +-
 src/org/openstreetmap/josm/gui/layer/WMSLayer.java |    6 +-
 .../gui/layer/geoimage/CorrelateGpxWithImages.java |    8 +-
 .../josm/gui/layer/geoimage/GeoImageLayer.java     |   32 +-
 .../josm/gui/layer/geoimage/ImageEntry.java        |   17 +-
 .../josm/gui/layer/geoimage/ImageViewerDialog.java |   52 +-
 .../gui/layer/gpx/ConvertToDataLayerAction.java    |    4 +-
 .../josm/gui/layer/gpx/DateFilterPanel.java        |    4 +-
 .../gui/layer/gpx/DownloadWmsAlongTrackAction.java |    2 +-
 .../josm/gui/layer/gpx/ImportAudioAction.java      |    2 +-
 .../layer/gpx/MarkersFromNamedPointsAction.java    |    2 +-
 .../josm/gui/layer/markerlayer/MarkerLayer.java    |   16 +-
 .../josm/gui/mappaint/ElemStyles.java              |    2 +-
 .../josm/gui/mappaint/MapPaintMenu.java            |    6 +-
 .../josm/gui/mappaint/MapPaintStyles.java          |    3 +-
 .../gui/mappaint/styleelement/BoxTextElement.java  |  110 +-
 .../gui/mappaint/styleelement/LineElement.java     |  406 +++---
 .../josm/gui/mappaint/styleelement/MapImage.java   |    2 +-
 .../gui/mappaint/styleelement/NodeElement.java     |    6 +-
 .../josm/gui/oauth/AbstractAuthorizationUI.java    |    2 +-
 .../gui/oauth/FullyAutomaticAuthorizationUI.java   |   14 +-
 .../josm/gui/oauth/ManualAuthorizationUI.java      |    6 +-
 .../josm/gui/oauth/OAuthAuthorizationWizard.java   |   18 +-
 .../gui/oauth/OsmOAuthAuthorizationClient.java     |    2 +-
 .../gui/oauth/SemiAutomaticAuthorizationUI.java    |   26 +-
 .../josm/gui/oauth/TestAccessTokenTask.java        |    4 +-
 .../josm/gui/preferences/PreferenceDialog.java     |   12 +-
 .../josm/gui/preferences/PreferenceTabbedPane.java |   11 +-
 .../josm/gui/preferences/SourceEditor.java         |   20 +-
 .../josm/gui/preferences/ToolbarPreferences.java   |    4 +-
 .../gui/preferences/display/GPXSettingsPanel.java  |   12 +-
 .../gui/preferences/imagery/AddWMSLayerPanel.java  |   12 +-
 .../preferences/imagery/CacheContentsPanel.java    |    2 +-
 .../preferences/imagery/CommonSettingsPanel.java   |   25 +
 .../gui/preferences/map/MapPaintPreference.java    |    4 +-
 .../preferences/map/TaggingPresetPreference.java   |    4 +-
 .../gui/preferences/plugin/PluginPreference.java   |    8 +-
 .../projection/CodeProjectionChoice.java           |    2 +-
 .../preferences/server/OAuthAccessTokenHolder.java |    2 +-
 .../OAuthAuthenticationPreferencesPanel.java       |   17 +-
 .../preferences/server/OsmApiUrlInputPanel.java    |   10 +-
 .../josm/gui/preferences/shortcut/PrefJPanel.java  |    8 +-
 .../ValidatorTagCheckerRulesPreference.java        |    2 +
 .../josm/gui/tagging/TagCellRenderer.java          |    4 +-
 .../openstreetmap/josm/gui/tagging/TagTable.java   |   14 +-
 .../gui/tagging/ac/AutoCompletionItemPriority.java |    2 +-
 .../gui/tagging/ac/AutoCompletionListItem.java     |    2 +-
 .../josm/gui/tagging/presets/TaggingPreset.java    |   55 +-
 .../gui/tagging/presets/TaggingPresetItem.java     |    2 +-
 .../gui/tagging/presets/TaggingPresetReader.java   |    2 +-
 .../tagging/presets/TaggingPresetSearchAction.java |    2 +-
 .../TaggingPresetSearchPrimitiveDialog.java        |    8 +-
 .../gui/tagging/presets/TaggingPresetSelector.java |    8 +-
 .../tagging/presets/items/ComboMultiSelect.java    |    1 +
 .../josm/gui/tagging/presets/items/Text.java       |    2 +-
 .../josm/gui/util/AdjustmentSynchronizer.java      |    2 +-
 src/org/openstreetmap/josm/gui/util/GuiHelper.java |   29 +-
 .../josm/gui/util/GuiSizesHelper.java              |  115 ++
 .../josm/gui/util/HighlightHelper.java             |    4 +-
 .../widgets/AbstractTextComponentValidator.java    |    2 +-
 .../gui/widgets/CompileSearchTextDecorator.java    |    2 +
 .../josm/gui/widgets/MultiSplitLayout.java         |    4 +-
 .../josm/gui/widgets/MultiSplitPane.java           |    4 +-
 .../josm/gui/widgets/OsmPrimitivesTable.java       |   22 +-
 .../josm/gui/widgets/TextContextualPopupMenu.java  |    4 +-
 .../openstreetmap/josm/io/AllFormatsImporter.java  |    2 +-
 src/org/openstreetmap/josm/io/Capabilities.java    |    2 +-
 src/org/openstreetmap/josm/io/ChangesetQuery.java  |    6 +-
 .../josm/io/DefaultProxySelector.java              |    2 +-
 .../openstreetmap/josm/io/DiffResultProcessor.java |    6 +-
 src/org/openstreetmap/josm/io/FileExporter.java    |   17 +-
 src/org/openstreetmap/josm/io/FileImporter.java    |   20 +-
 src/org/openstreetmap/josm/io/GpxExporter.java     |    2 +-
 src/org/openstreetmap/josm/io/GpxImporter.java     |    4 +-
 src/org/openstreetmap/josm/io/GpxReader.java       |    2 +-
 .../josm/io/MultiFetchServerObjectReader.java      |    4 +
 src/org/openstreetmap/josm/io/NMEAImporter.java    |    4 +-
 src/org/openstreetmap/josm/io/NmeaReader.java      |    3 +
 src/org/openstreetmap/josm/io/NoteImporter.java    |   12 +-
 src/org/openstreetmap/josm/io/NoteReader.java      |    2 +-
 src/org/openstreetmap/josm/io/OsmApi.java          |   12 +-
 .../openstreetmap/josm/io/OsmChangeImporter.java   |    4 +-
 .../openstreetmap/josm/io/OsmHistoryReader.java    |    3 +-
 src/org/openstreetmap/josm/io/OsmImporter.java     |    8 +-
 .../josm/io/OsmServerBackreferenceReader.java      |    4 +-
 src/org/openstreetmap/josm/io/OsmServerReader.java |   20 +-
 .../josm/io/OsmServerUserInfoReader.java           |    6 +-
 .../openstreetmap/josm/io/WMSLayerExporter.java    |    6 +-
 .../openstreetmap/josm/io/WMSLayerImporter.java    |    2 +-
 .../josm/io/auth/AbstractCredentialsAgent.java     |    2 +-
 .../openstreetmap/josm/io/imagery/WMSImagery.java  |   44 +-
 .../josm/io/remotecontrol/AddTagsDialog.java       |    8 +-
 .../io/remotecontrol/handler/AddNodeHandler.java   |    4 +-
 .../io/remotecontrol/handler/AddWayHandler.java    |    4 +-
 .../io/remotecontrol/handler/ImageryHandler.java   |    4 +-
 .../remotecontrol/handler/LoadAndZoomHandler.java  |   14 +-
 .../remotecontrol/handler/LoadObjectHandler.java   |    2 +-
 .../josm/io/session/GenericSessionExporter.java    |    2 +-
 .../josm/io/session/MarkerSessionExporter.java     |    2 +-
 .../josm/io/session/SessionReader.java             |    9 +-
 .../josm/io/session/SessionWriter.java             |    8 +-
 .../openstreetmap/josm/plugins/PluginHandler.java  |    5 +-
 .../josm/plugins/PluginInformation.java            |   21 +-
 src/org/openstreetmap/josm/tools/ColorScale.java   |    8 +-
 src/org/openstreetmap/josm/tools/Diff.java         |   29 +-
 src/org/openstreetmap/josm/tools/ExifReader.java   |    5 +-
 src/org/openstreetmap/josm/tools/Geometry.java     |    2 +-
 src/org/openstreetmap/josm/tools/HttpClient.java   |    1 +
 .../openstreetmap/josm/tools/ImageProvider.java    |  302 ++--
 .../openstreetmap/josm/tools/ImageResource.java    |  154 +-
 .../josm/tools/MultikeyShortcutAction.java         |    2 +-
 .../openstreetmap/josm/tools/PlatformHookOsx.java  |  138 +-
 .../josm/tools/PlatformHookUnixoid.java            |    7 +-
 .../josm/tools/PlatformHookWindows.java            |    7 +-
 src/org/openstreetmap/josm/tools/Shortcut.java     |    6 +-
 .../openstreetmap/josm/tools/TextTagParser.java    |    6 +-
 src/org/openstreetmap/josm/tools/Utils.java        |   41 +
 .../openstreetmap/josm/tools/WindowGeometry.java   |    8 +-
 .../openstreetmap/josm/tools/XmlObjectParser.java  |    4 +-
 .../josm/tools/bugreport/BugReport.java            |    6 +-
 .../tools/bugreport/BugReportExceptionHandler.java |    4 +-
 .../josm/tools/bugreport/BugReportSender.java      |    6 +-
 .../openstreetmap/josm/tools/date/DateUtils.java   |   44 +-
 .../josm/tools/template_engine/TemplateParser.java |    2 +-
 styles/standard/elemstyles.mapcss                  |  185 ++-
 .../gui/conflict/pair/tags/TagMergerTestFT.java    |    2 +-
 .../josm/io/OsmServerBackreferenceReaderTest.java  |    2 +-
 .../josm/io/UploadStrategySelectionPanelTest.java  |    2 +-
 test/unit/org/openstreetmap/josm/JOSMFixture.java  |   43 +-
 test/unit/org/openstreetmap/josm/MainTest.java     |    5 +-
 test/unit/org/openstreetmap/josm/TestUtils.java    |  341 +----
 .../josm/actions/AddImageryLayerActionTest.java    |   31 +-
 .../josm/actions/AlignInLineActionTest.java        |   49 +-
 .../josm/actions/CreateCircleActionTest.java       |    8 +-
 .../josm/actions/JoinAreasActionTest.java          |   32 +-
 .../josm/actions/OrthogonalizeActionTest.java      |    2 +-
 .../josm/actions/PurgeActionTest.java              |    4 +-
 .../actions/SelectByInternalPointActionTest.java   |   80 +-
 .../josm/actions/SimplifyWayActionTest.java        |   12 +-
 .../josm/actions/SplitWayActionTest.java           |    4 +-
 .../josm/actions/UnGlueActionTest.java             |   16 +-
 .../josm/actions/UnJoinNodeWayActionTest.java      |    4 +-
 .../josm/actions/mapmode/AddNoteActionTest.java    |    4 +-
 .../josm/actions/mapmode/DeleteActionTest.java     |    4 +-
 .../josm/actions/mapmode/DrawActionTest.java       |    6 +-
 .../josm/actions/mapmode/ExtrudeActionTest.java    |    4 +-
 .../mapmode/ImproveWayAccuracyActionTest.java      |    4 +-
 .../josm/actions/mapmode/MapViewMock.java          |   26 +-
 .../actions/mapmode/ParallelWayActionTest.java     |    4 +-
 .../josm/actions/mapmode/PlayHeadDragModeTest.java |    4 +-
 .../josm/actions/mapmode/SelectActionTest.java     |    6 +-
 .../josm/actions/search/SearchCompilerTest.java    |   15 +-
 .../command/conflict/ConflictAddCommandTest.java   |    8 +-
 .../CoordinateConflictResolveCommandTest.java      |    4 +-
 .../openstreetmap/josm/data/AutosaveTaskTest.java  |  219 ++-
 .../openstreetmap/josm/data/PreferencesTest.groovy |    4 +-
 .../data/cache/JCSCachedTileLoaderJobTest.java     |    2 +-
 .../josm/data/coor/CachedLatLonTest.java           |   36 +
 .../openstreetmap/josm/data/coor/LatLonTest.java   |   93 +-
 .../josm/data/imagery/ImageryInfoTest.java         |    2 +-
 .../data/imagery/TemplatedWMSTileSourceTest.java   |    6 +-
 .../josm/data/imagery/WMTSTileSourceTest.java      |    7 +-
 .../org/openstreetmap/josm/data/osm/BBoxTest.java  |   33 +
 .../josm/data/osm/DataSetMergerTest.java           |   11 +-
 .../josm/data/osm/history/HistoryRelationTest.java |    2 +
 .../josm/data/osm/history/HistoryWayTest.java      |    2 +
 .../visitor/MergeSourceBuildingVisitorTest.java    |    2 +-
 .../josm/data/projection/SwissGridTest.java        |   12 +-
 .../validation/routines/DomainValidatorTest.java   |    2 +-
 .../validation/routines/EmailValidatorTest.java    |   24 +-
 .../routines/InetAddressValidatorTest.java         |   40 +-
 .../validation/routines/RegexValidatorTest.java    |   26 +-
 .../data/validation/routines/UrlValidatorTest.java |    4 +-
 .../data/validation/tests/OpeningHourTestTest.java |  102 +-
 .../josm/gui/DefaultNameFormatterTest.java         |    2 +
 .../openstreetmap/josm/gui/MapViewStateTest.java   |  149 ++
 .../josm/gui/NavigatableComponentTest.java         |   36 +-
 .../gui/dialogs/InspectPrimitiveDialogTest.java    |    4 +-
 .../dialogs/layer/LayerVisibilityActionTest.java   |  109 +-
 .../gui/dialogs/relation/SelectionTableTest.java   |    4 +-
 .../openstreetmap/josm/gui/layer/GpxLayerTest.java |    8 +-
 .../josm/gui/layer/LayerManagerTest.java           |  130 +-
 .../josm/gui/layer/MainLayerManagerTest.java       |   36 +-
 .../josm/gui/layer/OsmDataLayerTest.java           |    8 +-
 .../openstreetmap/josm/gui/layer/TMSLayerTest.java |    4 +-
 .../josm/gui/layer/ValidatorLayerTest.java         |    4 +-
 .../openstreetmap/josm/gui/layer/WMSLayerTest.java |    4 +-
 .../layer/geoimage/CorrelateGpxWithImagesTest.java |   10 +-
 .../josm/gui/layer/geoimage/GeoImageLayerTest.java |   51 +-
 .../layer/gpx/DownloadAlongTrackActionTest.java    |    4 +-
 .../layer/gpx/DownloadWmsAlongTrackActionTest.java |    4 +-
 .../gui/layer/markerlayer/MarkerLayerTest.java     |    2 +-
 .../advanced/AdvancedPreferenceTest.java           |    2 +-
 .../advanced/ExportProfileActionTest.java          |    2 +-
 .../gui/preferences/advanced/ListEditorTest.java   |    2 +-
 .../gui/preferences/advanced/PrefEntryTest.java    |    2 +-
 .../preferences/advanced/PreferencesTableTest.java |    4 +-
 .../gui/preferences/audio/AudioPreferenceTest.java |    2 +-
 .../preferences/display/ColorPreferenceTest.java   |    2 +-
 .../preferences/display/DisplayPreferenceTest.java |    2 +-
 .../preferences/display/DrawingPreferenceTest.java |    2 +-
 .../gui/preferences/display/LafPreferenceTest.java |    2 +-
 .../display/LanguagePreferenceTest.java            |    2 +-
 .../preferences/imagery/ImageryPreferenceTest.java |    2 +-
 .../gui/preferences/map/BackupPreferenceTest.java  |    2 +-
 .../preferences/map/MapPaintPreferenceTest.java    |    2 +-
 .../preferences/map/MapPaintPreferenceTestIT.java  |    6 +-
 .../gui/preferences/map/MapPreferenceTest.java     |    2 +-
 .../map/TaggingPresetPreferenceTest.java           |    2 +-
 .../map/TaggingPresetPreferenceTestIT.java         |    8 +-
 .../preferences/plugin/PluginPreferenceTest.java   |    4 +-
 .../projection/ProjectionPreferenceTest.java       |    2 +-
 .../remotecontrol/RemoteControlPreferenceTest.java |    2 +-
 .../server/AuthenticationPreferenceTest.java       |    2 +-
 .../server/OverpassServerPreferenceTest.java       |    2 +-
 .../preferences/server/ProxyPreferenceTest.java    |    2 +-
 .../server/ServerAccessPreferenceTest.java         |    2 +-
 .../shortcut/ShortcutPreferenceTest.java           |    2 +-
 .../validator/ValidatorPreferenceTest.java         |    2 +-
 .../validator/ValidatorTestsPreferenceTest.java    |    2 +-
 .../tagging/presets/TaggingPresetReaderTest.java   |    2 +-
 .../org/openstreetmap/josm/io/NmeaReaderTest.java  |   23 +-
 .../openstreetmap/josm/io/NoteImporterTest.java    |   16 +-
 .../josm/io/remotecontrol/RemoteControlTest.java   |   17 +-
 .../remotecontrol/handler/AddNodeHandlerTest.java  |    8 +-
 .../remotecontrol/handler/AddWayHandlerTest.java   |    8 +-
 .../remotecontrol/handler/ImportHandlerTest.java   |    4 +-
 .../josm/io/session/SessionReaderTest.java         |    4 +-
 .../josm/testutils/ExpectedRootException.java      |  117 ++
 .../openstreetmap/josm/testutils/FakeGraphics.java |  340 +++++
 .../openstreetmap/josm/testutils/FakeOsmApi.java   |  121 ++
 .../josm/testutils/JOSMTestRules.java              |  258 ++++
 .../josm/testutils/ThrowableRootCauseMatcher.java  |   60 +
 .../josm/tools/ExceptionUtilTest.java              |    6 +
 .../openstreetmap/josm/tools/ExifReaderTest.java   |   24 +-
 .../josm/tools/ImageProviderTest.java              |   11 +
 .../josm/tools/PlatformHookOsxTest.java            |  145 ++
 .../josm/tools/PlatformHookWindowsTest.java        |  205 +++
 .../openstreetmap/josm/tools/PredicatesTest.java   |    1 -
 .../josm/tools/TextTagParserTest.java              |   12 +-
 .../org/openstreetmap/josm/tools/UtilsTest.java    |    7 +
 .../josm/tools/date/DateUtilsTest.java             |   26 +-
 tools/checkstyle/josm_checks.xml                   |    3 +
 675 files changed, 30205 insertions(+), 10363 deletions(-)

diff --git a/.classpath b/.classpath
index ab09759..5c32c2b 100644
--- a/.classpath
+++ b/.classpath
@@ -17,7 +17,7 @@
 	<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.jar"/>
+	<classpathentry kind="lib" path="test/lib/equalsverifier-2.1.1.jar"/>
 	<classpathentry kind="lib" path="test/lib/reflections/reflections-0.9.10.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_80"/>
 	<classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
diff --git a/CONTRIBUTION b/CONTRIBUTION
index babe30f..1af4103 100644
--- a/CONTRIBUTION
+++ b/CONTRIBUTION
@@ -22,6 +22,7 @@ Upliner Mikhalych
 Vincent Privat
 Frederik Ramm
 Dirk Stöcker
+Michael Zangl
 
 Many minor contributions and patches by others; see SVN history
 at http://josm.openstreetmap.de/svn/ for details. Use
diff --git a/README b/README
index 1e4d5be..54e8b5b 100644
--- a/README
+++ b/README
@@ -122,7 +122,7 @@ This is an overview of the files and directories in the JOSM code repository:
     - commons-cli-1.3.1.jar dependency of Groovy Ant task
     - 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.6.jar  used for some unit tests and various scripts
+    - groovy-all-2.4.7.jar  used for some unit tests and various scripts
     - jacocoant.jar         used to include coverage data into JUnit test reports 
     - javacc.jar            used in the build process to generate some .java files from a javacc source file
                             (src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParser.jj)
diff --git a/REVISION b/REVISION
index 9851573..6d1b033 100644
--- a/REVISION
+++ b/REVISION
@@ -2,7 +2,7 @@
 <info>
 <entry
    path="trunk"
-   revision="10327"
+   revision="10526"
    kind="dir">
 <url>https://josm.openstreetmap.de/svn/trunk</url>
 <relative-url>^/trunk</relative-url>
@@ -11,9 +11,9 @@
 <uuid>0c6e7542-c601-0410-84e7-c038aed88b3b</uuid>
 </repository>
 <commit
-   revision="10327">
+   revision="10526">
 <author>Don-vip</author>
-<date>2016-06-04T15:28:58.601880Z</date>
+<date>2016-07-11T21:04:49.619336Z</date>
 </commit>
 </entry>
 </info>
diff --git a/build.xml b/build.xml
index 50471e8..d10daeb 100644
--- a/build.xml
+++ b/build.xml
@@ -24,7 +24,7 @@
         <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.6.jar"/>
+        <property name="groovy.jar" location="${base.dir}/tools/groovy-all-2.4.7.jar"/>
         <!-- build parameter: compression level (ant -Dclevel=N)
                  N ranges from 0 (no compression) to 9 (maximum compression)
                  default: 9 -->
@@ -382,9 +382,10 @@ Build-Date: ${build.tstamp}
     <macrodef name="call-junit">
         <attribute name="testfamily"/>
         <attribute name="testITsuffix" default=""/>
+        <attribute name="coverage" default="true"/>
         <sequential>
             <echo message="Running @{testfamily}@{testITsuffix} tests with JUnit"/>
-            <jacoco:coverage destfile="${test.dir}/jacoco@{testITsuffix}.exec">
+            <jacoco:coverage destfile="${test.dir}/jacoco@{testITsuffix}.exec" enabled="@{coverage}">
                 <junit printsummary="yes" fork="true" forkmode="once">
                     <jvmarg value="-Dfile.encoding=UTF-8"/>
                     <jvmarg line="-addmods java.xml.bind" if:set="isJava9" />
@@ -414,13 +415,13 @@ Build-Date: ${build.tstamp}
         description="Run unit, functional and performance tests. OSM API (TEST) account shall be set with -Dosm.username and -Dosm.password">
         <call-junit testfamily="unit"/>
         <call-junit testfamily="functional"/>
-        <call-junit testfamily="performance"/>
+        <call-junit testfamily="performance" coverage="false"/>
     </target>
     <target name="test-it" depends="test-compile" unless="test-it.notRequired"
         description="Run integration tests. OSM API (TEST) account shall be set with -Dosm.username and -Dosm.password">
         <call-junit testfamily="unit" testITsuffix="IT"/>
         <call-junit testfamily="functional" testITsuffix="IT"/>
-        <call-junit testfamily="performance" testITsuffix="IT"/>
+        <call-junit testfamily="performance" testITsuffix="IT" coverage="false"/>
     </target>
     <target name="test-html" depends="test, test-it" description="Generate HTML test reports">
         <!-- May require additional ant dependencies like ant-trax package -->
@@ -655,7 +656,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-6.19-all.jar"/>
+             classpath="tools/checkstyle/checkstyle-7.0-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/defaultpresets.xml b/data/defaultpresets.xml
index 98984e2..2659772 100644
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -270,8 +270,8 @@
         <text key="branch" text="Branch operator" />
     </chunk>
     <chunk id="cable_circuit">
-        <combo key="cables" text="Amount of Cables" values="1,3,6,9,12" lenght="2" />
-        <combo key="circuits" text="Amount of circuits" values="1,2,3" lenght="2" />
+        <combo key="cables" text="Amount of Cables" values="1,2,3,4,6,9,12" />
+        <combo key="circuits" text="Amount of circuits" values="1,2,3,4" />
     </chunk>
     <chunk id="power_loc">
         <combo key="location" text="Location" values="outdoor,indoor,underground,platform,kiosk" values_context="power" />
@@ -987,7 +987,13 @@
                   sv.href="http://wiki.openstreetmap.org/wiki/Sv:Tag:highway=track"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Tag:highway=track" />
             <space />
-            <combo key="tracktype" text="Tracktype" values="grade1,grade2,grade3,grade4,grade5" />
+            <combo key="tracktype" text="Tracktype" values_searchable="true" values_sort="false">
+                <list_entry value="grade1" short_description="Solid: paved or heavily compacted hardcore surface" />
+                <list_entry value="grade2" short_description="Mostly Solid: gravel/rock with some soft material mixed in" />
+                <list_entry value="grade3" short_description="Even mixture of hard and soft materials" />
+                <list_entry value="grade4" short_description="Mostly Soft: soil/sand/grass with some hard material mixed in" />
+                <list_entry value="grade5" short_description="Soft: soil/sand/grass" />
+            </combo>
             <key key="highway" value="track" />
             <optional>
                 <reference ref="name_layer" />
@@ -1303,7 +1309,12 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:crossing" />
             <space />
             <key key="highway" value="crossing" />
-            <combo key="crossing" text="Pedestrian crossing type" values="uncontrolled,traffic_signals,island,unmarked,no" />
+            <combo key="crossing" text="Pedestrian crossing type" >
+                <list_entry value="uncontrolled" icon="styles/standard/vehicle/crossing.svg" />
+                <list_entry value="traffic_signals" icon="styles/standard/vehicle/crossing_traffic_signals.svg" />
+                <list_entry value="island" icon="styles/standard/vehicle/crossing_island.svg" />
+                <list_entry value="unmarked" icon="styles/standard/vehicle/crossing_unmarked.svg" />
+            </combo>
             <combo key="crossing_ref" text="Crossing type name (UK)" values="zebra,pelican,toucan,puffin,pegasus,tiger" values_searchable="true" />
             <combo key="supervised" text="Crossing attendant" delimiter="|" values="yes|no|06:00-20:00|Mo-Fr 09:00-18:00,Sa 08:00-14:00|May-Sep 09:30-12:30,14:15-19:30" />
             <combo key="tactile_paving" text="Tactile Paving" values="yes,no,incorrect" />
@@ -2304,8 +2315,8 @@
             <text key="name" text="Name" />
         </item> <!-- Bay -->
     </group> <!-- Water -->
-    <group name="Shipping" icon="presets/ferry.png">
-        <item name="Ferry Terminal" icon="presets/ferry.png" type="node,closedway,multipolygon" preset_name_label="true">
+    <group name="Shipping" icon="styles/standard/nautical/ferry.svg">
+        <item name="Ferry Terminal" icon="styles/standard/nautical/ferry.svg" type="node,closedway,multipolygon" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=ferry_terminal"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:amenity=ferry_terminal"
                   fi.href="http://wiki.openstreetmap.org/wiki/Fi:Tag:amenity=ferry_terminal"
@@ -2318,7 +2329,7 @@
             <text key="name" text="Name" />
             <combo key="cargo" text="Cargo" values="passengers,vehicle,bicycle,hgv,passengers;vehicle" values_context="cargo" />
         </item> <!-- Ferry Terminal -->
-        <item name="Ferry Route" icon="presets/ferry.png" type="way,closedway,relation" preset_name_label="true">
+        <item name="Ferry Route" icon="styles/standard/nautical/ferry.svg" type="way,closedway,relation" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:route=ferry"
                   da.href="http://wiki.openstreetmap.org/wiki/Da:Tag:route=ferry"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:route=ferry"
@@ -2868,9 +2879,46 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Tag:amenity=charging_station" />
             <space />
             <key key="amenity" value="charging_station" />
-            <reference ref="name_operator" />
-            <text key="voltage" text="Voltage" />
-            <text key="amperage" text="Amperage" />
+            <reference ref="name_ref_operator" />
+            <reference ref="oh" />
+            <reference ref="fee" />
+            <space />
+            <combo key="voltage" text="Voltage" values="230,400"/>
+            <combo key="amperage" text="Amperage" values="16,32" />
+            <combo key="capacity" text="Capacity" values="1,2,3,4,5,6" />
+            <space />
+            <label text="Types of vehicles which can be charged:" />
+            <checkgroup columns="4">
+                <check key="bicycle" text="Bicycle" />
+                <check key="scooter" text="Scooter" />
+                <check key="car" text="Car" />
+                <check key="truck" text="Truck" />
+            </checkgroup>
+            <space />
+            <label text="Number of Sockets:" />
+            <combo key="socket:type1" text="Type 1 (Yazaki)" values="1,2,3,4,5,6" />
+            <combo key="socket:type1_combo" text="Type 1 Combo" values="1,2,3,4,5,6" />
+            <combo key="socket:type2" text="Type 2 (Mennekes)" values="1,2,3,4,5,6" />
+            <combo key="socket:type2_combo" text="Type 2 Combo" values="1,2,3,4,5,6" />
+            <combo key="socket:type3" text="Type 3 (SCAME)" values="1,2,3,4,5,6" />
+            <combo key="socket:chademo" text="CHAdeMO" values="1,2,3,4,5,6" />
+            <combo key="socket:tesla_supercharger" text="Tesla Supercharger" values="1,2,3,4,5,6" />
+            <combo key="socket:schuko" text="Schuko" values="1,2,3,4,5,6" />
+            <combo key="socket:cee_blue" text="CEE blue" values="1,2,3,4,5,6" />
+            <combo key="socket:cee_red_16a" text="CEE red 16A" values="1,2,3,4,5,6" />
+            <combo key="socket:cee_red_32a" text="CEE red 32A" values="1,2,3,4,5,6" />
+            <combo key="socket:nema_5_15" text="NEMA 5-15" values="1,2,3,4,5,6" />
+            <combo key="socket:nema_5_20" text="NEMA 5-20" values="1,2,3,4,5,6" />
+            <space />
+            <label text="Authentication:" />
+            <checkgroup columns="4">
+                <check key="authentication:none" text="None" />
+                <check key="authentication:phone_call" text="Phone call" />
+                <check key="authentication:short_message" text="Short message" />
+                <check key="authentication:nfc" text="NFC" />
+            </checkgroup>
+            <combo key="authentication:membership_card" text="Membership card" values="yes" />
+            <preset_link preset_name="Payment Methods" />
         </item> <!-- Charging Station -->
         <item name="Wash" icon="presets/car_wash.png" type="node,closedway,multipolygon" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=car_wash"
@@ -3166,7 +3214,7 @@
             </roles>
         </item> <!-- Stop Area -->
         <separator/>
-        <item name="Stop Position" type="node" icon="presets/barrier.png" preset_name_label="true">
+        <item name="Stop Position" type="node" icon="styles/standard/transport/railway_small.png" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Proposed_features/Public_Transport#Stop_position" />
             <space />
             <key key="public_transport" value="stop_position" />
@@ -3179,13 +3227,15 @@
                 <text key="network" text="Network" />
                 <combo key="tactile_paving" text="Tactile Paving" values="yes,no,incorrect" />
             </optional>
-            <check key="bus" text="Bus" />
-            <check key="highway" value_on="bus_stop" value_off="" text="Bus stop (legacy)" />
-            <check key="tram" text="Tram" />
-            <check key="railway" value_on="tram_stop" value_off="" text="Tram stop (legacy)" />
-            <check key="train" text="Train" />
-            <check key="railway" value_on="station" value_off="" text="Railway station (legacy)" />
-            <check key="railway" value_on="halt" value_off="" text="Railway halt (legacy)" />
+            <space />
+            <checkgroup columns="2">
+                <check key="bus" text="Bus" />
+                <check key="highway" value_on="bus_stop" value_off="" text="Bus stop (legacy)" />
+                <check key="tram" text="Tram" />
+                <check key="railway" value_on="tram_stop" value_off="" text="Tram stop (legacy)" />
+                <check key="train" text="Train" />
+                <check key="railway" value_on="halt" value_off="" text="Railway halt (legacy)" />
+            </checkgroup>
             <check key="trolleybus" text="Trolleybus" />
             <check key="share_taxi" text="Share taxi" />
             <check key="subway" text="Subway" />
@@ -3194,7 +3244,7 @@
             <check key="aerialway" text="Aerialway" />
             <check key="ferry" text="Ferry" />
         </item> <!-- Stop Position -->
-        <item name="Platform" type="node,way,closedway,multipolygon" icon="presets/platform_bus.png" preset_name_label="true">
+        <item name="Platform" type="node,way,closedway,multipolygon" icon="styles/standard/transport/platform.svg" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Proposed_features/Public_Transport#Platform" />
             <space />
             <key key="public_transport" value="platform" />
@@ -3205,28 +3255,8 @@
             <check key="covered" text="Covered" />
             <reference ref="wheelchair" />
             <combo key="tactile_paving" text="Tactile Paving" values="yes,no,incorrect" />
-            <optional>
-                <text key="ref" text="Reference" />
-                <text key="uic_ref" text="UIC reference" />
-                <text key="uic_name" text="UIC name" />
-                <text key="operator" text="Operator" />
-                <text key="network" text="Network" />
-                <space/>
-                <check key="bus" text="Bus" />
-                <check key="highway" value_on="platform" text="Highway platform (legacy)" />
-                <check key="tram" text="Tram" />
-                <check key="train" text="Train" />
-                <check key="railway" value_on="platform" text="Railway platform (legacy)" />
-                <check key="trolleybus" text="Trolleybus" />
-                <check key="share_taxi" text="Share taxi" />
-                <check key="subway" text="Subway" />
-                <check key="monorail" text="Monorail" />
-                <check key="funicular" text="funicular" />
-                <check key="aerialway" text="aerialway" />
-                <check key="ferry" text="ferry" />
-            </optional>
         </item> <!-- Platform -->
-        <item name="Station" name_context="railway" type="node,closedway,multipolygon" icon="styles/standard/transport/railway_station.png" preset_name_label="true">
+        <item name="Station" name_context="railway" type="node,closedway,multipolygon" icon="styles/standard/transport/station.svg" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:public_transport=station"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:public_transport=station"
                   es.href="http://wiki.openstreetmap.org/wiki/ES:Tag:public_transport=station"
@@ -3323,7 +3353,7 @@
                 <text key="name" text="Name" />
             </optional>
         </item> <!-- Railway Halt -->
-        <item name="Tram Stop" icon="presets/tram.png" type="node" preset_name_label="true">
+        <item name="Tram Stop" icon="styles/standard/transport/tram.png" type="node" preset_name_label="true">
            <link href="http://wiki.openstreetmap.org/wiki/Tag:railway=tram_stop"
                   de.href="http://wiki.openstreetmap.org/wiki/DE:Tag:railway=tram_stop"
                   ja.href="http://wiki.openstreetmap.org/wiki/JA:Tag:railway=tram_stop"
@@ -5325,7 +5355,14 @@
             <key key="amenity" value="shelter" />
             <text key="name" text="Name" />
             <check key="fireplace" text="Fireplace" />
-            <combo key="shelter_type" text="Type of shelter" values="basic_hut,lean_to,picnic_shelter,public_transport,weather_shelter,wildlife_hide" values_context="shelter" values_searchable="true" />
+            <combo key="shelter_type" text="Type of shelter" values_context="shelter" values_searchable="true">
+                <list_entry value="basic_hut" icon="styles/standard/accommodation/basic_hut_blue.png" />
+                <list_entry value="lean_to" icon="styles/standard/accommodation/shelter_lean_to.svg" />
+                <list_entry value="picnic_shelter" icon="styles/standard/accommodation/shelter_picnic_brown.png" />
+                <list_entry value="public_transport" icon="styles/standard/accommodation/shelter_public_transport_brown.png" />
+                <list_entry value="weather_shelter" icon="styles/standard/accommodation/shelter.png" />
+                <list_entry value="wildlife_hide" icon="styles/standard/accommodation/shelter.png" />
+            </combo>
         </item> <!-- Shelter -->
         <item name="Hunting Stand" icon="presets/hunting_stand.png" type="node" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:amenity=hunting_stand"
@@ -6069,7 +6106,14 @@
                   ru.href="http://wiki.openstreetmap.org/wiki/RU:Key:entrance"
                   uk.href="http://wiki.openstreetmap.org/wiki/Uk:Key:entrance" />
             <space />
-            <combo key="entrance" text="Entrance" values="yes,main,service,exit,emergency,staircase" values_context="entrance" default="yes" match="key" />
+            <combo key="entrance" text="Entrance" values_context="entrance" default="yes" match="key">
+                <list_entry value="yes" icon="styles/standard/misc/entrance-yes.png" />
+                <list_entry value="main" icon="styles/standard/misc/entrance-main.png" />
+                <list_entry value="service" icon="styles/standard/misc/entrance-service.png" />
+                <list_entry value="exit" icon="styles/standard/misc/entrance-exit.png" />
+                <list_entry value="emergency" icon="styles/standard/misc/entrance-emergency.png" />
+                <list_entry value="staircase" icon="styles/standard/misc/entrance-yes.png" />
+            </combo>
             <combo key="access" text="Access" values="yes,delivery,private,no" />
             <reference ref="wheelchair" />
             <optional>
@@ -6899,7 +6943,7 @@
                 <combo key="design" text="Tower design" values="one-level,two-level,donau,three-level,barrel,asymmetric,triangle,flag,donau;one-level,four-level,six-level,nine-level,delta,delta_two-level,y-frame,x-frame,h-frame,guyed_h-frame,portal,portal_two-level,portal_three-level,guyed_v-frame,bipole,monopolar" values_context="power" />
                 <check key="triple_tower" text="Triple tower" />
                 <check key="design:incomplete" text="Incomplete tower" />
-                <check key="tower" text="Location transition" value_on="transition" disable_off="true" />
+                <check key="location:transition" text="Location transition" disable_off="true" />
             </optional>
         </item> <!-- Power Tower -->
         <item name="Pole" icon="styles/standard/power/pole.svg" type="node" preset_name_label="true">
@@ -6917,7 +6961,7 @@
             <key key="power" value="pole" />
             <text key="height" text="Height (meters)" />
             <combo key="material" text="Material" values="metal,plastic,steel,stone,wood,concrete" />
-            <check key="pole" text="Location transition" value_on="transition" disable_off="true" />
+            <check key="location:transition" text="Location transition" disable_off="true" />
             <reference ref="ref_operator_branch" />
         </item> <!-- Pole -->
         <item name="Pole with Transformer" icon="styles/standard/power/pole_transformer.svg" type="node" preset_name_label="true">
@@ -6934,7 +6978,7 @@
             <label text="Pole Attributes:" />
             <text key="height" text="Height (meters)" />
             <combo key="material" text="Material" values="metal,plastic,steel,stone,wood,concrete" />
-            <check key="pole" text="Location transition" value_on="transition" disable_off="true" />
+            <check key="location:transition" text="Location transition" disable_off="true" />
             <reference ref="ref_operator_branch" />
             <space />
             <label text="Transformer Attributes:" />
@@ -8960,13 +9004,10 @@
             <key key="natural" value="tree" />
             <text key="name" text="Name" />
             <text key="height" text="Height (meters)" />
-            <text key="name:botanical" text="Botanical Name" />
-            <optional>
-                <text key="genus" text="Genus" />
-                <text key="species" text="Species" />
-                <text key="taxon" text="Taxon" />
-                <reference ref="leaf" />
-            </optional>
+            <text key="genus" text="Genus" />
+            <text key="species" text="Species" />
+            <text key="taxon" text="Taxon" />
+            <reference ref="leaf" />
         </item> <!-- Tree -->
         <item name="Tree Row" icon="styles/standard/misc/landmark/tree_row.svg" type="way" preset_name_label="true">
             <link href="http://wiki.openstreetmap.org/wiki/Tag:natural=tree_row"
diff --git a/data/validator/combinations.mapcss b/data/validator/combinations.mapcss
index 1e5c726..6d37ecf 100644
--- a/data/validator/combinations.mapcss
+++ b/data/validator/combinations.mapcss
@@ -155,7 +155,7 @@ way[power=cable                ][!voltage],
 }
 
 /* {0.key} without {1.key} or {2.key} */
-*[oneway                       ][!highway][!railway] {
+way[oneway][!highway][!railway] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
 }
 
@@ -216,7 +216,7 @@ way[power=cable                ][!voltage],
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
 }
 
-/*see #11127*/
+/* #11127 */
 way[waterway][bridge=yes] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{1.tag}");
   suggestAlternative: "bridge=aqueduct";
@@ -236,7 +236,7 @@ way[waterway][bridge=yes] {
   throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
 }
 
-/* see #9811, #11491, #12865 */
+/* #9811, #11491, #12865 */
 *[place][place!=farm][/^addr:/],
 *[boundary][/^addr:/],
 *[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
@@ -261,7 +261,7 @@ way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode
   fixChangeKey: "addr:postcode=>postal_code";
 }
 
-/* see #9195 */
+/* #9195 */
 *[highway=footway][cycleway=lane] {
   throwWarning: tr("{0} together with {1}", "{0.tag}", "{1.tag}");
   suggestAlternative: "highway=path + foot=designated + bicycle=designated + segregated=yes";
@@ -291,14 +291,14 @@ way[highway][natural],
   assertNoMatch: "node highway=street_lamp natural=birds_nest note=josm#10193";
 }
 
+/* #6932 */
 *[natural=water][leisure=swimming_pool],
 *[natural=water][amenity=swimming_pool] {
-  /* see #6932 */
   throwWarning: tr("natural water used for swimming pool");
   fixRemove: "natural";
 }
 
-/* see #9593, #11183, #12418, #12761 */
+/* #9593, #11183, #12418, #12761 */
 *[sport][!building][!club][tourism != hotel][highway != raceway][leisure !~ /^(sports_centre|stadium|track|pitch|golf_course|water_park|swimming_pool|recreation_ground|ice_rink)$/][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");
     assertMatch: "node sport=tennis";
@@ -309,12 +309,12 @@ way[highway][natural],
     assertNoMatch: "node sport=10pin amenity=restaurant";
 }
 
-/* see #10140 */
+/* #10140 */
 *[building:levels][!building][!building:part] {
   throwWarning: tr("{0} without {1} or {2}", "{0.key}", "{1.key}", "{2.key}");
 }
 
-/* see #10471 */
+/* #10471 */
 way[waterway] > node[ford?] { set ford_on_waterway; }
 way[highway] > node[ford?] { set ford_on_highway; }
 node[ford?]:in-downloaded-area!.ford_on_waterway, node[ford?]:in-downloaded-area!.ford_on_highway {
@@ -326,14 +326,14 @@ node[ford?]:in-downloaded-area!.ford_on_waterway, node[ford?]:in-downloaded-area
   throwWarning: tr("alternative name without {0}", "{1.key}");
 }
 
-/* see #10837 */
+/* #10837 */
 way[destination][!oneway?][junction!=roundabout][highway] {
   throwWarning: tr("incomplete usage of {0} on a way without {1}", "{0.key}", "{1.key}");
   suggestAlternative: "destination:forward";
   suggestAlternative: "destination:backward";
 }
 
-/* see #11389 */
+/* #11389 */
 way["maxspeed:forward"=*"maxspeed:backward"][!maxspeed] {
   throwWarning: tr("Same value of {0} and {1}", "{0.key}", "{1.key}");
   suggestAlternative: "maxspeed";
@@ -355,8 +355,21 @@ way["maxspeed:backward"][maxspeed][!"maxspeed:forward"] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{1.key}");
 }
 
-/* see #11837 */
+/* #11837 */
 way[layer][layer<0][bridge][bridge!=no][location!=underground][indoor!=yes][!tunnel],
 way[layer][layer>0][tunnel][tunnel!=no][location!=overground][indoor!=yes][!bridge] {
   throwWarning: tr("Suspicious tag combination: {0} and {1}", "{2.tag}", "{0.tag}");
+}
+
+/* #12942 */
+relation[oneway][type!=route] {
+  throwWarning: tr("{0} on a relation without {1}", "{0.key}", "{1.tag}");
+}
+
+/* #9182 */
+way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) > 400] {
+  throwWarning: tr("Long waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
+}
+way[waterway][layer][layer=~/^(-1|-2|-3|-4|-5)$/][!tunnel][culvert!=yes][covered!=yes][pipeline!=yes][location!=underground][eval(waylength()) <= 400] {
+  throwOther: tr("Short waterway with {0} but without a tag which defines it as tunnel or underground. Remove {1} or add a tunnel tag if applicable. Also check crossing bridges and their {1} tags.", "{1.tag}", "{1.key}");
 }
\ No newline at end of file
diff --git a/data/validator/deprecated.mapcss b/data/validator/deprecated.mapcss
index 19350bb..95ca6cb 100644
--- a/data/validator/deprecated.mapcss
+++ b/data/validator/deprecated.mapcss
@@ -101,9 +101,8 @@
 *[shop=organic] {
   /* from http://wiki.openstreetmap.org/wiki/Tag:shop=organic */
   throwWarning: tr("{0} is deprecated", "{0.tag}");
-  suggestAlternative: "shop=supermarket + organic=only";
-  fixAdd: "shop=supermarket";
-  fixAdd: "organic=only";
+  suggestAlternative: "shop=* + organic=yes";
+  suggestAlternative: "shop=* + organic=only";
 }
 
 *[shop=pets] {
@@ -848,4 +847,24 @@ way[highway=service][service][service !~ /^(alley|drive-through|drive_through|dr
 way[railway=rail][service][service !~ /^(crossover|siding|spur|yard)$/],
 way[waterway=canal][service][service !~ /^(irrigation|transportation|water_power)$/] {
   throwWarning: tr("The key {0} has an uncommon value.", "{1.key}");
+}
+
+/* #13008 */
+*[name:botanical] {
+  throwWarning: tr("{0} is deprecated", "{0.key}");
+  suggestAlternative: "species";
+}
+
+/* #13101 */
+node[pole=transition] {
+  throwWarning: tr("{0} is deprecated", "{0.tag}");
+  suggestAlternative: "location:transition=yes";
+  fixAdd: "location:transition=yes";
+  fixRemove: "pole";
+}
+node[tower=transition] {
+  throwWarning: tr("{0} is deprecated", "{0.tag}");
+  suggestAlternative: "location:transition=yes";
+  fixAdd: "location:transition=yes";
+  fixRemove: "tower";
 }
\ No newline at end of file
diff --git a/data/validator/geometry.mapcss b/data/validator/geometry.mapcss
index 937d1e7..de154f9 100644
--- a/data/validator/geometry.mapcss
+++ b/data/validator/geometry.mapcss
@@ -80,6 +80,7 @@ node[restriction] {
 
 /* {0} on a way, should be a node */
 way[entrance],
+way[railway=subway_entrance],
 way[man_made=survey_point],
 way[power=transformer],
 way[power=pole],
@@ -226,7 +227,7 @@ way[highway] > node[tourism=information][information=guidepost] {
   set guidepost;
   throwOther: tr("{0} node connected to a highway", "{1.tag}");
 }
-way[highway] > node[amenity][!entrance][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking|bus_station|car_wash)$/],
+way[highway] > node[amenity][!entrance][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking|bus_station|car_wash|ferry_terminal)$/],
 way[highway] > node[building][!entrance],
 way[highway] > node[leisure][!entrance][leisure!=slipway],
 way[highway] > node[office][!entrance],
@@ -241,13 +242,13 @@ way[junction=roundabout]!:righthandtraffic:anticlockwise {
 }
 
 /* #12496 */
-area:closed[place=islet][eval(areasize()) > 1500] {
+area:closed[place=islet][eval(areasize()) > 1500000] {
   throwWarning: tr("{0} on a large area", "{1.tag}");
   suggestAlternative: "place=island";
   fixAdd: "place=island";
 }
 
-area:closed[place=island][eval(areasize()) < 500] {
+area:closed[place=island][eval(areasize()) < 500000] {
   throwWarning: tr("{0} on a small area", "{1.tag}");
   suggestAlternative: "place=islet";
   fixAdd: "place=islet";
@@ -268,7 +269,13 @@ way[!power][!building] > node.node_in_power_way {
   throwWarning: tr("Node connects a power line or cable with an object which is not related to the power infrastructure.");
 }
 
-/* #12646 */
-way[waterway][waterway!=canal]!:closed >[index=-1] node!:connection:in-downloaded-area { 
+/* #12646, #12992 */
+way[waterway=~/^(stream|ditch|river|drain)$/]!:closed >[index=-1] node!:connection:in-downloaded-area { 
   throwWarning: tr("Waterway ends without a connection to another waterway or the direction of the waterway is wrong.");
+}
+
+/* #10717 */
+way[natural=coastline] ∈ area[natural=water],
+way[natural=coastline] ∈ area[waterway=riverbank] {
+  throwError: tr("Coastline inside {1}", "{0.tag}");
 }
\ No newline at end of file
diff --git a/data/validator/ignoretags.cfg b/data/validator/ignoretags.cfg
index ecbf706..884f780 100644
--- a/data/validator/ignoretags.cfg
+++ b/data/validator/ignoretags.cfg
@@ -103,6 +103,11 @@ E:traffic_sign
 E:building:levels
 E:exit_to
 E:distance
+E:voltage
+E:amperage
+E:capacity
+E:cables
+E:circuits
 ;
 ; Ignore valid and semi-valid keys that end with...
 ;
@@ -142,7 +147,6 @@ K:building=static_caravan
 K:leisure=recreation_ground
 K:old_railway_operator=PRR
 K:maintenance=gritting
-K:location:transition=yes
 ;
 ; Highway Key/Value Pairs
 ;
@@ -274,3 +278,4 @@ K:type=building
 ; see https://josm.openstreetmap.de/ticket/10759
 ;
 K:man_made=mast
+K:landuse=logging
diff --git a/eclipse/formatter.xml b/eclipse/formatter.xml
new file mode 100644
index 0000000..b927b01
--- /dev/null
+++ b/eclipse/formatter.xml
@@ -0,0 +1,295 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="12">
+<profile kind="CodeFormatterProfile" name="josm" version="12">
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.8"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.8"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.8"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+</profile>
+</profiles>
diff --git a/geticons.pl b/geticons.pl
index 566e2b6..4807ab7 100755
--- a/geticons.pl
+++ b/geticons.pl
@@ -42,7 +42,7 @@ for my $arg (@ARGV ? @ARGV : @default)
         $img = $val if((!-f "images/$img") && -f "images/$val");
         ++$icons{$img};
       }
-      if($l =~ /ImageProvider(?:\.get)?\(\"([^\"]*?)\"\)/)
+      if($l =~ /ImageProvider(?:\.get)?\(\"([^\"]*?)\"(?:, ImageProvider.ImageSizes.[A-Z]+)?\)/)
       {
         my $i = $1;
         $i = "styles/standard/$i" if $i eq "misc/no_icon";
diff --git a/i18n/build.xml b/i18n/build.xml
index 7ae4bda..fc8d3c5 100644
--- a/i18n/build.xml
+++ b/i18n/build.xml
@@ -23,16 +23,16 @@
         <mkdir dir="${i18n.build.dir}"/>
     </target>
     <target name="trans_.java" depends="builddir">
-        <exec executable="perl" failonerror="true" output="${i18n.build.dir}/trans_presets.java">
+        <exec executable="perl" failonerror="true" logError="true" output="${i18n.build.dir}/trans_presets.java">
             <arg line="convpreset.pl ${josm.presets}"/>
         </exec>
-        <exec executable="perl" failonerror="true" output="${i18n.build.dir}/trans_maps.java">
+        <exec executable="perl" failonerror="true" logError="true" output="${i18n.build.dir}/trans_maps.java">
             <arg line="convmaps.pl ${maps.srcfile}"/>
         </exec>
-        <exec executable="perl" failonerror="true" output="${i18n.build.dir}/trans_surveyor.java">
+        <exec executable="perl" failonerror="true" logError="true" output="${i18n.build.dir}/trans_surveyor.java">
             <arg line="convsurveyor.pl ${surveyor.srcfile}"/>
         </exec>
-        <exec executable="perl" failonerror="true" output="${i18n.build.dir}/trans_plugins.java">
+        <exec executable="perl" failonerror="true" logError="true" output="${i18n.build.dir}/trans_plugins.java">
             <arg line="convplugins.pl ${plugin.dir}/*/build.xml"/>
         </exec>
         <exec executable="perl" failonerror="true">
diff --git a/i18n/convpreset.pl b/i18n/convpreset.pl
index ff59ba7..22aea44 100644
--- a/i18n/convpreset.pl
+++ b/i18n/convpreset.pl
@@ -6,6 +6,7 @@
 use strict;
 
 my $item = "";
+my $chunk = "";
 my $group;
 my $combo_n;
 my $combo_type;
@@ -30,6 +31,16 @@ sub fix($)
   return $val;
 }
 
+sub infoblock
+{
+  my $r = "";
+  $r .= " item $item" if $item;
+  $r .= " chunk $chunk" if $chunk;
+  $r .= " group $group" if $group;
+  $r .= " $_[0]" if $_[0];
+  return $r ? "/* $r */ " : "";
+}
+
 my $linenr = 0;
 while(my $line = <>)
 {
@@ -43,13 +54,17 @@ while(my $line = <>)
     $item =~ s/""/\//;
     if($line =~ /name_context=(".*?")/)
     {
-      print "/* item $item */ trc($1, $val);\n";
+      print infoblock() . "trc($1, $val);\n";
     }
     else
     {
-      print "/* item $item */ tr($val);\n";
+      print infoblock() . "tr($val);\n";
     }
   }
+  elsif($line =~ /<chunk\s+id=(".*?")/)
+  {
+    $chunk = fix($1);
+  }
   elsif($line =~ /<group.*\s+name=(".*?")/)
   {
     my $gr = fix($1);
@@ -57,27 +72,27 @@ while(my $line = <>)
     $group =~ s/\"\"/\//;
     if($line =~ /name_context=(".*?")/)
     {
-      print "/* group $group */ trc($1,$gr);\n";
+      print infoblock() . "trc($1,$gr);\n";
     }
     else
     {
-      print "/* group $group */ tr($gr);\n";
+      print infoblock() . "tr($gr);\n";
     }
   }
   elsif($line =~ /<label.*\s+text=" "/)
   {
-    print "/* item $item empty label */\n";
+    print infoblock("empty label") . "\n";
   }
   elsif($line =~ /<label.*\s+text=(".*?")/)
   {
     my $text = fix($1);
     if($line =~ /text_context=(".*?")/)
     {
-      print "/* item $item label $text */ trc($1,$text);\n";
+      print infoblock("label $text") ."trc($1,$text);\n";
     }
     else
     {
-      print "/* item $item label $text */ tr($text);\n";
+      print infoblock("label $text") . "tr($text);\n";
     }
   }
   elsif($line =~ /<text.*\s+text=(".*?")/)
@@ -85,11 +100,11 @@ while(my $line = <>)
     my $n = fix($1);
     if($line =~ /text_context=(".*?")/)
     {
-      print "/* item $item text $n */ trc($1,$n);\n";
+      print infoblock("text $n") . "trc($1,$n);\n";
     }
     else
     {
-      print "/* item $item text $n */ tr($n);\n";
+      print infoblock("text $n") . "tr($n);\n";
     }
   }
   elsif($line =~ /<check.*\s+text=(".*?")/)
@@ -97,11 +112,11 @@ while(my $line = <>)
     my $n = fix($1);
     if($line =~ /text_context=(".*?")/)
     {
-      print "/* item $item check $n */ trc($1,$n);\n";
+      print infoblock("check $n") . "trc($1,$n);\n";
     }
     else
     {
-      print "/* item $item check $n */ tr($n);\n";
+      print infoblock("check $n") . "tr($n);\n";
     }
   }
   elsif($line =~ /<role.*\s+text=(".*?")/)
@@ -109,11 +124,11 @@ while(my $line = <>)
     my $n = fix($1);
     if($line =~ /text_context=(".*?")/)
     {
-      print "/* item $item role $n */ trc($1,$n);\n";
+      print infoblock("role $n") . "trc($1,$n);\n";
     }
     else
     {
-      print "/* item $item role $n */ tr($n);\n";
+      print infoblock("role $n") . "tr($n);\n";
     }
   }
   elsif($line =~ /<optional.*\s+text=(".*?")/)
@@ -121,11 +136,11 @@ while(my $line = <>)
     my $n = fix($1);
     if($line =~ /text_context=(".*?")/)
     {
-      print "/* item $item optional $n */ trc($1,$n);\n";
+      print infoblock("optional $n") . "trc($1,$n);\n";
     }
     else
     {
-      print "/* item $item optional $n */ tr($n);\n";
+      print infoblock("optional $n") . "tr($n);\n";
     }
   }
   elsif($line =~ /<(combo|multiselect).*\s+text=(".*?")/)
@@ -136,7 +151,7 @@ while(my $line = <>)
     $vctx = ($line =~ /values_context=(".*?")/) ? $1 : undef;
     # text
     my $tctx = ($line =~ /text_context=(".*?")/) ? $1 : undef;
-    print "/* item $item $type $n */" . ($tctx ? " trc($tctx, $n);" : " tr($n);");
+    print infoblock("$type $n") . ($tctx ? " trc($tctx, $n);" : " tr($n);");
     # display_values / values
     my $sp = ($line =~ /delimiter="(.*?)"/) ? $1 : ($type eq "combo" ? ",":";");
     my $vals = ($line =~ / display_values="(.*?)"/) ? $1 : ($line =~ /values="(.*?)"/) ? $1 : undef;
@@ -148,7 +163,7 @@ while(my $line = <>)
       {
         next if $val =~ /^[0-9-]+$/; # search for non-numbers
         $val = fix($val);
-        print "/* item $item $type $n display value */" . ($vctx ? " trc($vctx, \"$val\");" : " tr(\"$val\");");
+        print infoblock("$type $n display value") . ($vctx ? " trc($vctx, \"$val\");" : " tr(\"$val\");");
       }
     }
     print "\n";
@@ -160,17 +175,17 @@ while(my $line = <>)
     if($line =~ /display_value=(".*?")/)
     {
       my $val = fix($1);
-      print "/* item $item $combo_type $combo_n entry $value display value */" . ($vctxi ? " trc($vctxi, $val);" : " tr($val);");
+      print infoblock("$combo_type $combo_n entry $value display value") . ($vctxi ? " trc($vctxi, $val);" : " tr($val);");
     }
     else
     {
       my $val = fix($value);
-      print "/* item $item $combo_type $combo_n entry $value display value */" . ($vctxi ? " trc($vctxi, $val);" : " tr($val);");
+      print infoblock("$combo_type $combo_n entry $value display value") . ($vctxi ? " trc($vctxi, $val);" : " tr($val);");
     }
     if($line =~ /short_description=(".*?")/)
     {
       my $val = fix($1);
-      print "/* item $item $combo_type $combo_n entry $value short description */ tr($val);";
+      print infoblock("$combo_type $combo_n entry $value short description") . "tr($val);";
     }
     print "\n";
   }
@@ -184,6 +199,10 @@ while(my $line = <>)
     $item = "";
     print "\n";
   }
+  elsif($line =~ /<\/chunk>/)
+  {
+    $chunk = "";
+  }
   elsif($line =~ /<\/(combo|multiselect)/)
   {
     $combo_n = "";
diff --git a/i18n/po/af.po b/i18n/po/af.po
index 0d54c09..fe750ce 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:31+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:31+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: af\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/am.po b/i18n/po/am.po
index 9c94966..ef4b6f2 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:32+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:32+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: am\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ar.po b/i18n/po/ar.po
index 0e1abc7..7f3b2d4 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:32+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:32+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ar\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2634,14 +2634,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "لم أجد شيء مطابق لِــ ''{0}''"
 
@@ -2657,6 +2649,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "وجدتُ {0} مطابقات"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3937,9 +3937,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9034,7 +9031,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14606,6 +14603,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14846,7 +14846,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15824,6 +15824,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17607,18 +17610,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18808,6 +18826,72 @@ msgstr "التوتر"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "غسيل سيارات"
 
@@ -19012,9 +19096,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19039,15 +19120,6 @@ msgstr "ملجأ"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22834,9 +22906,6 @@ msgstr "شجرة"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "حرّر اإسم النباتي"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23873,6 +23942,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24025,6 +24109,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24397,6 +24484,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26264,13 +26354,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26392,6 +26482,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27088,9 +27190,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27622,6 +27721,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27661,6 +27769,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27799,9 +27919,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27893,12 +28010,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29255,33 +29381,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29681,6 +29855,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31342,19 +31522,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32010,6 +32190,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32042,10 +32228,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ast.po b/i18n/po/ast.po
index 2392190..c8ed9f3 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-01-23 20:31+0000\n"
 "Last-Translator: Xuacu Saturio <xuacusk8 at gmail.com>\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: 2016-06-05 04:33+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:33+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ast\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2833,14 +2833,6 @@ msgstr ""
 "oxetos (y tolos sos nudos de vía / miembros de la rellación) del área "
 "descargada"
 
-msgid "Searching"
-msgstr "Buscando"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Nun s`atoparon coincidencies pa \"{0}\""
 
@@ -2856,6 +2848,14 @@ msgstr "Nun s`atopó nada na selección buscando por ''{0}''"
 msgid "Found {0} matches"
 msgstr "Atopáronse {0} coincidencies"
 
+msgid "Searching"
+msgstr "Buscando"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4252,9 +4252,6 @@ msgstr "Etiquetes d''Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Busca erros n''etiquetes rellacionaes a Internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " La URL nun pue convertise a ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9853,8 +9850,8 @@ msgstr "faiga zoom averando pa cargar cualesquier tesela"
 msgid "zoom in to load more tiles"
 msgstr "faiga zoom averando pa cargar más teseles"
 
-msgid "increase zoom level to see more detail"
-msgstr "aumenta''l nivel de zoom pa ver más detalles"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Non hai teseles a esti nivel de zoom"
@@ -16148,6 +16145,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -16388,7 +16388,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17400,6 +17400,9 @@ msgstr ""
 "Fale colos usuarios editar el mapa cercanu, va ser notificáu de cuando "
 "daquién tea cerca de la so posición."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19272,18 +19275,33 @@ msgstr "Tipu de pista"
 msgid "grade1"
 msgstr "Grau 1 (pavimentada)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "Grau 2 (de grebos o zahorra)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "Grau 3 (de grebos con vexetación ente rodadures)"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "Grau 4 (de tierra con vexetación ente rodaduras)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "Grau 5 (con rodaduras apenes visibles ente la vexetación)"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala MTB"
 
@@ -20494,6 +20512,72 @@ msgstr "Voltaxe"
 msgid "Amperage"
 msgstr "Amperaxe"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Llimpieza"
 
@@ -20700,9 +20784,6 @@ msgstr "Parada de tranvía (etiqueta en desusu)"
 msgid "Train"
 msgstr "Tren"
 
-msgid "Railway station (legacy)"
-msgstr "Estación de fierrocarril (etiqueta en desusu)"
-
 msgid "Railway halt (legacy)"
 msgstr "Apeaderu de ferrocarril (etiqueta en desusu)"
 
@@ -20727,15 +20808,6 @@ msgstr "Abelugu"
 msgid "Waste Basket/Trash Can"
 msgstr "Papelera"
 
-msgid "Highway platform (legacy)"
-msgstr "Andén de carretera (etiqueta en desusu)"
-
-msgid "Railway platform (legacy)"
-msgstr "Andén de ferrocarril (etiqueta en desusu)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estación"
@@ -24535,9 +24607,6 @@ msgstr "Árbol"
 msgid "A single tree."
 msgstr "Un árbol solu"
 
-msgid "Botanical Name"
-msgstr "Nome botánicu"
-
 msgid "Tree Row"
 msgstr "Filera d''árboles"
 
@@ -25589,6 +25658,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} ta obsoleto"
 
@@ -25745,6 +25829,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome de cai embrivíu"
 
@@ -26138,6 +26225,9 @@ msgstr "Amosar la capa d''alluna d''elevación"
 msgid "Elevation Grid"
 msgstr "Alluna d''elevación"
 
+msgid "increase zoom level to see more detail"
+msgstr "aumenta''l nivel de zoom pa ver más detalles"
+
 msgid "No SRTM data"
 msgstr "Nun hai datos de SRTM"
 
@@ -28219,15 +28309,15 @@ msgstr "ente {0} {1} y {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  añediendo {0} {1}"
 
+msgid "EditGpx"
+msgstr "Editar GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Capa pa la edición de traces GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir a capa GPX con tiempu anonimizado"
 
-msgid "EditGpx"
-msgstr "Editar GPX"
-
 msgid "edit gpx tracks"
 msgstr "editar traces GPX"
 
@@ -28350,6 +28440,18 @@ msgstr "Llimpiar rexistru"
 msgid "Show users on map"
 msgstr "Amosar usuarios nel mapa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Solo posición"
 
@@ -29113,9 +29215,6 @@ msgstr "Amosar semeyes ensin xeoetiquetar"
 msgid "Imported Images"
 msgstr "Imaxes importaes"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Arquivos d''imaxe (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importar gráficos vectoriales"
 
@@ -29672,6 +29771,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -29711,6 +29819,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29849,9 +29969,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29943,12 +30060,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -31401,33 +31527,81 @@ msgstr "Complementu Proj4J"
 msgid "Code"
 msgstr "Códigu"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31834,6 +32008,12 @@ msgstr "Afitar funciones de los miembros de la relación escoyíos"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completar multipolígonu pa la vía {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Atopóse un nodo ensin el rol ''house''"
 
@@ -33655,12 +33835,6 @@ msgstr "Borra''l miembru de la restricción de xiru"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Camude al Editor Básicu y escueya una vía"
 
-msgid "Undelete object..."
-msgstr "Recuperar oxetu..."
-
-msgid "Undelete object by id"
-msgstr "Recuperar oxetu per id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Nun se pudo recuperar el nodo {0}. Seguramente l`oxetu fora desaniciáu"
@@ -33673,6 +33847,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "nun se pudo recuperar la relación {0}. Seguramente foi desaniciáu l`oxetu."
 
+msgid "Undelete object..."
+msgstr "Recuperar oxetu..."
+
+msgid "Undelete object by id"
+msgstr "Recuperar oxetu per id"
+
 msgid "Undelete Object"
 msgstr "Recuperar oxetu borráu"
 
@@ -34405,6 +34585,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Añedir nomes dende Wikipedia"
 
@@ -34443,11 +34629,14 @@ msgstr "Disponible nel conxuntu de datos local"
 msgid "Not linked yet"
 msgstr "non enllazáu entá"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Llogra toles coordenaes de Wikipedia pa la vista actual"
diff --git a/i18n/po/az.po b/i18n/po/az.po
index 6411b83..792fb08 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2013-01-12 17:56+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: 2016-06-05 04:33+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:34+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/be.po b/i18n/po/be.po
index 415d3d7..7ecdfde 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-05-20 17:19+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-17 12:12+0000\n"
 "Last-Translator: Viktar Palstsiuk <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: 2016-06-05 04:34+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:35+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: be\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2868,15 +2868,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "аб’екты (і ўсе іх пункты/ўдзельнікі дачынення) у запампаванай вобласці"
 
-msgid "Searching"
-msgstr "Пошук"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Пошук у {0} аб''екце"
-msgstr[1] "Пошук у {0} аб''ектах"
-msgstr[2] "Пошук у {0} аб''ектах"
-
 msgid "No match found for ''{0}''"
 msgstr "Не знойдзена супадзенняў для ''{0}''"
 
@@ -2892,6 +2883,15 @@ msgstr "Нічога не знойдзена ў вылучаным, пры по
 msgid "Found {0} matches"
 msgstr "Знойдзена {0} супадзенняў"
 
+msgid "Searching"
+msgstr "Пошук"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Пошук у {0} аб''екце"
+msgstr[1] "Пошук у {0} аб''ектах"
+msgstr[2] "Пошук у {0} аб''ектах"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4292,9 +4292,6 @@ msgstr "Інтэрнэт-тэгі"
 msgid "Checks for errors in internet-related tags."
 msgstr "Праверка на памылкі ў тэгах, злучаных з Інтэрнэтам."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Не атрымалася пераўтварыць URL у ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9947,8 +9944,8 @@ msgstr "наблізьце для загрузкі квадратаў"
 msgid "zoom in to load more tiles"
 msgstr "наблізьце для загрузкі дадатковых квадратаў"
 
-msgid "increase zoom level to see more detail"
-msgstr "павялічце маштаб для лепшай дэталізацыі"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Няма квадратаў на дадзеным маштабе"
@@ -16267,6 +16264,9 @@ msgstr "Strava цеплавая велакарта"
 msgid "Strava running heatmap"
 msgstr "Strava цеплавая карта бегуноў"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "MapBox Locator (аверлэй)"
 
@@ -16427,7 +16427,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC аўтобусныя маршруты (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Бенін: Катану, Pleiade 2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Карта гарадскіх раёнаў"
@@ -16507,8 +16507,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Карфаген"
 
-msgid "BD Ortho"
-msgstr ""
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Бардо - 2012"
@@ -17522,6 +17522,9 @@ msgstr ""
 "Кантактуйце з іншымі ўдзельнікамі, якія працуюць з картай побач з вамі, "
 "атрымлівайце абвесткі, калі хто-то з’яўляецца побач."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17658,6 +17661,7 @@ msgstr ""
 
 msgid "Allows the user to work with pictures hosted at mapillary.com"
 msgstr ""
+"Дазваляе карыстальнікам працаваць з выявамі, размешчанымі на mapillary.com"
 
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
@@ -17772,6 +17776,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Забяспечвае праверку і выпраўленне маршрутаў грамадскага транспарта ў "
+"адпаведнасці з версіяй 2 схемы грамадскага транспарта"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -17973,10 +17979,10 @@ msgid "concrete"
 msgstr "бетон"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "бетонныя пліты (суцэльныя)"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "бетонныя пліты (каляіна)"
 
 msgid "paving_stones"
 msgstr "ходнікавая плітка"
@@ -19411,18 +19417,36 @@ msgstr "Узровень праходнасці"
 msgid "grade1"
 msgstr "тып 1 (з пакрыццём)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Цвёрдая: асфальт ці старанна ўшчыльнены цвёрды матэрыял"
+
 msgid "grade2"
 msgstr "тып 2 (жвір, утрамбаваны грунт)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+"Пераважна цвёрдая: жвір ці камяні ў сумесі з якім-небудзь мяккім матэрыялам"
+
 msgid "grade3"
 msgstr "тып 3 (жвір з пяском (не ўтрамбаваны))"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Сумесь цвёрдых і мяккіх матэрыялаў у роўнай прапорцыі"
+
 msgid "grade4"
 msgstr "тып 4 (грунт)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+"Пераважна мяккая: грунт/пясок/трава ў сумесі з якім-небудзь цвёрдым "
+"матэрыялам"
+
 msgid "grade5"
 msgstr "тып 5 (пясок, трава)"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Мяккая: грунт/пясок/трава"
+
 msgid "MTB Scale"
 msgstr "Шкала MTB"
 
@@ -20631,6 +20655,72 @@ msgstr "Напружанне"
 msgid "Amperage"
 msgstr "Сіла току"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Тыпы транспарта, якія можна зарадзіць:"
+
+msgid "Scooter"
+msgstr "Скутар"
+
+msgid "Truck"
+msgstr "Грузавік"
+
+msgid "Number of Sockets:"
+msgstr "Колькасць гнёздаў:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE сіні"
+
+msgid "CEE red 16A"
+msgstr "CEE чырвоны 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE чырвоны 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Ідэнтыфікацыя:"
+
+msgid "Phone call"
+msgstr "Тэлефанаванне"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Членская карта"
+
 msgid "Wash"
 msgstr "Аўтамыйка"
 
@@ -20836,9 +20926,6 @@ msgstr "Трамвайны прыпынак (састарэлае)"
 msgid "Train"
 msgstr "Цягнік"
 
-msgid "Railway station (legacy)"
-msgstr "Чыгуначная станцыя (састарэлы фармат)"
-
 msgid "Railway halt (legacy)"
 msgstr "Прыпынкавы пункт (састарэлае)"
 
@@ -20863,15 +20950,6 @@ msgstr "Падстрэшак"
 msgid "Waste Basket/Trash Can"
 msgstr "Сметніца"
 
-msgid "Highway platform (legacy)"
-msgstr "Прыпынак на дарозе (састарэлае)"
-
-msgid "Railway platform (legacy)"
-msgstr "Чыгуначная платформа (састарэлы фармат)"
-
-msgid "funicular"
-msgstr "фунікулёр"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Станцыя"
@@ -24663,9 +24741,6 @@ msgstr "Дрэва"
 msgid "A single tree."
 msgstr "Асобнае дрэва."
 
-msgid "Botanical Name"
-msgstr "Навуковая назва"
-
 msgid "Tree Row"
 msgstr "Лінія дрэў"
 
@@ -25718,6 +25793,21 @@ msgstr "{0} і {1} разам з {2} і значэннямі, якія канф
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Падазронае спалучэнне тэгаў: {0} і {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} на дачыненні без {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} састарэлы"
 
@@ -25893,6 +25983,9 @@ msgstr ""
 "Водны шлях сканчаецца без злучэння з іншым водным шляхам ці ў яго памылковы "
 "кірунак."
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "скарочанае пазначэнне вуліцы"
 
@@ -26290,6 +26383,9 @@ msgstr "Паказаць пласт сеткі вышынь"
 msgid "Elevation Grid"
 msgstr "Сетка вышынь"
 
+msgid "increase zoom level to see more detail"
+msgstr "павялічце маштаб для лепшай дэталізацыі"
+
 msgid "No SRTM data"
 msgstr "Няма дадзеных SRTM"
 
@@ -28380,15 +28476,15 @@ msgstr "паміж {0} {1} і {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  дадаць {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Пласт для рэдагавання GPX трэкаў"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Пераўтварыць у GPX пласт з абезасобленым часам"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "Правіць GPX трэкі"
 
@@ -28512,6 +28608,18 @@ msgstr "Ачысціць часопіс"
 msgid "Show users on map"
 msgstr "Паказаць карыстальнікаў на карце"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Толькі становішча"
 
@@ -29257,9 +29365,6 @@ msgstr "Паказаць фатаграфіі, якія не маюць каар
 msgid "Imported Images"
 msgstr "Імпартаваныя малюнкі"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Файлы малюнкаў (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Імпарт вектарнай графікі"
 
@@ -29817,6 +29922,15 @@ msgstr "Злучыць/раз''яднаць выявы"
 msgid "Join Mapillary pictures"
 msgstr "Злучыць выявы Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Адаслаць выявы"
 
@@ -29856,6 +29970,18 @@ msgstr "Капіяваць тэг"
 msgid "Edit on website"
 msgstr "Рэдагаваць на сайце"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Экспартаваць ўсе здымкі"
 
@@ -29994,9 +30120,6 @@ msgstr "Прыпыніць"
 msgid "Pauses the walk."
 msgstr "Прыпыніць шпацыр."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Памяняць размяшчэнне кнопак пры паказе выяваў."
-
 msgid "Display hour when the picture was taken"
 msgstr "Паказваць час, калі быў зроблены здымак"
 
@@ -30008,7 +30131,7 @@ msgstr ""
 "Перамяшчацца да месцазнаходжання выявы пры націсканні кнопкак наперад/назад"
 
 msgid "Preview images when hovering its icon"
-msgstr ""
+msgstr "Перадпрагляд выявы пры навядзенні на яго значок"
 
 msgid "Download mode"
 msgstr "Рэжым спампоўкі"
@@ -30095,12 +30218,21 @@ msgstr "Загрузка здымкаў Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Усяго здымкаў Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Выявы не знойдзеныя"
 
 msgid "Finished upload"
 msgstr "Адсылка скончана"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Адсылаецца: {0}"
 
@@ -31537,33 +31669,81 @@ msgstr "Модуль Proj4J"
 msgid "Code"
 msgstr "Код"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Запомніць мой выбар і больш не пытаць у гэтым сеансе"
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31970,6 +32150,12 @@ msgstr "Выправіць ролі членаў выбарнага дачыне
 msgid "Complete multipolygon for way {0}"
 msgstr "Замкнуць мультыпалігон для лініі {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Знойдзены пункт без ролі ''house''"
 
@@ -32672,13 +32858,13 @@ msgid "Tool:To-fix"
 msgstr "Інструмент: To-fix"
 
 msgid "Enable Tofix plugin"
-msgstr ""
+msgstr "Уключыць модуль Tofix"
 
 msgid "Auto delete layer"
-msgstr ""
+msgstr "Аўтаматычнае выдаленне пласта"
 
 msgid "Select the checkbox to:"
-msgstr ""
+msgstr "Адзначце патрэбныя опцыі:"
 
 msgid "Skip"
 msgstr "Прапусціць"
@@ -32696,10 +32882,10 @@ msgid "Not an error"
 msgstr "Не памылка"
 
 msgid "<html><a href=\"\">List of tasks</a></html>"
-msgstr ""
+msgstr "<html><a href=\"\">Спіс заданняў</a></html>"
 
 msgid "Select a task ..."
-msgstr ""
+msgstr "Выберыце заданне..."
 
 msgid "Set download area (m²)"
 msgstr "Задайце вобласць запампоўкі (м²)"
@@ -32708,13 +32894,13 @@ msgid "~.02"
 msgstr "~.02"
 
 msgid "Tasks"
-msgstr ""
+msgstr "Заданні"
 
 msgid "Config"
-msgstr ""
+msgstr "Канфіг"
 
 msgid "Activation"
-msgstr ""
+msgstr "Актывацыя"
 
 msgid "tofix:Skip item"
 msgstr "tofix:Прапусціць элемент"
@@ -32726,7 +32912,7 @@ msgid "tofix:Not a Error item"
 msgstr "tofix:Не памылковы элемент"
 
 msgid "Activate to-fix plugin."
-msgstr ""
+msgstr "Уключыць модуль to-fix"
 
 msgid "Maintenance server"
 msgstr "Сервер на абслугоўванні"
@@ -33798,12 +33984,6 @@ msgstr "Выдаліць ўдзельніка з абмежавання на п
 msgid "Change to the Basic Editor and select a way"
 msgstr "Перайсці да Асноўнага рэдактара і вылучыць лінію"
 
-msgid "Undelete object..."
-msgstr "Аднавіць аб’ект..."
-
-msgid "Undelete object by id"
-msgstr "Аднавіць аб’ект па id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Не атрымалася аднавіць пункт {0}. Аб’ект, верагодна, быў адрэдагаваны"
@@ -33816,6 +33996,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Не атрымалася аднавіць дачыненне {0}. Аб’ект, верагодна, быў адрэдагаваны"
 
+msgid "Undelete object..."
+msgstr "Аднавіць аб’ект..."
+
+msgid "Undelete object by id"
+msgstr "Аднавіць аб’ект па id"
+
 msgid "Undelete Object"
 msgstr "Аднавіць аб’ект"
 
@@ -34551,6 +34737,12 @@ msgstr[0] "Перазапісаць ''{0}'' тэг {1} з {2} новым зна
 msgstr[1] "Перазапісаць ''{0}'' тэгі {1} з {2} новым значэннем ''{3}''?"
 msgstr[2] "Перазапісаць ''{0}'' тэгаў {1} з {2} новым значэннем ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Дадаць назвы з Вікіпедыі"
 
@@ -34589,11 +34781,14 @@ msgstr "Даступна ў лакальным наборы дадзеных"
 msgid "Not linked yet"
 msgstr "Спасылка яшчэ не створана"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/bg.po b/i18n/po/bg.po
index 649503a..a4222e8 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-05-28 11:14+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: 2016-06-05 04:36+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:37+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: bg\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2732,14 +2732,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Не е намерено съвпадение за ''{0}''"
 
@@ -2756,6 +2748,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Намерени са {0} съвпадения"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4052,9 +4052,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9189,7 +9186,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14838,6 +14835,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -15078,7 +15078,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16060,6 +16060,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17856,18 +17859,33 @@ msgstr ""
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -19057,6 +19075,72 @@ msgstr "Волтаж"
 msgid "Amperage"
 msgstr "Ампераж"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Автомивка"
 
@@ -19261,9 +19345,6 @@ msgstr "Трамвайна спирка (старо обозначение)"
 msgid "Train"
 msgstr "Влак"
 
-msgid "Railway station (legacy)"
-msgstr "ЖП гара (старо обозначение)"
-
 msgid "Railway halt (legacy)"
 msgstr "ЖП спирка (старо обозначение)"
 
@@ -19288,15 +19369,6 @@ msgstr "Навес"
 msgid "Waste Basket/Trash Can"
 msgstr "Кошче за отпадъци"
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Гара / Спирка"
@@ -23083,9 +23155,6 @@ msgstr "Дърво"
 msgid "A single tree."
 msgstr "Дърво"
 
-msgid "Botanical Name"
-msgstr "Ботаническо название"
-
 msgid "Tree Row"
 msgstr "Редица дървета"
 
@@ -24124,6 +24193,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} е остаряло"
 
@@ -24276,6 +24360,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "съкратено име на улица"
 
@@ -24650,6 +24737,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26540,15 +26630,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr "Редактиране GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Слой за редактиране на GPX следи"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Преобразуване към GPX слой с анонимно време"
 
-msgid "EditGpx"
-msgstr "Редактиране GPX"
-
 msgid "edit gpx tracks"
 msgstr "редактиране gpx следи"
 
@@ -26668,6 +26758,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Само позиция"
 
@@ -27367,9 +27469,6 @@ msgstr "Показване на не-геомаркирани фотографи
 msgid "Imported Images"
 msgstr "Импортирани изображения"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Файлове с изображения (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27915,6 +28014,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27954,6 +28062,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28092,9 +28212,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28186,12 +28303,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29556,33 +29682,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29982,6 +30156,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31648,19 +31828,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32316,6 +32496,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32348,11 +32534,14 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/bn.po b/i18n/po/bn.po
index 3e19843..2a033dc 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:35+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:36+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: bn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2619,14 +2619,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2642,6 +2634,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3909,9 +3909,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8997,7 +8994,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14557,6 +14554,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14797,7 +14797,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15775,6 +15775,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17558,18 +17561,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18759,6 +18777,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18963,9 +19047,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18990,15 +19071,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22785,9 +22857,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23824,6 +23893,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23976,6 +24060,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24348,6 +24435,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26215,13 +26305,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26343,6 +26433,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27039,9 +27141,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27573,6 +27672,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27612,6 +27720,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27750,9 +27870,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27844,12 +27961,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29206,33 +29332,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29632,6 +29806,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31293,19 +31473,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31961,6 +32141,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31993,10 +32179,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/br.po b/i18n/po/br.po
index 81ed018..b986edb 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:36+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:37+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: br\n"
 
 msgid "License"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/bs.po b/i18n/po/bs.po
index 4517a02..1307b3d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:35+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:36+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: bs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2619,14 +2619,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2642,6 +2634,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3909,9 +3909,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8997,7 +8994,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14557,6 +14554,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14797,7 +14797,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15775,6 +15775,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17558,18 +17561,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18759,6 +18777,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18963,9 +19047,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18990,15 +19071,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22785,9 +22857,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23824,6 +23893,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23976,6 +24060,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24348,6 +24435,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26215,13 +26305,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26343,6 +26433,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27039,9 +27141,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27573,6 +27672,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27612,6 +27720,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27750,9 +27870,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27844,12 +27961,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29206,33 +29332,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29632,6 +29806,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31293,19 +31473,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31961,6 +32141,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31993,10 +32179,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ca.po b/i18n/po/ca.po
index 1e96e0c..a2590f2 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-04-05 12:55+0000\n"
 "Last-Translator: pitort <pitort at eclipso.eu>\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: 2016-06-05 04:37+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:38+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ca\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2856,14 +2856,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objectes (i tots els seus nodes / membres de relació) a la zona telecarregada"
 
-msgid "Searching"
-msgstr "Cercant"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Cercant en {0} objecte"
-msgstr[1] "cercant en {0} objectes"
-
 msgid "No match found for ''{0}''"
 msgstr "No s''ha trobat cap resultat per ''{0}''"
 
@@ -2879,6 +2871,14 @@ msgstr "Res ha estat trobat a la selecció en cercar per ''{0}''"
 msgid "Found {0} matches"
 msgstr "S''han trobat {0} coincidències"
 
+msgid "Searching"
+msgstr "Cercant"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Cercant en {0} objecte"
+msgstr[1] "cercant en {0} objectes"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4287,9 +4287,6 @@ msgstr "Etiquetes d''Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Verifica si hi ha errors a les etiquetes relacionades amb Internet"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " l''URL no pot ser convertida a ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9920,8 +9917,8 @@ msgstr "amplia per carregar cada tessel·la"
 msgid "zoom in to load more tiles"
 msgstr "amplia per carregar més tessel·les"
 
-msgid "increase zoom level to see more detail"
-msgstr "incrementa el nivell d''ampliació per veure més detalls"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "No hi ha tessel·les en aquest nivell d''ampliació"
@@ -16265,6 +16262,9 @@ msgstr "Mapa ciclista Strava"
 msgid "Strava running heatmap"
 msgstr "Mapa de curses Strava"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -16505,7 +16505,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17523,6 +17523,9 @@ msgstr ""
 "Parleu amb els usuaris que fan modificacions del mapa a prop vostre, sereu "
 "avisats quan algú tanqui la seva sessió."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19414,18 +19417,33 @@ msgstr "Tipus de pista o camí rural"
 msgid "grade1"
 msgstr "grau1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grau2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grau3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grau4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grau5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala BTT"
 
@@ -20639,6 +20657,72 @@ msgstr "Tensió"
 msgid "Amperage"
 msgstr "Amperatge"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Rentat"
 
@@ -20845,9 +20929,6 @@ msgstr "Parada de tramvia (antiga)"
 msgid "Train"
 msgstr "Tren"
 
-msgid "Railway station (legacy)"
-msgstr "Estació de tren (antiga)"
-
 msgid "Railway halt (legacy)"
 msgstr "Baixador de tren (antic)"
 
@@ -20872,15 +20953,6 @@ msgstr "Refugi"
 msgid "Waste Basket/Trash Can"
 msgstr "Paperera"
 
-msgid "Highway platform (legacy)"
-msgstr "Andana de carretera (antiga)"
-
-msgid "Railway platform (legacy)"
-msgstr "Andana de ferrocarril (antiga)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estació"
@@ -24675,9 +24747,6 @@ msgstr "Arbre"
 msgid "A single tree."
 msgstr "Arbre aïllat"
 
-msgid "Botanical Name"
-msgstr "Nom botànic"
-
 msgid "Tree Row"
 msgstr "Arbreda"
 
@@ -25731,6 +25800,21 @@ msgstr "{0} i {1} junt amb {2} i valors conflictius"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Combinació sospitosa d''etiquetes: {0} i {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} és obsolet"
 
@@ -25901,6 +25985,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nom abreviat del carrer"
 
@@ -26298,6 +26385,9 @@ msgstr "Mostra la capa de la graella d''altitud"
 msgid "Elevation Grid"
 msgstr "Graella d''altitud"
 
+msgid "increase zoom level to see more detail"
+msgstr "incrementa el nivell d''ampliació per veure més detalls"
+
 msgid "No SRTM data"
 msgstr "Cap dada de tipus SRTM"
 
@@ -28406,15 +28496,15 @@ msgstr "entre {0} {1} i {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  afegint {0} {1}"
 
+msgid "EditGpx"
+msgstr "Modificar GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Capa per modificar tracks GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir a capa GPX amb data i hora anònims"
 
-msgid "EditGpx"
-msgstr "Modificar GPX"
-
 msgid "edit gpx tracks"
 msgstr "modificar tracks GPX"
 
@@ -28539,6 +28629,18 @@ msgstr "Neteja el registre"
 msgid "Show users on map"
 msgstr "Mostra usuaris sobre el mapa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Només posició"
 
@@ -29303,9 +29405,6 @@ msgstr "Mostra les fotografies no georeferenciades"
 msgid "Imported Images"
 msgstr "Imatges importades"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Fitxers d''imatge (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importa gràfics vectorials"
 
@@ -29871,6 +29970,15 @@ msgstr "Afegeix/treu fotografies"
 msgid "Join Mapillary pictures"
 msgstr "Afegeix fotografies de Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Puja fotografies"
 
@@ -29910,6 +30018,18 @@ msgstr "Copia l''etiqueta de la clau"
 msgid "Edit on website"
 msgstr "Modifica al lloc web"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exporta totes les imatges"
 
@@ -30048,9 +30168,6 @@ msgstr "Pausa"
 msgid "Pauses the walk."
 msgstr "Posa en pausa la caminada."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Inverteix la posició dels botons quan es visualitzin les imatges."
-
 msgid "Display hour when the picture was taken"
 msgstr "Mostra l''hora a la qual es van fer les fotografies"
 
@@ -30146,12 +30263,21 @@ msgstr "Descarregant imatges de Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Nombre total d''imatges de Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "No s''ha trobat cap imatge"
 
 msgid "Finished upload"
 msgstr "La pujada ha finalitzat"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Pujant: {0}"
 
@@ -31616,33 +31742,81 @@ msgstr "Connector Proj4J"
 msgid "Code"
 msgstr "Codi"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -32053,6 +32227,12 @@ msgstr "Corregir rols dels membres de la relació seleccionats"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completa el multipolígon per la via {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Trobat un node sense el rol ''house'' (casa)"
 
@@ -33887,12 +34067,6 @@ msgstr "Esborrar el membre de la prohibició de gir"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Canviar a l''editor bàsic i seleccionar una via"
 
-msgid "Undelete object..."
-msgstr "Recuperar un objecte esborrat ..."
-
-msgid "Undelete object by id"
-msgstr "Recuperar un objecte esborrat per ID"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "No és possible de suprimir el node {0}. Probablement l''objecte ha estat "
@@ -33908,6 +34082,12 @@ msgstr ""
 "No és possible de suprimir la relació {0}. Probablement l''objecte ha estat "
 "suprimit"
 
+msgid "Undelete object..."
+msgstr "Recuperar un objecte esborrat ..."
+
+msgid "Undelete object by id"
+msgstr "Recuperar un objecte esborrat per ID"
+
 msgid "Undelete Object"
 msgstr "Recuperar objecte esborrat"
 
@@ -34649,6 +34829,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] "Reescriu  ''{0}''etiqueta {1} de {2} amb el nou valor ''{3}''?"
 msgstr[1] "Reescriu  ''{0}''etiquetes {1} de {2} amb el nou valor ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Afegeix noms de la viquipèdia"
 
@@ -34687,11 +34873,14 @@ msgstr "Disponible al conjunt de dades local"
 msgid "Not linked yet"
 msgstr "No enllaçat encara"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Mostra les coordenades de la Viquipèdia a la vista actual"
diff --git a/i18n/po/ca at valencia.po b/i18n/po/ca at valencia.po
index dda62d7..8b31b9a 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:12+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:14+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ca at valencia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2816,14 +2816,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objectes (i tots els seus nodes / membres de relació) a la zona telecarregada"
 
-msgid "Searching"
-msgstr "Cercant"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "No s''ha trobat cap resultat per ''{0}''"
 
@@ -2839,6 +2831,14 @@ msgstr "Res ha estat trobat a la selecció en cercar per ''{0}''"
 msgid "Found {0} matches"
 msgstr "S''han trobat {0} coincidències"
 
+msgid "Searching"
+msgstr "Cercant"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4228,9 +4228,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9748,8 +9745,8 @@ msgstr "amplia per carregar cada tessel·la"
 msgid "zoom in to load more tiles"
 msgstr "amplia per carregar més tessel·les"
 
-msgid "increase zoom level to see more detail"
-msgstr "incrementa el nivell d''ampliació per veure més detalls"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "No hi ha tessel·les en este nivell d''ampliació"
@@ -16042,6 +16039,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -16282,7 +16282,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17284,6 +17284,9 @@ msgstr ""
 "Parleu amb els usuaris que fan modificacions del mapa a prop vostre, sereu "
 "avisats quan algú tanque la seua sessió."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19137,18 +19140,33 @@ msgstr "Tipus de pista o camí rural"
 msgid "grade1"
 msgstr "grau1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grau2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grau3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grau4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grau5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala BTT"
 
@@ -20353,6 +20371,72 @@ msgstr "Tensió"
 msgid "Amperage"
 msgstr "Amperatge"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Rentat"
 
@@ -20559,9 +20643,6 @@ msgstr "Parada de tramvia (antiga)"
 msgid "Train"
 msgstr "Tren"
 
-msgid "Railway station (legacy)"
-msgstr "Estació de tren (antiga)"
-
 msgid "Railway halt (legacy)"
 msgstr "Baixador de tren (antic)"
 
@@ -20586,15 +20667,6 @@ msgstr "Refugi"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr "Andana de carretera (antiga)"
-
-msgid "Railway platform (legacy)"
-msgstr "Andana de ferrocarril (antiga)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estació"
@@ -24381,9 +24453,6 @@ msgstr "Arbre"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Nom botànic"
-
 msgid "Tree Row"
 msgstr "Filera d''arbres"
 
@@ -25420,6 +25489,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} és obsolet"
 
@@ -25572,6 +25656,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nom abreviat del carrer"
 
@@ -25955,6 +26042,9 @@ msgstr "Mostra la capa de la graella d''elevació"
 msgid "Elevation Grid"
 msgstr "Graella d''elevació"
 
+msgid "increase zoom level to see more detail"
+msgstr "incrementa el nivell d''ampliació per veure més detalls"
+
 msgid "No SRTM data"
 msgstr "Cap dada de tipus SRTM"
 
@@ -28030,15 +28120,15 @@ msgstr "entre {0} {1} i {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  afegint {0} {1}"
 
+msgid "EditGpx"
+msgstr "Modificar GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Capa per modificar tracks GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir a capa GPX amb data i hora anònims"
 
-msgid "EditGpx"
-msgstr "Modificar GPX"
-
 msgid "edit gpx tracks"
 msgstr "modificar tracks GPX"
 
@@ -28163,6 +28253,18 @@ msgstr "Neteja el registre"
 msgid "Show users on map"
 msgstr "Mostra usuaris sobre el mapa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Només posició"
 
@@ -28925,9 +29027,6 @@ msgstr "Mostra les fotografies no georeferenciades"
 msgid "Imported Images"
 msgstr "Imatges importades"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Fitxers d''imatge (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importa gràfics vectorials"
 
@@ -29493,6 +29592,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -29532,6 +29640,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29670,9 +29790,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29764,12 +29881,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -31231,33 +31357,81 @@ msgstr "Connector Proj4J"
 msgid "Code"
 msgstr "Codi"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31666,6 +31840,12 @@ msgstr "Corregir rols dels membres de la relació seleccionats"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completa el multipolígon per la via {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Trobat un node sense el rol ''house'' (casa)"
 
@@ -33490,12 +33670,6 @@ msgstr "Esborrar el membre de la prohibició de gir"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Canviar a l''editor bàsic i seleccionar una via"
 
-msgid "Undelete object..."
-msgstr "Recuperar un objecte esborrat ..."
-
-msgid "Undelete object by id"
-msgstr "Recuperar un objecte esborrat per ID"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -33505,6 +33679,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Recuperar un objecte esborrat ..."
+
+msgid "Undelete object by id"
+msgstr "Recuperar un objecte esborrat per ID"
+
 msgid "Undelete Object"
 msgstr "Recuperar objecte esborrat"
 
@@ -34246,6 +34426,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Afig noms de la viquipèdia"
 
@@ -34284,11 +34470,14 @@ msgstr "Disponible al conjunt de dades local"
 msgid "Not linked yet"
 msgstr "No enllaçat encara"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Mostra les coordenades de la Viquipèdia a la vista actual"
diff --git a/i18n/po/cs.po b/i18n/po/cs.po
index 50dff5f..fe87c20 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-03 10:22+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-29 09:45+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: 2016-06-05 04:37+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:38+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: cs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2845,15 +2845,6 @@ msgstr "objekty ve stažené oblasti"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "objekty (a všechny uzly cesty/členy relace) ve stažené oblasti"
 
-msgid "Searching"
-msgstr "Vyhledávám"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Prohledávám {0} objekt"
-msgstr[1] "Prohledávám {0} objekty"
-msgstr[2] "Prohledávám {0} objektů"
-
 msgid "No match found for ''{0}''"
 msgstr "Nebyly nalezeny záznamy pro \"{0}\""
 
@@ -2869,6 +2860,15 @@ msgstr "Ve výběru se nic nenašlo při hledání ''{0}''"
 msgid "Found {0} matches"
 msgstr "Nalezeno {0} odpovídajících výrazů"
 
+msgid "Searching"
+msgstr "Vyhledávám"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Prohledávám {0} objekt"
+msgstr[1] "Prohledávám {0} objekty"
+msgstr[2] "Prohledávám {0} objektů"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4265,9 +4265,6 @@ msgstr "Značky pro Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Kontroluje chyby v značkách sovisejících s Internetem."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL nelze převést do ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9837,8 +9834,10 @@ msgstr "přibližte pro nahrání dlaždic"
 msgid "zoom in to load more tiles"
 msgstr "přibližte pro nahrání více dlaždic"
 
-msgid "increase zoom level to see more detail"
-msgstr "zvětšete přiblížení, abyste viděli více detailů"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"zvětšit přiblížení dlaždic (změnit rozlišení), aby bylo vidět více "
+"podrobností"
 
 msgid "No tiles at this zoom level"
 msgstr "Na této úrovni zvětšení nejsou žádné dlaždice"
@@ -16089,6 +16088,9 @@ msgstr "Strava heatmap - jízda na kole"
 msgid "Strava running heatmap"
 msgstr "Strava heatmap - běh"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Překryvná vrstva Locator"
 
@@ -16249,7 +16251,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC bus lines (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin:cotonou_pleiade_2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -16329,8 +16331,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr "BD Ortho"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17343,6 +17345,9 @@ msgstr ""
 "Povídejte si s uživateli, kteří editují mapu poblíž místa, kde editujete vy. "
 "Budete upozorněni, když se někdo přiblíží."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Umožňuje zobrazit soubor GeoJSON jako vrstvu."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17784,10 +17789,10 @@ msgid "concrete"
 msgstr "beton"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "betonové panely"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "betonové pruhy"
 
 msgid "paving_stones"
 msgstr "(zámková) dlažba"
@@ -19222,18 +19227,33 @@ msgstr "Typ cesty"
 msgid "grade1"
 msgstr "stupeň 1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Pevné: zpevněný nebo velmi zhutněný tvrdý povrch"
+
 msgid "grade2"
 msgstr "stupeň 2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "Většinou pevné: štěrk/kámen s přidanými měkkými materiály"
+
 msgid "grade3"
 msgstr "stupeň 3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Směs měkkých a tvrdých materiálů"
+
 msgid "grade4"
 msgstr "stupeň 4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "Většinou měkké: půda/písek/tráva s přidanými tvrdými materiály"
+
 msgid "grade5"
 msgstr "stupeň 5"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Měkké: půda/písek/tráva"
+
 msgid "MTB Scale"
 msgstr "MTB klasifikace"
 
@@ -20442,6 +20462,72 @@ msgstr "Napětí"
 msgid "Amperage"
 msgstr "Proud"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Typy vozidel, které lze dobíjet:"
+
+msgid "Scooter"
+msgstr "Skútr"
+
+msgid "Truck"
+msgstr "Nákladní auto"
+
+msgid "Number of Sockets:"
+msgstr "Počet zásuvek"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE modrá"
+
+msgid "CEE red 16A"
+msgstr "CEE červená 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE červená 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Autentifikace:"
+
+msgid "Phone call"
+msgstr "Telefonní volání"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Členská karta"
+
 msgid "Wash"
 msgstr "Myčka"
 
@@ -20646,9 +20732,6 @@ msgstr "Tramvajová zastávka (původní)"
 msgid "Train"
 msgstr "Vlak"
 
-msgid "Railway station (legacy)"
-msgstr "Vlakové nádraží (původní)"
-
 msgid "Railway halt (legacy)"
 msgstr "Vlaková zastávka (původní)"
 
@@ -20673,15 +20756,6 @@ msgstr "Přístřešek"
 msgid "Waste Basket/Trash Can"
 msgstr "Odpadkový koš"
 
-msgid "Highway platform (legacy)"
-msgstr "Autobusové nástupiště (zastaralé)"
-
-msgid "Railway platform (legacy)"
-msgstr "Vlakové nástupiště (zastaralé)"
-
-msgid "funicular"
-msgstr "pozemní lanovka"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Vlaková stanice"
@@ -24473,9 +24547,6 @@ msgstr "Strom"
 msgid "A single tree."
 msgstr "Jeden strom."
 
-msgid "Botanical Name"
-msgstr "Botanické jméno"
-
 msgid "Tree Row"
 msgstr "Stromořadí"
 
@@ -25527,6 +25598,27 @@ msgstr "{0} a {1} spolu s {2} a konfliktními hodnotami"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Podezřelá kombinace značek: {0} a {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} na relaci bez {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Dlouhý vodní tok s {0}, ale bez značky která by ho definovala jako tunel "
+"nebo podzemní. Odstraňte {1}, nebo přidejte značku tunelu, pokud tam je. "
+"Také zkontrolujte mosty a jejich značky {1}."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Krátký vodní tok s {0}, ale bez značky která by ho definovala jako tunel "
+"nebo podzemní. Odstraňte {1}, nebo přidejte značku tunelu, pokud tam je. "
+"Také zkontrolujte mosty a jejich značky {1}."
+
 msgid "{0} is deprecated"
 msgstr "{0} je zavržen"
 
@@ -25696,6 +25788,9 @@ msgstr ""
 "Vodní cesta končí bez připojení na jinou vodní cestu, nebo je špatně směr "
 "vodního toku."
 
+msgid "Coastline inside {1}"
+msgstr "Linie pobřeží uvnitř {1}"
+
 msgid "abbreviated street name"
 msgstr "zkrácený název ulice"
 
@@ -26091,6 +26186,9 @@ msgstr "Zobrazit vrstvu výškového modelu terénu"
 msgid "Elevation Grid"
 msgstr "Model terénu"
 
+msgid "increase zoom level to see more detail"
+msgstr "zvětšete přiblížení, abyste viděli více detailů"
+
 msgid "No SRTM data"
 msgstr "Nejsou žádná SRTM data"
 
@@ -28172,15 +28270,15 @@ msgstr "mezi {0} {1} a {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  přidávám {0} {1}"
 
+msgid "EditGpx"
+msgstr "UpravitGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Vrstva pro editaci GPX tras"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Konvertovat do GPX vrstvy s anonymizací času"
 
-msgid "EditGpx"
-msgstr "UpravitGpx"
-
 msgid "edit gpx tracks"
 msgstr "Upravit trasu GPX"
 
@@ -28304,6 +28402,18 @@ msgstr "Vymazat záznam"
 msgid "Show users on map"
 msgstr "Ukazovat uživatele na mapě"
 
+msgid "GeoJSON file"
+msgstr "Soubor GeoJSON"
+
+msgid "Loading json file..."
+msgstr "Načítám soubor json..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Datové vrstvy z GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Chyba při nahrávání souboru geojson {0}"
+
 msgid "Position only"
 msgstr "Jen pozice"
 
@@ -29061,9 +29171,6 @@ msgstr "Zobrazit fotografie bez GPS souřadnic"
 msgid "Imported Images"
 msgstr "Importované obrázky"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Obrázky (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Import vektorové kresby"
 
@@ -29625,6 +29732,15 @@ msgstr "Sloučit/rozdělit obrázky"
 msgid "Join Mapillary pictures"
 msgstr "Sloučit obrázky Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Nahrát obrázky na server"
 
@@ -29664,6 +29780,18 @@ msgstr "Kopírovat hodnotu klíče"
 msgid "Edit on website"
 msgstr "Upravit na webu"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exportovat všechny obrázky"
 
@@ -29802,9 +29930,6 @@ msgstr "Pozastavit"
 msgid "Pauses the walk."
 msgstr "Pozastaví průchod."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Obrátit při zobrazování obrázků polohu tlačítek."
-
 msgid "Display hour when the picture was taken"
 msgstr "Zobrazit hodinu, kdy byl obrázek pořízen"
 
@@ -29902,12 +30027,21 @@ msgstr "Stáhnout obrázky z Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Celkem obrázků z Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Nebyly nalezeny žádné obrázky"
 
 msgid "Finished upload"
 msgstr "Nahrávání na server dokončeno"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Nahrávám na server: {0}"
 
@@ -31340,34 +31474,90 @@ msgstr "Doplněk Proj4J"
 msgid "Code"
 msgstr "Kód"
 
-msgid "Gaps"
-msgstr "Mezery"
+msgid "Add stop position"
+msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
-msgstr "Kontroluje, zda jsou v relaci route mezery."
+msgid "Do you want to download referrers of platforms and stop positions?"
+msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
-msgstr "VD: Trasa obsahuje mezeru, kterou lze zcelit seřazením."
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Pamatuj si moje volbu a při tomto sezení se již neptej"
+
+msgid "PT_Assistant Fetch Request"
+msgstr "PT_Assistant Požadavek na čtení"
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Relace route má nekompletní členy.\n"
+"Před pokračováním kontroly musí být staženy.\n"
+"Chcete je stáhnout?"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
+"Doplněk PT_Assistant zjistil, že tato relace (id={0}) obsahuje chyby:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} směrová chyba"
+msgstr[1] "{0} směrové chyby"
+msgstr[2] "{0} směrových chyb"
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} chyba typu silnice"
+msgstr[1] "{0} chyby typu silnice"
+msgstr[2] "{0} chyb typu silnice"
+
+msgid "How do you want to proceed?"
+msgstr "Jak chcete pokračovat?"
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
+msgstr "PT_Assistant Požadavek na pokračování"
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
-msgstr "Nejprve nástupiště"
+msgid "PT: Platform should not be part of a way"
+msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
-msgstr "Kontroluje, zda nástupiště jsou uvedeny v relaci route před cestami."
+msgid "Public Transport Assistant tests"
+msgstr "Public Transport Assistant testy"
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
-msgstr "VD: relace route v seznamu členů obsahuje cesty před nástupišti"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+"Kontroluje, zda relace route jsou kompatibilní se schématem veřejné dopravy "
+"verze 2"
+
+msgid "Fix error"
+msgstr "Opravit chybu"
+
+msgid "PT: dummy test warning"
+msgstr "VD: varování testovacího testu"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "VD: Trasa obsahuje mezeru, kterou lze zcelit seřazením."
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "VD: Role členů relace neodpovídají značkám"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "VD: Trasa by měla začínat a končit stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "VD: První nebo poslední cesta by měla být rozdělena"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr "VD: Typ trasy neodpovídá typu silnice, po které vede"
+
+msgid "PT: Road is under construction"
+msgstr "VD: Silnice je ve výstavbě"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr ""
 
 msgid "Can''t parse a time from this string."
 msgstr "Z tohoto řetězce nemohu načíst čas"
@@ -31770,6 +31960,12 @@ msgstr "Opravit úlohy vybraných členů relace"
 msgid "Complete multipolygon for way {0}"
 msgstr "Dokončit multipolygon u cesty {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Dva kruhy jsou shodné a k tomu nesmí dojít."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolygon z kruhů"
+
 msgid "Node without ''house'' role found"
 msgstr "Nalezen uzel bez role ''house''"
 
@@ -33583,12 +33779,6 @@ msgstr "Vymazat člen ze zákazu odbočení"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Přejít do základního editoru a vybrat cestu"
 
-msgid "Undelete object..."
-msgstr "Obnovit objekt..."
-
-msgid "Undelete object by id"
-msgstr "Obnovit smazané objekty podle jejich id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr "Nelze obnovit uzel {0}. Uzel byl patrně již pozměněn."
 
@@ -33598,6 +33788,12 @@ msgstr "Nelze obnovit cestu {0}. Cesta byla patrně již pozměněna."
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr "Nelze obnovit relaci {0}. Relace byla patrně již pozměněna."
 
+msgid "Undelete object..."
+msgstr "Obnovit objekt..."
+
+msgid "Undelete object by id"
+msgstr "Obnovit smazané objekty podle jejich id"
+
 msgid "Undelete Object"
 msgstr "Obnovit smazaný objekt"
 
@@ -34323,6 +34519,12 @@ msgstr[0] "Přepsat ''{0}'' značku {1} z {2} na novou hodnotu ''{3}''?"
 msgstr[1] "Přepsat ''{0}'' značky {1} z {2} na novou hodnotu ''{3}''?"
 msgstr[2] "Přepsat ''{0}'' značek {1} z {2} na novou hodnotu ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Přidat názvy z Wikipedie"
 
@@ -34361,11 +34563,14 @@ msgstr "Dostupné v místní datové sadě"
 msgid "Not linked yet"
 msgstr "Ještě nepropojeno"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Načte všechny souřadnice z Wikipedie pro aktuálně zobrazenou oblast"
diff --git a/i18n/po/cy.po b/i18n/po/cy.po
index a4ad47e..39c12c3 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:07+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:09+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: cy\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2617,14 +2617,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2640,6 +2632,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3907,9 +3907,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8995,7 +8992,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14555,6 +14552,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14795,7 +14795,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15773,6 +15773,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17556,18 +17559,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18757,6 +18775,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18961,9 +19045,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18988,15 +19069,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22783,9 +22855,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23822,6 +23891,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23974,6 +24058,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24346,6 +24433,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26213,13 +26303,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26341,6 +26431,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27037,9 +27139,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27571,6 +27670,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27610,6 +27718,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27748,9 +27868,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27842,12 +27959,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29204,33 +29330,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29630,6 +29804,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31291,19 +31471,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31959,6 +32139,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31991,10 +32177,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/da.po b/i18n/po/da.po
index f9435e8..4f80a4c 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-04 09:51+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-11 18:45+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: 2016-06-05 04:38+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:39+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: da_DK\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
@@ -2813,14 +2813,6 @@ msgstr ""
 "objekter (og alle det vej-punkter / relations medlemmer) i det downloadede "
 "område"
 
-msgid "Searching"
-msgstr "Søger"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Søger i {0} objekt"
-msgstr[1] "Søger i {0} objekter"
-
 msgid "No match found for ''{0}''"
 msgstr "Intet resultat for \"{0}\""
 
@@ -2836,6 +2828,14 @@ msgstr "Intet fundet i markering ved søgning efter \"{0}\""
 msgid "Found {0} matches"
 msgstr "Fandt {0} resultater"
 
+msgid "Searching"
+msgstr "Søger"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Søger i {0} objekt"
+msgstr[1] "Søger i {0} objekter"
+
 msgctxt "search"
 msgid "CS"
 msgstr "Versalfølsom"
@@ -4057,7 +4057,7 @@ msgid "This test checks that coastlines are correct."
 msgstr "Denne test tjekker om kystlinjer er korrekte."
 
 msgid "Unconnected coastline"
-msgstr "Ikkeforbundne kystlinier"
+msgstr "Uforbunden kystlinje"
 
 msgid "Unordered coastline"
 msgstr "Uordnet kystlinje"
@@ -4214,9 +4214,6 @@ msgstr "Internet tags"
 msgid "Checks for errors in internet-related tags."
 msgstr "Kontrollerer for fejl i internet relaterede tags."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL kan ikke konverteres til ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9728,8 +9725,9 @@ msgstr "zoom ind for at indlæse nogle tern"
 msgid "zoom in to load more tiles"
 msgstr "zoom ind for at indlæse flere tern"
 
-msgid "increase zoom level to see more detail"
-msgstr "forøg zoomniveau for at se flere detaljer"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"forøg tern zoomniveau (ændring af opløsning) for at se flere detaljer"
 
 msgid "No tiles at this zoom level"
 msgstr "Ingen tern på dette zoom niveau"
@@ -15921,6 +15919,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr "Strava both heatmap"
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -16161,8 +16162,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr "BD Ortho"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17179,6 +17180,9 @@ msgstr ""
 "Tal med brugere der rediger kortet i nærheden, få besked når nogen kommer "
 "tæt på."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Giver dig mulighed for at se en GeoJSON fil som et lag."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17430,6 +17434,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Tilbyder validering og rettelse af offentlig rute transport ifølge version 2 "
+"af det offentlig transport skema"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -17626,10 +17632,10 @@ msgid "concrete"
 msgstr "beton"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "beton:plader"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "beton:baner"
 
 msgid "paving_stones"
 msgstr "fliser"
@@ -19064,18 +19070,33 @@ msgstr "Sportype"
 msgid "grade1"
 msgstr "klasse1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Fast: brolagt eller stærkt komprimeret hård overflade"
+
 msgid "grade2"
 msgstr "klasse2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "Overvejende fast: grus/sten blandet med nogle bløde materiale"
+
 msgid "grade3"
 msgstr "klasse3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Lige blanding af hårde og bløde materialer"
+
 msgid "grade4"
 msgstr "klasse4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "Overvejende blød: jord/sand/græs blandet med nogle hårde materiale"
+
 msgid "grade5"
 msgstr "klasse5"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Blød: jord/sand/græs"
+
 msgid "MTB Scale"
 msgstr "MTB skala"
 
@@ -20284,6 +20305,72 @@ msgstr "Spænding"
 msgid "Amperage"
 msgstr "Ampere"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Køretøjstyper der kan oplades:"
+
+msgid "Scooter"
+msgstr "Scooter"
+
+msgid "Truck"
+msgstr "Lastbil"
+
+msgid "Number of Sockets:"
+msgstr "Antal stik:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Superopladere"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE blå"
+
+msgid "CEE red 16A"
+msgstr "CEE rød 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE rød 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Godkendelse:"
+
+msgid "Phone call"
+msgstr "Opringning"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Medlemskort"
+
 msgid "Wash"
 msgstr "Vask"
 
@@ -20488,9 +20575,6 @@ msgstr "Sporvognsstop (gammel)"
 msgid "Train"
 msgstr "Tog"
 
-msgid "Railway station (legacy)"
-msgstr "Jernbanestation (gammel)"
-
 msgid "Railway halt (legacy)"
 msgstr "Jernbanestop (gammel)"
 
@@ -20515,15 +20599,6 @@ msgstr "Læskur"
 msgid "Waste Basket/Trash Can"
 msgstr "Affaldskurv/affaldsspand"
 
-msgid "Highway platform (legacy)"
-msgstr "Vejplatform (gammel)"
-
-msgid "Railway platform (legacy)"
-msgstr "Jernbaneplatform (gammel)"
-
-msgid "funicular"
-msgstr "kabelbane"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Station"
@@ -24317,9 +24392,6 @@ msgstr "Træ"
 msgid "A single tree."
 msgstr "Et enkeltstående træ."
 
-msgid "Botanical Name"
-msgstr "Botanisk navn"
-
 msgid "Tree Row"
 msgstr "Trærække"
 
@@ -25374,6 +25446,27 @@ msgstr "{0} og {1} sammen med {2} og modstridende værdier"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Mistænkelig tag kombination: {0} og {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} på en relation uden {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Langt vandløb med {0}, men uden et tag, der definerer det som tunnel eller "
+"under jorden. Fjern {1} eller tilføj et tunnel tag hvis relevant. Tjek også "
+"krydsende broer og deres {1} tags."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Kort vandløb med {0}, men uden et tag, der definerer det som tunnel eller "
+"under jorden. Fjern {1} eller tilføj et tunnel tag hvis relevant. Tjek også "
+"krydsende broer og deres {1} tags."
+
 msgid "{0} is deprecated"
 msgstr "{0} er forældet"
 
@@ -25541,6 +25634,9 @@ msgstr ""
 "Vandløb ender uden en forbindelse til et andet vandløb eller retningen af "
 "vandløbet er forkert."
 
+msgid "Coastline inside {1}"
+msgstr "Kystlinje inden i {1}"
+
 msgid "abbreviated street name"
 msgstr "forkortet gadenavn"
 
@@ -25933,6 +26029,9 @@ msgstr "Viser højdegitterlag"
 msgid "Elevation Grid"
 msgstr "Højdegitter"
 
+msgid "increase zoom level to see more detail"
+msgstr "forøg zoomniveau for at se flere detaljer"
+
 msgid "No SRTM data"
 msgstr "Ingen SRTM data"
 
@@ -28012,15 +28111,15 @@ msgstr "mellem {0} {1} og {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  tilføjer {0} {1}"
 
+msgid "EditGpx"
+msgstr "RedigerGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Lag til redigering af GPX spor"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Konverter til GPX lag med anonymiseret tid"
 
-msgid "EditGpx"
-msgstr "RedigerGpx"
-
 msgid "edit gpx tracks"
 msgstr "Ret gpx-spor"
 
@@ -28143,6 +28242,18 @@ msgstr "Ryd log"
 msgid "Show users on map"
 msgstr "Vis brugere på kort"
 
+msgid "GeoJSON file"
+msgstr "GeoJSON fil"
+
+msgid "Loading json file..."
+msgstr "Indlæser json fil..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Datalag fra GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Fejl ved indlæsning af geojson fil {0}"
+
 msgid "Position only"
 msgstr "Kun position"
 
@@ -28886,9 +28997,6 @@ msgstr "Vis ikke-geotaggede billeder"
 msgid "Imported Images"
 msgstr "Importerede billeder"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Billedfiler (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importer vektor grafik"
 
@@ -29439,6 +29547,15 @@ msgstr "Sammenlæg/adskil billeder"
 msgid "Join Mapillary pictures"
 msgstr "Sammenlæg Mapillary billeder"
 
+msgid "Submit changeset"
+msgstr "Indsend rettesæt"
+
+msgid "Submit the current changeset"
+msgstr "Indsend det aktuelle rettesæt"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Indsend det aktuelle rettesæt til Mapillary"
+
 msgid "Upload pictures"
 msgstr "Upload billeder"
 
@@ -29478,6 +29595,18 @@ msgstr "Kopier nøgle tag"
 msgid "Edit on website"
 msgstr "Rediger på hjemmesiden"
 
+msgid "Current Mapillary changeset"
+msgstr "Aktuelt Mapillary rettesæt"
+
+msgid "Open Mapillary changeset dialog"
+msgstr "Åben Mapillary rettesæt dialog"
+
+msgid "Mapillary changeset"
+msgstr "Mapillary rettesæt"
+
+msgid "Submit"
+msgstr "Indsend"
+
 msgid "Export all images"
 msgstr "Eksporter alle billeder"
 
@@ -29616,9 +29745,6 @@ msgstr "Pause"
 msgid "Pauses the walk."
 msgstr "Sætter gåturen på pause."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Modsat position af knapper der hvor billeder vises."
-
 msgid "Display hour when the picture was taken"
 msgstr "Vis hvornår billedet blev taget"
 
@@ -29712,12 +29838,22 @@ msgstr "Downloader Mapillary billeder"
 msgid "Total Mapillary images: {0}"
 msgstr "Total antal Mapillary billeder: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Indsender Mapillary rettesæt"
+
 msgid "No images found"
 msgstr "Ingen billeder fundet"
 
 msgid "Finished upload"
 msgstr "Upload færdig"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+"Du er ikke logget ind, du kan logge ind på Mapillary under indstillinger"
+
+msgid "Not Logged in to Mapillary"
+msgstr "Ikke logget ind på Mapillary"
+
 msgid "Uploading: {0}"
 msgstr "Uploader: {0}"
 
@@ -31142,34 +31278,86 @@ msgstr "Proj4J udvidelse"
 msgid "Code"
 msgstr "Kode"
 
-msgid "Gaps"
-msgstr ""
+msgid "Add stop position"
+msgstr "Tilføj stopposition"
 
-msgid "Checks if there are gaps in the route relation."
-msgstr ""
+msgid "Do you want to download referrers of platforms and stop positions?"
+msgstr "Vil du at downloade refererende platforme og stop positioner?"
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
-msgstr ""
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Husk mit valg og spørg mig ikke igen i denne session"
 
-msgid "PT: Route contains an overshoot"
-msgstr ""
+msgid "PT_Assistant Fetch Request"
+msgstr "OT_Assistent hent anmodning"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Rute relationer har ufuldstændige medlemmer.\n"
+"Der er brug for at de bliver hentet for at fortsætte med validering.\n"
+"Vil du downloade dem?"
 
-msgid "Fix gaps in public transport route"
-msgstr ""
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr "OT_Assistent udvidelse fandt at denne relation (id={0}) har fejl:"
 
-msgid "Platforms first"
-msgstr ""
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} retningsfejl"
+msgstr[1] "{0} retningsfejl"
 
-msgid "Checks if platforms are listed before ways in the route relation."
-msgstr ""
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} vejtypefejl"
+msgstr[1] "{0} vejtypefejl"
+
+msgid "How do you want to proceed?"
+msgstr "Hvordan vil du fortsætte?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "OT_Assistent fortsæt anmodning"
+
+msgid "PT: Stop_position is not part of a way"
+msgstr "OT: Stop_position er ikke en del af en vej"
+
+msgid "PT: Platform should not be part of a way"
+msgstr "OT: Platform bør ikke være en del af en vej"
+
+msgid "Public Transport Assistant tests"
+msgstr "Offentlig transport assistent tests"
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
+"Tjek om rute relationer er kompatible med offentlig transport version 2"
+
+msgid "Fix error"
+msgstr "Ret fejl"
+
+msgid "PT: dummy test warning"
+msgstr "OT: dummy test advarsel"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "OT: Rute indeholder et hul, der kan rettes ved at sortere"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "OT: Relations medlems roller passer ikke til tags"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "OT: Rute skal starte og slutte med en stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "OT: første eller sidste vej skal deles"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr "OT: Rute type passer ikke til den type af vej den passerer på"
+
+msgid "PT: Road is under construction"
+msgstr "OT: Vej er under udførelse"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr "OT: Rute passerer en ensrettet vej i den forkerte retning"
 
 msgid "Can''t parse a time from this string."
 msgstr "Kan ikke udlede en tid fra denne streng."
@@ -31573,6 +31761,12 @@ msgstr "Ret roller for de valgte relations medlemmer"
 msgid "Complete multipolygon for way {0}"
 msgstr "Fuldfør multipolygon for vej {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "To ringe er ens, det må de ikke være."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolygon fra ringe"
+
 msgid "Node without ''house'' role found"
 msgstr "Punkt uden ''house'' rolle fundet"
 
@@ -33377,12 +33571,6 @@ msgstr "Slet medlemmet fra svingbegrænsningen"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Skift til den basale editor og vælg en vej"
 
-msgid "Undelete object..."
-msgstr "Gendan objekt..."
-
-msgid "Undelete object by id"
-msgstr "Gendan objekt udfra id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Kan ikke gendanne punkt {0}. Objekt er sandsynligvis blevet redigeret"
@@ -33394,6 +33582,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Kan ikke gendanne relation {0}. Objekt er sandsynligvis blevet redigeret"
 
+msgid "Undelete object..."
+msgstr "Gendan objekt..."
+
+msgid "Undelete object by id"
+msgstr "Gendan objekt udfra id"
+
 msgid "Undelete Object"
 msgstr "Gendan objekt"
 
@@ -34110,6 +34304,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] "Overskriv ''{0}'' tag {1} fra {2} med ny værdi ''{3}''?"
 msgstr[1] "Overskriv ''{0}'' tags {1} fra {2} med ny værdi ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr "Søg Wikidata emner"
+
+msgid "Target key: "
+msgstr "Ønsket nøgle: "
+
 msgid "Add names from Wikipedia"
 msgstr "Tilføj navne fra Wikipedia"
 
@@ -34146,11 +34346,14 @@ msgstr "Til rådighed i lokalt datasæt"
 msgid "Not linked yet"
 msgstr "Ikke linket endnu"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr "{0}: {1}"
+
+msgid "Wikidata"
+msgstr "Wikidata"
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr "Henter alle koordinater fra wikidata i den aktuelle visning"
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Henter alle koordinater fra Wikipedia i det viste udsnit af kortet"
diff --git a/i18n/po/de.po b/i18n/po/de.po
index 3d720ae..e89042c 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-05 12:09+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-10 11:45+0000\n"
 "Last-Translator: Ettore Atalan <atalanttore at googlemail.com>\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: 2016-06-06 04:31+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:43+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: de\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-Basepath: /home/simon/src/josm.all/i18n\n"
@@ -2895,14 +2895,6 @@ msgstr ""
 "Objekte (und alle Linienpunkte / Relationselemente) im heruntergeladenen "
 "Bereich"
 
-msgid "Searching"
-msgstr "Suche …"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Suche in {0} Objekt"
-msgstr[1] "Suche in {0} Objekten"
-
 msgid "No match found for ''{0}''"
 msgstr "Nichts gefunden für Suche ''{0}''"
 
@@ -2919,6 +2911,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "{0} Treffer gefunden"
 
+msgid "Searching"
+msgstr "Suche …"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Suche in {0} Objekt"
+msgstr[1] "Suche in {0} Objekten"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4337,9 +4337,6 @@ msgstr "Internetschlagwörter"
 msgid "Checks for errors in internet-related tags."
 msgstr "Prüft auf Fehler in Internet-bezogenen Tags."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Adresse kann nicht in ASCII umgewandelt werden: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -4812,7 +4809,7 @@ msgid "The \"from\" way does not start or end at a \"via\" node."
 msgstr "Die \"from\"-Linie beginnt oder endet nicht an einem \"via\"-Punkt."
 
 msgid "Superfluous turnrestriction as \"to\" way is oneway"
-msgstr "Überflüssige Abbiegeeinschränkung, da \"to\" eine Einbahn ist"
+msgstr "Überflüssige Abbiegeeinschränkung, da \"to\" eine Einbahnstraße ist"
 
 msgid "The \"to\" way does not start or end at a \"via\" node."
 msgstr "Die Startlinie beginnt oder endet nicht an einem Zwischenpunkt."
@@ -10010,8 +10007,8 @@ msgstr "Zum Laden von Kacheln hereinzoomen"
 msgid "zoom in to load more tiles"
 msgstr "Zum Laden weiterer Kacheln hereinzoomen"
 
-msgid "increase zoom level to see more detail"
-msgstr "Zoomstufe erhöhen, um mehr Details zu sehen"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr "Kachelzoomstufe erhöhen (Auflösung ändern), um mehr Details zu sehen"
 
 msgid "No tiles at this zoom level"
 msgstr "Keine Kacheln auf dieser Zoomstufe"
@@ -16420,6 +16417,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Orientierungs-Overlay"
 
@@ -16580,7 +16580,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC-Buslinien (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin: Großraum Cotonou 2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Karte der Stadtgebiete"
@@ -16660,8 +16660,8 @@ msgstr "BANO (Französische Adressen unter offener Lizenz)"
 msgid "BD Carthage"
 msgstr "BD Carthage (französisches Flussnetz)"
 
-msgid "BD Ortho"
-msgstr "BD Ortho"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17680,6 +17680,9 @@ msgstr ""
 "Mit in der Nähe arbeitenden Nutzern reden, benachrichtigt werden, wenn "
 "jemand in die Nähe kommt."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Ermöglicht Ihnen das Ansehen einer GeoJSON-Datei als eine Ebene."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17938,6 +17941,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Bietet Validierung und Berichtigung für Routen des öffentlichen Verkehrs "
+"nach Version 2 des Schemas des öffentlichen Verkehrs"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -18087,7 +18092,7 @@ msgstr ""
 "von Abbiegeeinschränkungen in der OpenStreetMap-Datenbank."
 
 msgid "Allows undeleting object from OSM database"
-msgstr "Erlaubt es, Objekte der OSM-Datenbank wiederherzustellen"
+msgstr "Ermöglicht das Wiederherstellen von Objekten aus der OSM-Datenbank"
 
 msgid "Several utilities that make your life easier."
 msgstr "Diverse Werkzeuge, die das Leben einfacher machen."
@@ -19337,7 +19342,7 @@ msgid "Vehicle access"
 msgstr "Nutzbarkeit für Fahrzeuge"
 
 msgid "Oneway for bicycle"
-msgstr "Einbahn (Fahrrad)"
+msgstr "Einbahn für Fahrrad"
 
 msgid "Living Street"
 msgstr "Spielstraße"
@@ -19578,19 +19583,37 @@ msgid "Tracktype"
 msgstr "Typ des Weges"
 
 msgid "grade1"
-msgstr "Grad 1 (Asphalt, Beton, Pflastersteine)"
+msgstr "Grad 1"
+
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Fest: befestigt oder stark verdichtete Packlagenoberfläche"
 
 msgid "grade2"
-msgstr "Grad 2 (nur Schotter, verdichtete Materialien)"
+msgstr "Grad 2"
+
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+"Größtenteils fest: Schotter/Gestein mit etwas eingemischtem weichen Material"
 
 msgid "grade3"
-msgstr "Grad 3 (teils feste, teils weiche Oberfläche)"
+msgstr "Grad 3"
+
+msgid "Even mixture of hard and soft materials"
+msgstr "Gleichmäßige Mischung aus harten und weichen Materialien"
 
 msgid "grade4"
-msgstr "Grad 4 (hauptsächlich weiche Oberfläche)"
+msgstr "Grad 4"
+
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+"Größtenteils weich: Erdboden/Sand/Gras mit etwas eingemischtem harten "
+"Material"
 
 msgid "grade5"
-msgstr "Grad 5 (nur weiche Oberfläche, Gras, Erde)"
+msgstr "Grad 5"
+
+msgid "Soft: soil/sand/grass"
+msgstr "Weich: Erdboden/Sand/Gras"
 
 msgid "MTB Scale"
 msgstr "MTB-Skala"
@@ -20805,6 +20828,72 @@ msgstr "Spannung"
 msgid "Amperage"
 msgstr "Stromstärke"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Fahrzeugtypen, die geladen werden können:"
+
+msgid "Scooter"
+msgstr "Roller"
+
+msgid "Truck"
+msgstr "Lastkraftwagen"
+
+msgid "Number of Sockets:"
+msgstr "Anzahl der Steckdosen:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Typ 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Typ 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Typ 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Typ 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Typ 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE blau"
+
+msgid "CEE red 16A"
+msgstr "CEE rot 16 A"
+
+msgid "CEE red 32A"
+msgstr "CEE rot 32 A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Authentifikation:"
+
+msgid "Phone call"
+msgstr "Telefonanruf"
+
+msgid "Short message"
+msgstr "Kurznachricht"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Mitgliedskarte"
+
 msgid "Wash"
 msgstr "Autowäsche"
 
@@ -21010,9 +21099,6 @@ msgstr "Straßenbahnhaltestelle (legacy/veraltet)"
 msgid "Train"
 msgstr "Zug"
 
-msgid "Railway station (legacy)"
-msgstr "Bahnhof (veraltet)"
-
 msgid "Railway halt (legacy)"
 msgstr "Bahnstation (veraltet)"
 
@@ -21037,15 +21123,6 @@ msgstr "Unterstand"
 msgid "Waste Basket/Trash Can"
 msgstr "Papierkorb/Abfalleimer"
 
-msgid "Highway platform (legacy)"
-msgstr "Bussteig (legacy/veraltet)"
-
-msgid "Railway platform (legacy)"
-msgstr "Bahnsteig (veraltet)"
-
-msgid "funicular"
-msgstr "Standseilbahn"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Bahnhof"
@@ -22821,7 +22898,7 @@ msgstr "Ausgang"
 
 msgctxt "entrance"
 msgid "emergency"
-msgstr "Notfall"
+msgstr "Notausgang"
 
 msgctxt "entrance"
 msgid "staircase"
@@ -24839,9 +24916,6 @@ msgstr "Baum"
 msgid "A single tree."
 msgstr "Ein einzelner Baum."
 
-msgid "Botanical Name"
-msgstr "Botanischer Name"
-
 msgid "Tree Row"
 msgstr "Baumreihe"
 
@@ -25900,6 +25974,29 @@ msgstr "{0} und {1} zusammen mit {2} und widersprüchlichen Werten"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Verdächtige Merkmalskombination: {0} und {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} auf einer Relation ohne {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Lange Wasserstraße mit {0}, aber ohne Merkmal, welches sie als Tunnel oder "
+"unterirdisch definiert. Entfernen Sie {1} oder fügen Sie gegebenenfalls "
+"einen Tunnel hinzu. Überprüfen Sie auch überquerende Brücken und deren {1} "
+"Merkmale."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Kurze Wasserstraße mit {0}, aber ohne Merkmal, welches sie als Tunnel oder "
+"unterirdisch definiert. Entfernen Sie {1} oder fügen Sie gegebenenfalls "
+"einen Tunnel hinzu. Überprüfen Sie auch überquerende Brücken und deren {1} "
+"Merkmale."
+
 msgid "{0} is deprecated"
 msgstr "{0} ist veraltet"
 
@@ -26075,6 +26172,9 @@ msgstr ""
 "Wasserweg endet ohne eine Verbindung zu einem anderen Wasserweg oder die "
 "Richtung des Wasserwegs ist falsch."
 
+msgid "Coastline inside {1}"
+msgstr "Küstenlinie innerhalb {1}"
+
 msgid "abbreviated street name"
 msgstr "Abgekürzter Straßenname"
 
@@ -26474,6 +26574,9 @@ msgstr "Zeigt die Höhengitterebene an"
 msgid "Elevation Grid"
 msgstr "Höhengitter"
 
+msgid "increase zoom level to see more detail"
+msgstr "Zoomstufe erhöhen, um mehr Details zu sehen"
+
 msgid "No SRTM data"
 msgstr "Keine SRTM-Daten"
 
@@ -28587,15 +28690,15 @@ msgstr "zwischen {0} {1} und {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  hinzufügen von {0} {1}"
 
+msgid "EditGpx"
+msgstr "GPX-Ändern"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Ebene zum Ändern von GPX-Spuren"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "In GPX-Ebene mit anonymer Zeit konvertieren"
 
-msgid "EditGpx"
-msgstr "GPX-Ändern"
-
 msgid "edit gpx tracks"
 msgstr "GPX-Spuren bearbeiten"
 
@@ -28718,6 +28821,18 @@ msgstr "Protokoll leeren"
 msgid "Show users on map"
 msgstr "Nutzer auf Karte anzeigen"
 
+msgid "GeoJSON file"
+msgstr "GeoJSON-Datei"
+
+msgid "Loading json file..."
+msgstr "JSON-Datei wird geladen..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Datenebene aus GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Fehler beim Laden der GeoJSON-Datei {0}"
+
 msgid "Position only"
 msgstr "Nur Position"
 
@@ -29475,9 +29590,6 @@ msgstr "Nicht georeferenzierte Bilder anzeigen"
 msgid "Imported Images"
 msgstr "Importierte Bilder"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Bilddateien (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Vektorgrafiken importieren"
 
@@ -30041,6 +30153,15 @@ msgstr "Bilder verbinden/trennen"
 msgid "Join Mapillary pictures"
 msgstr "Mapillary-Bilder verbinden"
 
+msgid "Submit changeset"
+msgstr "Änderungssatz absenden"
+
+msgid "Submit the current changeset"
+msgstr "Aktuellen Änderungssatz absenden"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Aktuellen Änderungssatz zu Mapillary absenden"
+
 msgid "Upload pictures"
 msgstr "Bilder hochladen"
 
@@ -30080,6 +30201,18 @@ msgstr "Mapillary-Tag kopieren"
 msgid "Edit on website"
 msgstr "Auf Webseite bearbeiten"
 
+msgid "Current Mapillary changeset"
+msgstr "Aktueller Mapillary-Änderungssatz"
+
+msgid "Open Mapillary changeset dialog"
+msgstr "Mapillary-Änderungssatzdialog öffnen"
+
+msgid "Mapillary changeset"
+msgstr "Mapillary-Änderungssatz"
+
+msgid "Submit"
+msgstr "Absenden"
+
 msgid "Export all images"
 msgstr "Alle Bilder exportieren"
 
@@ -30218,9 +30351,6 @@ msgstr "Pause"
 msgid "Pauses the walk."
 msgstr "Pausiert den Spaziergang."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Schaltflächenposition beim Anzeigen von Bildern umkehren."
-
 msgid "Display hour when the picture was taken"
 msgstr "Stunde, in der das Bild gemacht wurde, anzeigen"
 
@@ -30317,12 +30447,23 @@ msgstr "Mapillary-Bilder werden heruntergeladen"
 msgid "Total Mapillary images: {0}"
 msgstr "Mapillary-Bilder insgesamt: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Mapillary-Änderungssatz wird gesendet"
+
 msgid "No images found"
 msgstr "Keine Bilder gefunden"
 
 msgid "Finished upload"
 msgstr "Hochladen abgeschlossen"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+"Sie sind nicht angemeldet, bitte melden Sie sich in den Einstellungen bei "
+"Mapillary an"
+
+msgid "Not Logged in to Mapillary"
+msgstr "Nicht bei Mapillary angemeldet"
+
 msgid "Uploading: {0}"
 msgstr "Hachladevorgang: {0}"
 
@@ -31773,40 +31914,90 @@ msgstr "Proj4J-Erweiterung"
 msgid "Code"
 msgstr "Kode"
 
-msgid "Gaps"
-msgstr "Lücken"
+msgid "Add stop position"
+msgstr "Haltepunkt hinzufügen"
 
-msgid "Checks if there are gaps in the route relation."
-msgstr "Überprüft, ob es Lücken in der Routenrelation gibt."
-
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
-"PT: Route enthält eine Lücke, die durch das Sortieren behoben werden kann."
 
-msgid "PT: Route contains an overshoot"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Meine Wahl merken und in dieser Sitzung nicht wieder danach fragen"
+
+msgid "PT_Assistant Fetch Request"
+msgstr "PT_Assistant Abrufanforderung"
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Routenrelationen haben unvollständige Mitglieder.\n"
+"Sie müssen zum Fortsetzen der Validierung heruntergeladen werden.\n"
+"Möchten Sie sie herunterladen?"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
-"PT: Route enthält eine Lücke, die nicht durch das Sortieren der Wege behoben "
-"werden kann"
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} Richtungsfehler"
+msgstr[1] "{0} Richtungsfehler"
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} Straßentypfehler"
+msgstr[1] "{0} Straßentypfehler"
+
+msgid "How do you want to proceed?"
+msgstr "Wie möchten Sie fortfahren?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "PT_Assistant Fahranforderung"
+
+msgid "PT: Stop_position is not part of a way"
+msgstr "PT: Haltepunkt ist nicht Teil eines Weges"
+
+msgid "PT: Platform should not be part of a way"
+msgstr "PT: Plattform sollte nicht Teil eines Weges sein"
+
+msgid "Public Transport Assistant tests"
+msgstr "Öffentlicher Verkehr Assistent Tests"
+
+msgid ""
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
+"Prüft, ob Routen-Relationen kompatibel mit dem Schema des öffentlichen "
+"Verkehrs Version 2 sind"
+
+msgid "Fix error"
+msgstr "Fehler beheben"
 
-msgid "Platforms first"
-msgstr "Plattformen zuerst"
+msgid "PT: dummy test warning"
+msgstr "Öffentlicher Verkehr: Pseudotestwarnung"
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Route contains a gap that can be fixed by sorting"
 msgstr ""
-"Überprüft, ob Plattformen vor Wegen in der Routenrelation aufgeführt sind."
+"PT: Route enthält eine Lücke, die durch das Sortieren behoben werden kann."
 
-msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+msgid "PT: Relation member roles do not match tags"
+msgstr "PT: Relationsmitgliederrollen passen nicht zu den Merkmalen"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "PT: Route sollte mit einem Halteplatz beginnen und enden"
+
+msgid "PT: First or last way needs to be split"
+msgstr "PT: Erster oder letzter Weg muss aufgeteilt werden"
+
+msgid "PT: Route type does not match the type of the road it passes on"
 msgstr ""
-"PT: Routenrelation(en) enthält/enthalten Weg(e) vor Plattform(en) in der "
-"Mitgliederliste"
+"Öffentlicher Verkehr: Routentyp passt nicht zum Typ der Straße, auf der sie "
+"verläuft"
+
+msgid "PT: Road is under construction"
+msgstr "PT: Straße ist im Bau"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr "PT: Route führt in falscher Richtung über eine Einbahnstraße"
 
 msgid "Can''t parse a time from this string."
 msgstr "Von dieser Zeichenkette konnte keine Uhrzeit geparst werden."
@@ -32215,6 +32406,12 @@ msgstr "Rolle der ausgewählten Relationsmitglieder reparieren"
 msgid "Complete multipolygon for way {0}"
 msgstr "Multipolygon für Linie {0} vervollständigen"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Zwei Ringe sind gleich, und dies muss nicht sein."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolygon aus Ringen"
+
 msgid "Node without ''house'' role found"
 msgstr "Punkt ohne Rolle ''house'' gefunden"
 
@@ -34056,12 +34253,6 @@ msgstr "Lösche das Relationselement aus der Abbiegebeschränkung"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Bitte zum Standardeditor wechseln und eine Linie auswählen"
 
-msgid "Undelete object..."
-msgstr "Objekt wiederherstellen …"
-
-msgid "Undelete object by id"
-msgstr "Objekt mittels ID wiederherstellen"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Punkt {0} kann nicht wiederhergestellt werden. Objekt wurde vermutlich "
@@ -34077,6 +34268,12 @@ msgstr ""
 "Relation {0} kann nicht wiederhergestellt werden. Objekt wurde vermutlich "
 "redacted/redigiert"
 
+msgid "Undelete object..."
+msgstr "Objekt wiederherstellen …"
+
+msgid "Undelete object by id"
+msgstr "Objekt mittels ID wiederherstellen"
+
 msgid "Undelete Object"
 msgstr "Objekt wiederherstellen"
 
@@ -34831,6 +35028,12 @@ msgstr[0] "''{0}'' Merkmal {1} von {2} mit neuem Wert ''{3}'' überschreiben?"
 msgstr[1] ""
 "''{0}'' Merkmale {1} von {2} mit neuem Wert ''{3}'' überschreiben?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Namen aus Wikipedia hinzufügen"
 
@@ -34868,11 +35071,14 @@ msgstr "In lokalem Datensatz verknüpft"
 msgid "Not linked yet"
 msgstr "Noch nicht verknüpft"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr "{0}: {1}"
+
+msgid "Wikidata"
+msgstr "Wikidata"
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr "Ruft alle Koordinaten von Wikidata in der aktuellen Ansicht ab"
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/de_DE.po b/i18n/po/de_DE.po
index 3da0ce0..d1ae347 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:10+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:12+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2625,14 +2625,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2648,6 +2640,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3915,9 +3915,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9003,7 +9000,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14566,6 +14563,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14806,7 +14806,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15784,6 +15784,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17567,18 +17570,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18768,6 +18786,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18972,9 +19056,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18999,15 +19080,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22794,9 +22866,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23833,6 +23902,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23985,6 +24069,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24357,6 +24444,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26228,13 +26318,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26356,6 +26446,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27052,9 +27154,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27586,6 +27685,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27625,6 +27733,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27763,9 +27883,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27857,12 +27974,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29219,33 +29345,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29645,6 +29819,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31306,19 +31486,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31974,6 +32154,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32006,10 +32192,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/el.po b/i18n/po/el.po
index 637c176..9a5cb52 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:44+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:45+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: el\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2776,14 +2776,6 @@ msgstr "αντικείμενα στη ληφθείσα περιοχή"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Δεν βρέθηκε αποτέλεσμα για ''{0}''"
 
@@ -2799,6 +2791,14 @@ msgstr "Δεν βρέθηκε τίποτα στην επιλογή ψάχνον
 msgid "Found {0} matches"
 msgstr "Βρέθηκαν {0} αποτελέσματα"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -4099,9 +4099,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9317,7 +9314,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14953,6 +14950,9 @@ msgstr "Χάρτης θερμότητας ποδηλασίας Strava"
 msgid "Strava running heatmap"
 msgstr "Χάρτης θερμότητας τρεξίματος Strava"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15193,7 +15193,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16171,6 +16171,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17957,18 +17960,33 @@ msgstr "Τύπος"
 msgid "grade1"
 msgstr "βαθμός1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "βαθμός2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "βαθμός3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "βαθμός4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "βαθμός5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Κλίμακα MTB"
 
@@ -19158,6 +19176,72 @@ msgstr "Τάση ρεύματος"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Πλυντήριο"
 
@@ -19362,9 +19446,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19389,15 +19470,6 @@ msgstr "Καταφύγιο"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Σταθμός τρένου"
@@ -23184,9 +23256,6 @@ msgstr "Δένδρο"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Βοτανικό όνομα"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24223,6 +24292,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} είναι παρωχημένο"
 
@@ -24375,6 +24459,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24747,6 +24834,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26627,15 +26717,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr ""
+
 msgid "Layer for editing GPX tracks"
 msgstr "Επίπεδο για επεξεργασία ιχνών GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
-msgid "EditGpx"
-msgstr ""
-
 msgid "edit gpx tracks"
 msgstr "επεξεργασία ιχνών GPX"
 
@@ -26755,6 +26845,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Θέση μόνο"
 
@@ -27453,9 +27555,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr "Εισαγμένες Εικόνες"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Αρχεία εικόνων (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -28001,6 +28100,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28040,6 +28148,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28178,9 +28298,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28272,12 +28389,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29636,33 +29762,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30064,6 +30238,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31764,19 +31944,19 @@ msgstr "Διαγραφή του μέλους από τον περιορισμό
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32444,6 +32624,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32476,11 +32662,14 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/en_AU.po b/i18n/po/en_AU.po
index 70838d6..892016d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:08+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:11+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2795,14 +2795,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objects (and all its way nodes / relation members) in downloaded area"
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "No match found for ''{0}''"
 
@@ -2818,6 +2810,14 @@ msgstr "Nothing found in selection by searching for ''{0}''"
 msgid "Found {0} matches"
 msgstr "Found {0} matches"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4175,9 +4175,6 @@ msgstr "Internet tags"
 msgid "Checks for errors in internet-related tags."
 msgstr "Checks for errors in internet-related tags."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL cannot be converted to ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9625,8 +9622,8 @@ msgstr "zoom in to load any tiles"
 msgid "zoom in to load more tiles"
 msgstr "zoom in to load more tiles"
 
-msgid "increase zoom level to see more detail"
-msgstr "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "No tiles at this zoom level"
@@ -15517,6 +15514,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15757,7 +15757,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16742,6 +16742,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18548,18 +18551,33 @@ msgstr "Tracktype"
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB Scale"
 
@@ -19749,6 +19767,72 @@ msgstr "Voltage"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Wash"
 
@@ -19953,9 +20037,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19980,15 +20061,6 @@ msgstr "Shelter"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Station"
@@ -23775,9 +23847,6 @@ msgstr "Tree"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Botanical Name"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24814,6 +24883,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24966,6 +25050,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -25342,6 +25429,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "increase zoom level to see more detail"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -27257,15 +27347,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Layer for editing GPX tracks"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convert to GPX layer with anonymised time"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "edit gpx tracks"
 
@@ -27385,6 +27475,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Position only"
 
@@ -28084,9 +28186,6 @@ msgstr "Display non-geotagged photos"
 msgid "Imported Images"
 msgstr "Imported Images"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -28627,6 +28726,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28666,6 +28774,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28804,9 +28924,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28898,12 +29015,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30267,33 +30393,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30693,6 +30867,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -32359,19 +32539,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -33039,6 +33219,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -33071,10 +33257,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/en_CA.po b/i18n/po/en_CA.po
index 743b88d..984a0b6 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:10+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:13+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2622,14 +2622,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2645,6 +2637,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3912,9 +3912,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9000,7 +8997,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14560,6 +14557,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14800,7 +14800,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15778,6 +15778,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17561,18 +17564,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18762,6 +18780,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18966,9 +19050,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18993,15 +19074,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22788,9 +22860,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23827,6 +23896,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23979,6 +24063,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24351,6 +24438,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26218,13 +26308,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26346,6 +26436,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27042,9 +27144,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27576,6 +27675,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27615,6 +27723,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27753,9 +27873,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27847,12 +27964,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29209,33 +29335,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29635,6 +29809,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31296,19 +31476,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31964,6 +32144,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31996,10 +32182,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/en_GB.po b/i18n/po/en_GB.po
index 5cd01e8..33b07a1 100644
--- a/i18n/po/en_GB.po
+++ b/i18n/po/en_GB.po
@@ -10,16 +10,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: JOSM\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-02 13:27+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-09 13:47+0000\n"
 "Last-Translator: Andi Chandler <Unknown>\n"
 "Language-Team: German <josm-dev at 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: 2016-06-05 05:08+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:10+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: de\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2802,14 +2802,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objects (and all its way nodes / relation members) in downloaded area"
 
-msgid "Searching"
-msgstr "Searching"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Searching in {0} object"
-msgstr[1] "Searching in {0} objects"
-
 msgid "No match found for ''{0}''"
 msgstr "No match found for ''{0}''"
 
@@ -2825,6 +2817,14 @@ msgstr "Nothing found in selection by searching for ''{0}''"
 msgid "Found {0} matches"
 msgstr "Found {0} matches"
 
+msgid "Searching"
+msgstr "Searching"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Searching in {0} object"
+msgstr[1] "Searching in {0} objects"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4187,9 +4187,6 @@ msgstr "Internet tags"
 msgid "Checks for errors in internet-related tags."
 msgstr "Checks for errors in Internet-related tags."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL cannot be converted to ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9665,8 +9662,8 @@ msgstr "zoom in to load any tiles"
 msgid "zoom in to load more tiles"
 msgstr "zoom in to load more tiles"
 
-msgid "increase zoom level to see more detail"
-msgstr "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr "increase tiles zoom level (change resolution) to see more detail"
 
 msgid "No tiles at this zoom level"
 msgstr "No tiles at this zoom level"
@@ -15828,6 +15825,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr "Strava both heatmap"
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -15988,7 +15988,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC bus lines (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin:cotonou_pleiade_2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -16068,8 +16068,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr "BD Ortho"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17080,6 +17080,9 @@ msgid ""
 msgstr ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Allows you to view a GeoJSON file as a layer."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17518,10 +17521,10 @@ msgid "concrete"
 msgstr "concrete"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "concrete:plates"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "concrete:lanes"
 
 msgid "paving_stones"
 msgstr "paving_stones"
@@ -18956,18 +18959,33 @@ msgstr "Tracktype"
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Solid: paved or heavily compacted hardcore surface"
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "Mostly Solid: gravel/rock with some soft material mixed in"
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Even mixture of hard and soft materials"
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "Mostly Soft: soil/sand/grass with some hard material mixed in"
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Soft: soil/sand/grass"
+
 msgid "MTB Scale"
 msgstr "MTB Scale"
 
@@ -20176,6 +20194,72 @@ msgstr "Voltage"
 msgid "Amperage"
 msgstr "Amperage"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Types of vehicles which can be charged:"
+
+msgid "Scooter"
+msgstr "Scooter"
+
+msgid "Truck"
+msgstr "Truck"
+
+msgid "Number of Sockets:"
+msgstr "Number of Sockets:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE blue"
+
+msgid "CEE red 16A"
+msgstr "CEE red 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE red 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Authentication:"
+
+msgid "Phone call"
+msgstr "Phone call"
+
+msgid "Short message"
+msgstr "Short message"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Membership card"
+
 msgid "Wash"
 msgstr "Wash"
 
@@ -20380,9 +20464,6 @@ msgstr "Tram stop (legacy)"
 msgid "Train"
 msgstr "Train"
 
-msgid "Railway station (legacy)"
-msgstr "Railway station (legacy)"
-
 msgid "Railway halt (legacy)"
 msgstr "Railway halt (legacy)"
 
@@ -20407,15 +20488,6 @@ msgstr "Shelter"
 msgid "Waste Basket/Trash Can"
 msgstr "Waste Basket/Trash Can"
 
-msgid "Highway platform (legacy)"
-msgstr "Highway platform (legacy)"
-
-msgid "Railway platform (legacy)"
-msgstr "Railway platform (legacy)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Station"
@@ -24209,9 +24281,6 @@ msgstr "Tree"
 msgid "A single tree."
 msgstr "A single tree."
 
-msgid "Botanical Name"
-msgstr "Botanical Name"
-
 msgid "Tree Row"
 msgstr "Tree Row"
 
@@ -25266,6 +25335,27 @@ msgstr "{0} and {1} together with {2} and conflicting values"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Suspicious tag combination: {0} and {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} on a relation without {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+
 msgid "{0} is deprecated"
 msgstr "{0} is deprecated"
 
@@ -25435,6 +25525,9 @@ msgstr ""
 "Waterway ends without a connection to another waterway or the direction of "
 "the waterway is wrong."
 
+msgid "Coastline inside {1}"
+msgstr "Coastline inside {1}"
+
 msgid "abbreviated street name"
 msgstr "abbreviated street name"
 
@@ -25825,6 +25918,9 @@ msgstr "Shows elevation grid layer"
 msgid "Elevation Grid"
 msgstr "Elevation grid"
 
+msgid "increase zoom level to see more detail"
+msgstr "increase zoom level to see more detail"
+
 msgid "No SRTM data"
 msgstr "No SRTM data"
 
@@ -27889,15 +27985,15 @@ msgstr "between {0} {1} and {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  adding {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Layer for editing GPX tracks"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convert to GPX layer with anonymised time"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "edit gpx tracks"
 
@@ -28020,6 +28116,18 @@ msgstr "Clear log"
 msgid "Show users on map"
 msgstr "Show users on map"
 
+msgid "GeoJSON file"
+msgstr "GeoJSON file"
+
+msgid "Loading json file..."
+msgstr "Loading JSON file..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Data Layer from GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Error loading GeoJSON file {0}"
+
 msgid "Position only"
 msgstr "Position only"
 
@@ -28765,9 +28873,6 @@ msgstr "Display non-geotagged photos"
 msgid "Imported Images"
 msgstr "Imported Images"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Import vector graphics"
 
@@ -29320,6 +29425,15 @@ msgstr "Join/unjoin pictures"
 msgid "Join Mapillary pictures"
 msgstr "Join Mapillary pictures"
 
+msgid "Submit changeset"
+msgstr "Submit changeset"
+
+msgid "Submit the current changeset"
+msgstr "Submit the current changeset"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Submit the current changeset to Mapillary"
+
 msgid "Upload pictures"
 msgstr "Upload pictures"
 
@@ -29359,6 +29473,18 @@ msgstr "Copy key tag"
 msgid "Edit on website"
 msgstr "Edit on website"
 
+msgid "Current Mapillary changeset"
+msgstr "Current Mapillary changeset"
+
+msgid "Open Mapillary changeset dialog"
+msgstr "Open Mapillary changeset dialogue"
+
+msgid "Mapillary changeset"
+msgstr "Mapillary changeset"
+
+msgid "Submit"
+msgstr "Submit"
+
 msgid "Export all images"
 msgstr "Export all images"
 
@@ -29497,9 +29623,6 @@ msgstr "Pause"
 msgid "Pauses the walk."
 msgstr "Pauses the walk."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Reverse buttons position when displaying images."
-
 msgid "Display hour when the picture was taken"
 msgstr "Display hour when the picture was taken"
 
@@ -29593,12 +29716,21 @@ msgstr "Downloading Mapillary images"
 msgid "Total Mapillary images: {0}"
 msgstr "Total Mapillary images: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Submitting Mapillary Changeset"
+
 msgid "No images found"
 msgstr "No images found"
 
 msgid "Finished upload"
 msgstr "Finished upload"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr "You are not logged in, please log in to Mapillary in the preferences"
+
+msgid "Not Logged in to Mapillary"
+msgstr "Not Logged in to Mapillary"
+
 msgid "Uploading: {0}"
 msgstr "Uploading: {0}"
 
@@ -31020,36 +31152,86 @@ msgstr "Proj4J Plugin"
 msgid "Code"
 msgstr "Code"
 
-msgid "Gaps"
-msgstr "Gaps"
+msgid "Add stop position"
+msgstr "Add stop position"
 
-msgid "Checks if there are gaps in the route relation."
-msgstr "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
+msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
-msgstr "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Remember my choice and do not ask me again in this session"
 
-msgid "PT: Route contains an overshoot"
-msgstr ""
+msgid "PT_Assistant Fetch Request"
+msgstr "PT_Assistant Fetch Request"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr "PT_Assistant plugin found that this relation (id={0}) has errors:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} direction error"
+msgstr[1] "{0} direction errors"
 
-msgid "Fix gaps in public transport route"
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} road type error"
+msgstr[1] "{0} road type errors"
+
+msgid "How do you want to proceed?"
+msgstr "How do you want to proceed?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "PT_Assistant Proceed Request"
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
-msgstr "Platforms first"
+msgid "PT: Platform should not be part of a way"
+msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
-msgstr "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
+msgstr "Public Transport Assistant tests"
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+
+msgid "Fix error"
+msgstr "Fix error"
+
+msgid "PT: dummy test warning"
+msgstr "PT: dummy test warning"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "PT: Route contains a gap that can be fixed by sorting"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "PT: Relation member roles do not match tags"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "PT: Route should start and end with a stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "PT: First or last way needs to be split"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr "PT: Route type does not match the type of the road it passes on"
+
+msgid "PT: Road is under construction"
+msgstr "PT: Road is under construction"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr "PT: Route passes a oneway road in the wrong direction"
 
 msgid "Can''t parse a time from this string."
 msgstr "Can''t parse a time from this string."
@@ -31451,6 +31633,12 @@ msgstr "Fix roles of the chosen relation members"
 msgid "Complete multipolygon for way {0}"
 msgstr "Complete multipolygon for way {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Two rings are equal, and this must not be."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolygon from rings"
+
 msgid "Node without ''house'' role found"
 msgstr "Node without ''house'' role found"
 
@@ -33246,12 +33434,6 @@ msgstr "Delete the member from the turn restriction"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Change to the Basic Editor and select a way"
 
-msgid "Undelete object..."
-msgstr "Undelete object..."
-
-msgid "Undelete object by id"
-msgstr "Undelete object by id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr "Unable to undelete node {0}. Object has probably been redacted"
 
@@ -33261,6 +33443,12 @@ msgstr "Unable to undelete way {0}. Object has probably been redacted"
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr "Unable to undelete relation {0}. Object has probably been redacted"
 
+msgid "Undelete object..."
+msgstr "Undelete object..."
+
+msgid "Undelete object by id"
+msgstr "Undelete object by id"
+
 msgid "Undelete Object"
 msgstr "Undelete Object"
 
@@ -33983,6 +34171,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] "Overwrite ''{0}'' tag {1} from {2} with new value ''{3}''?"
 msgstr[1] "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Add names from Wikipedia"
 
@@ -34020,11 +34214,14 @@ msgstr "Available in local dataset"
 msgid "Not linked yet"
 msgstr "Not linked yet"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/eo.po b/i18n/po/eo.po
index e5bc8c5..b81a22e 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2012-10-03 21:33+0000\n"
 "Last-Translator: Michael Moroni <michael.moroni at openmailbox.org>\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: 2016-06-05 04:39+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:40+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: eo\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2618,14 +2618,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2641,6 +2633,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3908,9 +3908,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8996,7 +8993,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14560,6 +14557,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14800,7 +14800,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15778,6 +15778,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17561,18 +17564,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18762,6 +18780,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18966,9 +19050,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18993,15 +19074,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22788,9 +22860,6 @@ msgstr "Arbo"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23827,6 +23896,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23979,6 +24063,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24351,6 +24438,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26218,13 +26308,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26346,6 +26436,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27042,9 +27144,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27576,6 +27675,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27615,6 +27723,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27753,9 +27873,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27847,12 +27964,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29209,33 +29335,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29635,6 +29809,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31296,19 +31476,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31964,6 +32144,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31996,10 +32182,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/es.po b/i18n/po/es.po
index a9c68b5..39c3165 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-04 09:17+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-08 16:51+0000\n"
 "Last-Translator: Emilio Gomez Fernandez <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: 2016-06-05 05:02+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:04+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: es\n"
 "X-Language: es_ES\n"
 "X-Source-Language: C\n"
@@ -264,7 +264,7 @@ msgid "Could not retrieve WMS layer list."
 msgstr "No se pudo recuperar la lista de las capas WMS."
 
 msgid "Could not parse WMS layer list."
-msgstr "No se pudo analizar la lista de las capas WMS."
+msgstr "No se pudo deserializar la lista de las capas WMS."
 
 msgid "Add Node..."
 msgstr "Añadir nodo..."
@@ -811,10 +811,10 @@ msgstr "Saltar a posición"
 
 msgid "Could not parse Latitude, Longitude or Zoom. Please check."
 msgstr ""
-"No se puede analizar Latitud, Longitud o Zoom. Por favor verifíquelo."
+"No se puede deserializar la Latitud, Longitud o Zoom. Por favor verifíquelo."
 
 msgid "Unable to parse Lon/Lat"
-msgstr "Imposible analizar Lon/Lat"
+msgstr "Imposible deserializar la Lon/Lat"
 
 msgid "Lasso Mode"
 msgstr "Modo Lazo"
@@ -1163,10 +1163,11 @@ msgid "Build query"
 msgstr "Generar consulta"
 
 msgid "<html>The Overpass wizard could not parse the following query:"
-msgstr "Generar consulta"
+msgstr ""
+"<html>El asistente de Overpass no puede deserializar la siguiente  consulta:"
 
 msgid "Parse error"
-msgstr "Error de análisis"
+msgstr "Error al deserializar"
 
 msgid "Overpass query: "
 msgstr "Consulat de paso elevado: "
@@ -2860,14 +2861,6 @@ msgstr ""
 "objetos (y todos sus vías-nodos / miembros de la relación) en el área "
 "descargada"
 
-msgid "Searching"
-msgstr "Buscando"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Buscando en {0} objeto"
-msgstr[1] "Buscando en {0} objetos"
-
 msgid "No match found for ''{0}''"
 msgstr "No se encontraron coincidencias para \"{0}\""
 
@@ -2883,6 +2876,14 @@ msgstr "No se ha encontrado nada en la selección buscando por ''{0}''"
 msgid "Found {0} matches"
 msgstr "Se han encontrado {0} coincidencias"
 
+msgid "Searching"
+msgstr "Buscando"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Buscando en {0} objeto"
+msgstr[1] "Buscando en {0} objetos"
+
 msgctxt "search"
 msgid "CS"
 msgstr "Mayúsculas y Minúsculas"
@@ -2908,8 +2909,8 @@ msgid ""
 "\n"
 "{2}"
 msgstr ""
-"La expresión regular \"{0}\" presenta un error en la posición {1}, error "
-"completo:\n"
+"La expresión regular \"{0}\" presenta un error al deserializar en la "
+"posición {1}, error completo:\n"
 "\n"
 "{2}"
 
@@ -2918,13 +2919,12 @@ msgid ""
 "\n"
 "{1}"
 msgstr ""
-"La expresión regular \"{0}\" tuvo un error de análisis sintáctico, error "
-"completo:\n"
+"La expresión regular \"{0}\" tuvo un error al deserializar, error completo:\n"
 "\n"
 "{1}"
 
 msgid "Cannot parse timestamp ''{0}''"
-msgstr "No se puede analizar la marca de tiempo ''{0}''"
+msgstr "No se puede deserializar la marca de tiempo ''{0}''"
 
 msgid "Expecting {0} after {1}"
 msgstr "Se esperaba {0} después de {1}"
@@ -2958,7 +2958,7 @@ msgid "Unexpected token. Expected {0}, found {1}"
 msgstr "Elemento no esperado. Se esperaba {0} pero se encontró {1}"
 
 msgid "Failed to parse MapCSS selector"
-msgstr "Hubo una falla al interpretar el selector de MapCSS"
+msgstr "Hubo un error al deserializar el selector de MapCSS"
 
 msgid "Unexpected token: {0}"
 msgstr "Credencial de autentificación inexperada: {0}"
@@ -3653,8 +3653,8 @@ msgstr "Sin capa seleccionada"
 msgid ""
 "WMTS Parser error - start element {0} has different name than end element {2}"
 msgstr ""
-"Error del analizador WMTS - el elemento de inicio {0} tiene un nombre "
-"diferente al del elemento {2}"
+"Error al deserializar el WMTS - el elemento de inicio {0} tiene un nombre "
+"diferente al del elemento final {2}"
 
 msgid ""
 "Only square tiles are supported. {0}x{1} returned by server for TileMatrix "
@@ -3940,7 +3940,8 @@ msgstr ""
 "o 7)"
 
 msgid "Unable to parse value of parameter ''towgs84'' (''{0}'')"
-msgstr "No se puede analizar el valor del parámetro ''towgs84'' (''{0}'')"
+msgstr ""
+"No se puede deserializar el valor del parámetro ''towgs84'' (''{0}'')"
 
 msgid "Projection required (+proj=*)"
 msgstr "Requiere protección (+proj=*)"
@@ -3959,12 +3960,14 @@ msgid "Expected number argument for parameter ''{0}''"
 msgstr "Número esperado de argumentos para el parámetro ''{0}''"
 
 msgid "Unable to parse value ''{1}'' of parameter ''{0}'' as number."
-msgstr "Imposible convertir valor ''{1}'' del parametro ''{0}'' como numero"
+msgstr ""
+"Imposible deserializar el valor ''{1}'' del parámetro ''{0}'' como numero."
 
 msgid ""
 "Unable to parse value ''{1}'' of parameter ''{0}'' as coordinate value."
 msgstr ""
-"Imposible convertir valor ''{1}'' del parametro ''{0}'' como coordenada"
+"Imposible deserializar el valor ''{1}'' del parametro ''{0}'' como "
+"coordenada."
 
 msgid "Custom Projection"
 msgstr "Proyeccion ajustada"
@@ -4296,9 +4299,6 @@ msgstr "Etiquetas de Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Busca errores en etiquetas relacionadas a Internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " La URL no puede ser convertida a ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -4460,7 +4460,7 @@ msgid "Unexpected token:"
 msgstr "Elemento inesperado:"
 
 msgid "Unexpected token (school holiday parser):"
-msgstr "Elemento inesperado (analizador de vacaciones escolares):"
+msgstr "Elemento inesperado (al deserializar las vacaciones escolares):"
 
 msgid "Unexpected token in number range:"
 msgstr "Elemento inesperado en el rango de números:"
@@ -9598,11 +9598,11 @@ msgid ""
 msgstr ""
 "El comentario para los datos que va a subir es <i>inexistente</i> o <i>muy "
 "corto</i>.<br /><br />Esto técnicamente está permitido pero, por favor, "
-"considere que muchos usuarios que están siguiendo los cambios que se "
+"considere que muchos usuarios que están siguiendo los cambios que se<br /> "
 "realizan en su área dependen de comentarios significativos sobre los "
-"conjuntos de cambios que se han realizado para entender lo que está pasando. "
-"<b>Si emplea un minuto para explicar brevemente su edición hará la vida más "
-"sencilla a muchos otros \"mapeadores\"</b>."
+"conjuntos de cambios que se han realizado para<br /> entender lo que está "
+"pasando. <b>Si emplea un minuto para explicar brevemente su edición hará la "
+"vida más sencilla<br /> a muchos otros \"mapeadores\"</b>."
 
 msgid "Please specify a changeset source"
 msgstr "Por favor especifique la fuente del conjunto de cambios"
@@ -9985,8 +9985,10 @@ msgstr "haga zoom acercando para cargar cualquier tesela"
 msgid "zoom in to load more tiles"
 msgstr "haga zoom acercando para cargar más teselas"
 
-msgid "increase zoom level to see more detail"
-msgstr "incrementa el nivel de zoom para ver más detalles"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"aumentar el nivel de zoom de las teselas (cambio de resolución) para ver más "
+"detalles"
 
 msgid "No tiles at this zoom level"
 msgstr "No hay teselas a este nivel de zoom"
@@ -10845,7 +10847,7 @@ msgstr[1] ""
 
 msgid "Failed to parse Mappaint styles from ''{0}''. Error was: {1}"
 msgstr ""
-"Error al analizar los estilos Mappaint desde ''{0}''. El error fue: {1}"
+"Error al deserializar los estilos Mappaint desde ''{0}''. El error fue: {1}"
 
 msgid "Failed to locate image ''{0}''"
 msgstr "No se pudo localizar la imagen ''{0}''"
@@ -12584,9 +12586,9 @@ msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=400>Error is: [{1}:{2}] {3}</table></html>"
 msgstr ""
-"<html>No se pudo analizar sintácticamente la fuente predeterminada de "
-"etiquetas {0}.  ¿Realmente desea usarla?<br><br><table width=400>El error "
-"es: [{1}:{2}] {3}</table></html>"
+"<html>No se pudo deserializar el etiquetado fuente predeterminado {0}.  "
+"¿Está seguro que desea utilizarlo?<br><br><table width=400>El error es: "
+"[{1}:{2}] {3}</table></html>"
 
 msgid ""
 "<html>Tagging preset source {0} can be loaded but it contains errors. Do you "
@@ -12600,9 +12602,9 @@ msgid ""
 "<html>Unable to parse tagging preset source: {0}. Do you really want to use "
 "it?<br><br><table width=600>Error is: {1}</table></html>"
 msgstr ""
-"<html>No se puede analizar sintácticamente la fuente predeterminada de "
-"etiquetas: {0}. ¿Realmente desea usarla?<br><br><table width=600>El error "
-"es: {1}</table></html>"
+"<html>No se puede deserializar el etiquetado fuente predeterminado: {0}. "
+"¿Está seguro que desea utilizarlo?<br><br><table width=600>El error es: "
+"{1}</table></html>"
 
 msgid "Sort presets menu alphabetically"
 msgstr "Ordenar alfabéticamente el menú de predefinidos"
@@ -13869,7 +13871,7 @@ msgid "Adding certificate for TLS connections: {0}"
 msgstr "Añadiendo certificado para conexiones TLS: {0}"
 
 msgid "Failed to parse date ''{0}'' replied by server."
-msgstr "Fallo al verificar la fecha \"{0}\" respondida por el servidor."
+msgstr "Fallo al deserializar la fecha \"{0}\" respondida por el servidor."
 
 msgid ""
 "Unexpected format of error header for conflict in changeset update. Got "
@@ -14046,8 +14048,8 @@ msgstr ""
 
 msgid "Parse error: invalid document structure for GPX document."
 msgstr ""
-"Error en el análisis sintáctico: estructura de documento invalida para un "
-"documento GPX."
+"Error al deserializar: estructura de documento invalida para un documento "
+"GPX."
 
 msgid "(at line {0}, column {1})"
 msgstr "(en la línea {0}, columna {1})"
@@ -15276,8 +15278,8 @@ msgid ""
 "Failed to parse plugin list document from site ''{0}''. Skipping site. "
 "Exception was: {1}"
 msgstr ""
-"Fallo al revisar el documento la lista de complementos del sitio \"{0}\". "
-"Omitiendo sitio. La excepción fue:  {1}"
+"Fallo al deserializar el documento con la lista de complementos del sitio "
+"\"{0}\". Omitiendo sitio. La excepción fue:  {1}"
 
 msgid "Processing plugin list from site ''{0}''"
 msgstr "Procesando la lista de complementos desde el sitio ''{0}''"
@@ -15868,7 +15870,7 @@ msgid ""
 "Failed to parse field ''{1}'' in preference with key ''{0}''. Exception was: "
 "{2}. Cannot restore window geometry from preferences."
 msgstr ""
-"Fallo al interpretar el campo \"{1}\" en la preferencia con la llave "
+"Fallo al deserializar el campo \"{1}\" en la preferencia con la clave "
 "\"{0}\". La excepción fue: {2}. No se puede restaurar la geometría de la "
 "ventana a partir de las preferencias."
 
@@ -16002,8 +16004,8 @@ msgstr ""
 
 msgid "Error while parsing search expression on position {0}"
 msgstr ""
-"Error encontrado en la posición {0} mientras se parseaba la expresión de "
-"búsqueda"
+"Error encontrado en la posición {0} mientras se deserializaba la expresión "
+"de búsqueda"
 
 msgid "Unexpected char on {0}. Expected {1} found {2}"
 msgstr "Caracter inesperado en {0}. Se esperaba {1} pero se encontró {2}"
@@ -16363,6 +16365,9 @@ msgstr "Mapa de calor de ciclismo Strava"
 msgid "Strava running heatmap"
 msgstr "Mapa de calor para corredores de Strava"
 
+msgid "Strava both heatmap"
+msgstr "Mapa de calor de Strava (ambos)"
+
 msgid "Locator Overlay"
 msgstr "Superponer ubicador"
 
@@ -16524,7 +16529,7 @@ msgid "TEC bus lines (2014)"
 msgstr "Líneas de transporte urbano TEC (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin:cotonou_pleiade_2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Sectores Urbanos"
@@ -16604,8 +16609,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr ""
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Burdeos - 2012"
@@ -17630,6 +17635,9 @@ msgstr ""
 "Hable con los usuarios más cercanos que estén también editando el mapa. Será "
 "notificado cuando alguien se aproxime a su área de edición."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Permite visualizar un archivo GeoJSON como una capa."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17772,7 +17780,7 @@ msgstr ""
 "los informes de errores existentes mediante el uso de este componente."
 
 msgid "Allows the user to work with pictures hosted at mapillary.com"
-msgstr ""
+msgstr "Permite al usuario trabajar con fotos hospedadas en mapillary.com"
 
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
@@ -17895,6 +17903,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Brinda validación y arreglos para rutas de transporte público de acuerdo con "
+"la versión 2 de el esquema de transporte público"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -18100,10 +18110,10 @@ msgid "concrete"
 msgstr "hormigón"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "concreto:planchas"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "concreto:carriles"
 
 msgid "paving_stones"
 msgstr "pavimento adoquinado"
@@ -19058,7 +19068,7 @@ msgid "Seasonal"
 msgstr "Estacional"
 
 msgid "In the tidal range"
-msgstr "En el rango de la marea"
+msgstr "Mareal"
 
 msgid "culvert"
 msgstr "alcantarilla"
@@ -19543,18 +19553,36 @@ msgstr "Tipo de pista"
 msgid "grade1"
 msgstr "Grado 1 (pavimentada)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Sólido: superficie dura pavimentada o fuertemente compactada"
+
 msgid "grade2"
 msgstr "Grado 2 (de áridos o zahorra)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+"En su mayoría sólido: grava/piedra con un poco de material suave mezclado"
+
 msgid "grade3"
 msgstr "Grado 3 (de áridos con vegetación entre rodaduras)"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Mezcla pareja de materiales suaves y duros"
+
 msgid "grade4"
 msgstr "Grado 4 (de tierra con vegetación entre rodaduras)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+"En su mayoría suave: tierra/arena/zacate con un poco de material duro "
+"mezclado"
+
 msgid "grade5"
 msgstr "Grado 5 (con rodaduras apenas visibles entre la vegetación)"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Suave: tierra/arena/zacate"
+
 msgid "MTB Scale"
 msgstr "Escala MTB"
 
@@ -20352,7 +20380,7 @@ msgid "Marina"
 msgstr "Puerto deportivo"
 
 msgid "Dump Station"
-msgstr "Estación de descarga"
+msgstr "Vaciado de aguas negras"
 
 msgid "public"
 msgstr "público"
@@ -20769,6 +20797,72 @@ msgstr "Voltaje"
 msgid "Amperage"
 msgstr "Amperaje"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Tipos de vehículos que pueden ser cobrados:"
+
+msgid "Scooter"
+msgstr "Scooter"
+
+msgid "Truck"
+msgstr "Camión"
+
+msgid "Number of Sockets:"
+msgstr "Número de enchufes"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Tipo 1 (Yakazi)"
+
+msgid "Type 1 Combo"
+msgstr "Combo Tipo 1"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Tipo 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Combo Tipo 2"
+
+msgid "Type 3 (SCAME)"
+msgstr "Tipo 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Supercargador Tesla"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE blue"
+
+msgid "CEE red 16A"
+msgstr "CEE red 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE red 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Autenticación:"
+
+msgid "Phone call"
+msgstr "Llamada telefónica"
+
+msgid "Short message"
+msgstr "Mensaje corto"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Tarjeta de membresía"
+
 msgid "Wash"
 msgstr "Limpieza"
 
@@ -20883,7 +20977,7 @@ msgid "Bicycles are washed (for a fee)"
 msgstr "Se lavan bicicletas (pagando)"
 
 msgid "Public Bicycle Repair Station"
-msgstr "Estación Pública de Reparación de Bicicletas"
+msgstr "Estación pública para reparación de bicicletas"
 
 msgid "Chain tool"
 msgstr "Herramienta de cadena"
@@ -20975,9 +21069,6 @@ msgstr "Parada de tranvía (etiqueta en desuso)"
 msgid "Train"
 msgstr "Tren"
 
-msgid "Railway station (legacy)"
-msgstr "Estación de ferrocarril (etiqueta en desuso)"
-
 msgid "Railway halt (legacy)"
 msgstr "Apeadero de ferrocarril (etiqueta en desuso)"
 
@@ -21002,15 +21093,6 @@ msgstr "Refugio"
 msgid "Waste Basket/Trash Can"
 msgstr "Papelera"
 
-msgid "Highway platform (legacy)"
-msgstr "Plataforma de carretera (etiqueta en desuso)"
-
-msgid "Railway platform (legacy)"
-msgstr "Andén de ferrocarril (etiqueta en desuso)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estación de ferrocarril"
@@ -21402,7 +21484,7 @@ msgid "Used for the water area only."
 msgstr "Utilizado sólo para la zona de aguas."
 
 msgid "Fitness Station"
-msgstr "Estación de gimnsia/ejercicios"
+msgstr "Parque de gimnasia o ejercicios"
 
 msgid "Sauna"
 msgstr "Sauna"
@@ -22096,7 +22178,7 @@ msgid "Waste Disposal/Dumpster"
 msgstr "Contenedor de residuos"
 
 msgid "Sanitary Dump Station"
-msgstr "Estación de descarga sanitaria"
+msgstr "Vaciado de aguas negras"
 
 msgid "Suction pumpout"
 msgstr "Bombeo de succión"
@@ -24813,9 +24895,6 @@ msgstr "Árbol"
 msgid "A single tree."
 msgstr "Un árbol solo"
 
-msgid "Botanical Name"
-msgstr "Nombre botánico"
-
 msgid "Tree Row"
 msgstr "Fila de árboles"
 
@@ -25442,7 +25521,7 @@ msgid "Boundary type"
 msgstr "Tipo de frontera"
 
 msgid "administrative"
-msgstr "administrativa"
+msgstr "administrativo"
 
 msgid "maritime"
 msgstr "marítimo"
@@ -25877,6 +25956,27 @@ msgstr "{0} y {1} junto con {2} y valores en conflicto"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Combinación de etiquetas sospechosa: {0} and {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} en una relación sin {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Vía fluvial largas con {0} pero sin una etiqueta que la defina como un túnel "
+"o paso subterráneo. Elimine {1} o agregue una etiqueta de túnel si procede. "
+"También puedes validar el cruce de puentes y sus {1} etiquetas."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Vía fluvial corta con {0} pero sin una etiqueta que la defina como un túnel "
+"o paso subterráneo. Elimine {1} o agregue una etiqueta de túnel si procede. "
+"También puedes validar el cruce de puentes y sus {1} etiquetas."
+
 msgid "{0} is deprecated"
 msgstr "{0} está obsoleto"
 
@@ -26052,6 +26152,9 @@ msgstr ""
 "Vía fluvial que finaliza sin una conexión con otro curso de agua o la "
 "dirección de la vía fluvial es errónea."
 
+msgid "Coastline inside {1}"
+msgstr "Línea de costa hacia adentro {1}"
+
 msgid "abbreviated street name"
 msgstr "nombre de calle abreviado"
 
@@ -26453,6 +26556,9 @@ msgstr "Mostrar la capa de grilla de elevación"
 msgid "Elevation Grid"
 msgstr "Grilla de elevación"
 
+msgid "increase zoom level to see more detail"
+msgstr "incrementa el nivel de zoom para ver más detalles"
+
 msgid "No SRTM data"
 msgstr "No hay datos de SRTM"
 
@@ -28570,15 +28676,15 @@ msgstr "entre {0} {1} y {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  añadiendo {0} {1}"
 
+msgid "EditGpx"
+msgstr "Editar GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Capa para la edición de trazas GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir a capa GPX con tiempo anonimizado"
 
-msgid "EditGpx"
-msgstr "Editar GPX"
-
 msgid "edit gpx tracks"
 msgstr "editar trazas GPX"
 
@@ -28701,6 +28807,18 @@ msgstr "Limpiar registro"
 msgid "Show users on map"
 msgstr "Mostrar usuarios en el mapa"
 
+msgid "GeoJSON file"
+msgstr "Archivo GeoJSON"
+
+msgid "Loading json file..."
+msgstr "Cargando archivo JSON..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Capa de datos de un archivo GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Error al cargar el archivo GeoJSON {0}"
+
 msgid "Position only"
 msgstr "Solo posición"
 
@@ -29468,9 +29586,6 @@ msgstr "Mostrar fotos sin geoetiquetar"
 msgid "Imported Images"
 msgstr "Imágenes importadas"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Archivos de imagen (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importar gráficos vectoriales"
 
@@ -30035,6 +30150,15 @@ msgstr "Unir/separar imágenes"
 msgid "Join Mapillary pictures"
 msgstr "Unir imágenes de Mapillary"
 
+msgid "Submit changeset"
+msgstr "Enviar conjunto de cambios"
+
+msgid "Submit the current changeset"
+msgstr "Enviar el conjunto de cambios actual"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Enviar el conjunto de cambios actual a Mapillary"
+
 msgid "Upload pictures"
 msgstr "Subir fotos"
 
@@ -30074,6 +30198,18 @@ msgstr "Copiar etiqueta de llave"
 msgid "Edit on website"
 msgstr "Editar en página web"
 
+msgid "Current Mapillary changeset"
+msgstr "Conjunto de cambios de Mapillary actual"
+
+msgid "Open Mapillary changeset dialog"
+msgstr "Abrir el conjunto de cambios de Mapillary actual"
+
+msgid "Mapillary changeset"
+msgstr "Conjunto de cambios de Mapillary"
+
+msgid "Submit"
+msgstr "Enviar"
+
 msgid "Export all images"
 msgstr "Exportar todas las imágenes"
 
@@ -30212,9 +30348,6 @@ msgstr "Pausar"
 msgid "Pauses the walk."
 msgstr "Pausar la caminata."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Invertir la posición de los botones al mostrar las imágenes."
-
 msgid "Display hour when the picture was taken"
 msgstr "Mostrar la hora de cuando la fotografía fue tomada."
 
@@ -30227,7 +30360,7 @@ msgstr ""
 "siguiente/anterior."
 
 msgid "Preview images when hovering its icon"
-msgstr ""
+msgstr "Vista previa de imágenes cuando el mouse está en su icono"
 
 msgid "Download mode"
 msgstr "Modo de descarga"
@@ -30311,12 +30444,22 @@ msgstr "Descargando imágenes de Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Imágenes de Mapillary totales: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Enviando el conjunto de cambios de Mapillary"
+
 msgid "No images found"
 msgstr "No se encontraron las imágenes"
 
 msgid "Finished upload"
 msgstr "Carga terminada"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+"No se ha validado. Por favor, inicie sesión de Mapillary en Preferencias"
+
+msgid "Not Logged in to Mapillary"
+msgstr "No se encuentra conectado a Mapillary"
+
 msgid "Uploading: {0}"
 msgstr "Cargando: {0}"
 
@@ -31046,8 +31189,8 @@ msgid ""
 "Failed to parse module list document from site ''{0}''. Skipping site. "
 "Exception was: {1}"
 msgstr ""
-"Fallo al interpretar el documento de lista de módulos desde el sitio "
-"''{0}''.  Se saltará ese sitio. La excepción fue: {1}"
+"Fallo al deserializar el documento con la lista de módulos desde el sitio "
+"''{0}''.  Se omitirá este sitio. La excepción fue: {1}"
 
 msgid "Processing module list from site ''{0}''"
 msgstr "Procesando lista de módulos desde el sitio '' {0}''"
@@ -31227,10 +31370,10 @@ msgid "Tolerance is not a number"
 msgstr "La tolarancia no es un número"
 
 msgid "Could not parse color"
-msgstr "No se pudo analizar el color"
+msgstr "No se pudo deserializar el color"
 
 msgid "Could not parse max path count"
-msgstr "No se pudo traducir el contador máximo de caminos"
+msgstr "No se pudo deserializar el contador máximo de rutas"
 
 msgid "Parsing file"
 msgstr "Analizando sintácticamente el archivo"
@@ -31266,7 +31409,7 @@ msgid "Please set a projection."
 msgstr "Por favor seleccione una proyección."
 
 msgid "Could not parse numbers. Please check."
-msgstr "No se pudieron analizar los números. Por favor, revíselo."
+msgstr "No se pudieron deserializar los números. Por favor, revíselo."
 
 msgid "Building JOSM layer"
 msgstr "Armando capa JOSM"
@@ -31702,7 +31845,7 @@ msgstr ""
 "Una línea de coordenadas de polígonos debe contener exactamente 2 números"
 
 msgid "Unable to parse {0} as a number"
-msgstr "No se pudo interpretar {0} como un número"
+msgstr "No se pudo deserializar {0} como un número"
 
 msgid "Invalid coordinates were found: {0}, {1}"
 msgstr "Se encontraron coordenadas incorrectas: {0}, {1}"
@@ -31777,37 +31920,96 @@ msgstr "Complemento Proj4J"
 msgid "Code"
 msgstr "Código"
 
-msgid "Gaps"
-msgstr ""
+msgid "Add stop position"
+msgstr "Añadir posición de parada"
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Recordar mi elección y no volver a preguntar en esta sesión"
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Las relaciones de ruta tienen miembros incompletos.\n"
+"Necesitan ser descargados para proceder a la validación.\n"
+"¿Desea descargarlas?"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
+"El complemento PT_Assistant encontró que esta relación (ID = {0}) tiene "
+"errores:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} error de dirección"
+msgstr[1] "{0} errores de dirección"
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} error en el tipo de carretera"
+msgstr[1] "{0} errores en el tipo de carretera"
+
+msgid "How do you want to proceed?"
+msgstr "¿Cómo desea proceder?"
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
+msgid "Public Transport Assistant tests"
+msgstr "Tests del Asistente de Transporte Público"
+
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+"Comprobar si las relaciones de ruta son compatibles con la versión 2 del "
+"transporte público"
+
+msgid "Fix error"
+msgstr "Arreglar error"
+
+msgid "PT: dummy test warning"
+msgstr "PT: advertencia de ensayo simulado"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "PT: La ruta contiene un vacío que puede ser arreglado si se ordena"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+"PT: Los roles de los miembros de la relación no coinciden con las etiquetas"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "PT: La ruta debe empezar y terminar con una posición de parada"
+
+msgid "PT: First or last way needs to be split"
+msgstr "PT: Es necesario dividir la primera o última vía"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+"PT: El tipo de ruta no corresponde con el tipo de carretera por la que pasa"
+
+msgid "PT: Road is under construction"
+msgstr "PT: La carretera se encuentra en construcción"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
+"PT: La ruta pasa por una carretera de un único sentido en la dirección "
+"equivocada"
 
 msgid "Can''t parse a time from this string."
-msgstr "No se puede interpretar una hora con esta cadena de caracteres."
+msgstr "No se puede deserializar una hora con esta cadena de caracteres."
 
 msgid "Invalid value"
 msgstr "Valor no válido"
@@ -32212,6 +32414,12 @@ msgstr "Fijar funciones de los miembros de la relación elegidos"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completar multipolígono para la vía {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Dos anillos son iguales y esto no debería ser así."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolígonos desde anillos"
+
 msgid "Node without ''house'' role found"
 msgstr "Se encontró un nodo sin el rol ''house''"
 
@@ -33286,7 +33494,7 @@ msgid "Only digits allowed in osmid: ''{0}''."
 msgstr "Se admiten dígitos únicamente en osmid: \"{0}\"."
 
 msgid "Could not parse OpenPGP message."
-msgstr "No se pudo interpretar el mensaje OpenPGP."
+msgstr "No se pudo deserializar el mensaje OpenPGP."
 
 msgid "Prepare stuff..."
 msgstr "Preparándose..."
@@ -34051,12 +34259,6 @@ msgstr "Borra el miembro de la restricción de giro"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Cambie al Editor Básico y seleccione una vía"
 
-msgid "Undelete object..."
-msgstr "Recuperar objeto..."
-
-msgid "Undelete object by id"
-msgstr "Recuperar objeto por id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "No se ha podido recuperar el nodo {0}. El objeto probablemente se haya "
@@ -34072,6 +34274,12 @@ msgstr ""
 "No se ha podido recuperar la relación {0}. El objeto probablemente se haya "
 "eliminado."
 
+msgid "Undelete object..."
+msgstr "Recuperar objeto..."
+
+msgid "Undelete object by id"
+msgstr "Recuperar objeto por id"
+
 msgid "Undelete Object"
 msgstr "Recuperar objeto borrado"
 
@@ -34824,6 +35032,12 @@ msgstr[0] ""
 msgstr[1] ""
 "¿Sobrescribir las etiquetas ''{0}'' {1} de {2} con el nuevo valor ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Añadir nombres desde Wikipedia"
 
@@ -34862,11 +35076,14 @@ msgstr "Disponible en el conjunto de datos local"
 msgid "Not linked yet"
 msgstr "no enlazado aún"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Obtiene todas las coordenadas de Wikipedia para la vista actual"
diff --git a/i18n/po/et.po b/i18n/po/et.po
index 767832d..c1f183f 100644
--- a/i18n/po/et.po
+++ b/i18n/po/et.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-01-02 11:25+0000\n"
 "Last-Translator: AivoK <aivo.kuhlberg at hot.ee>\n"
 "Language-Team: Estonian <et 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: 2016-06-05 04:39+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:41+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: et\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2698,14 +2698,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objektid allalaadimisalas (ja kõik nende sõlmed / relatsiooni liikmed)"
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2721,6 +2713,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Leitud {0} vastet"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -4003,9 +4003,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9152,7 +9149,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14805,6 +14802,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15045,7 +15045,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16025,6 +16025,9 @@ msgstr ""
 "Vestle kasutajatega, kes kaarti läheduses muudavad, teavitus, kui keegi "
 "tuleb lähedale."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17815,18 +17818,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -19016,6 +19034,72 @@ msgstr "Pinge"
 msgid "Amperage"
 msgstr "Amperaaž"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Autopesula"
 
@@ -19220,9 +19304,6 @@ msgstr "Trammipeatus (pärand)"
 msgid "Train"
 msgstr "Rong"
 
-msgid "Railway station (legacy)"
-msgstr "Raudteejaam (pärand)"
-
 msgid "Railway halt (legacy)"
 msgstr "Raudteepeatus (pärand)"
 
@@ -19247,15 +19328,6 @@ msgstr "Varjualune"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr "Raudteeperroon (pärand)"
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Jaam"
@@ -23042,9 +23114,6 @@ msgstr "Üksik puu"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Botaaniline nimi"
-
 msgid "Tree Row"
 msgstr "Puuderivi"
 
@@ -24081,6 +24150,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24233,6 +24317,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24605,6 +24692,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26483,13 +26573,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26611,6 +26701,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27309,9 +27411,6 @@ msgstr "Kuva mitte-geosildistatud fotosid"
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27846,6 +27945,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27885,6 +27993,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28023,9 +28143,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28117,12 +28234,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29487,33 +29613,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29913,6 +30087,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31579,19 +31759,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32249,6 +32429,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32281,11 +32467,14 @@ msgstr "Saadaval kohalikus andmekogumis"
 msgid "Not linked yet"
 msgstr "Veel linkimata"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Tõmbab Vikipeediast alla kõik jooksva vaate koordinaadid"
diff --git a/i18n/po/eu.po b/i18n/po/eu.po
index 67ee985..31ef7d6 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:34+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:35+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: eu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2708,14 +2708,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Ez da ezer aurkitu ''{0}'' bilaketarentzat"
 
@@ -2731,6 +2723,14 @@ msgstr "Aukeratutako gunean ez da ezer aurkitu  ''{0}'' hori bilatzeagatik"
 msgid "Found {0} matches"
 msgstr "{0} emaitza aurkitu dira"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "Maiuskula/minuskula"
@@ -4046,9 +4046,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9185,7 +9182,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14753,6 +14750,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14993,7 +14993,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15976,6 +15976,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17794,18 +17797,33 @@ msgstr "Pista-mota"
 msgid "grade1"
 msgstr "1. gradukoa"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "2. gradukoa"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "3. gradukoa"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "4. gradukoa"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "5. gradukoa"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB eskala"
 
@@ -18995,6 +19013,72 @@ msgstr "Tentsioa"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Garbiketa"
 
@@ -19199,9 +19283,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19226,15 +19307,6 @@ msgstr "Babeslekua"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estazioa"
@@ -23021,9 +23093,6 @@ msgstr "Zuhaitza"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Izen-botanikoa"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24060,6 +24129,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24212,6 +24296,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24584,6 +24671,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26451,13 +26541,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26579,6 +26669,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27275,9 +27377,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27809,6 +27908,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27848,6 +27956,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27986,9 +28106,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28080,12 +28197,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29447,33 +29573,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29873,6 +30047,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31534,19 +31714,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32210,6 +32390,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32242,10 +32428,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/fa.po b/i18n/po/fa.po
index 5ff2d0a..ff5830f 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:56+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:58+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: fa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2685,14 +2685,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2708,6 +2700,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3973,9 +3973,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9067,7 +9064,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14627,6 +14624,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14867,7 +14867,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15845,6 +15845,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17628,18 +17631,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18829,6 +18847,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -19033,9 +19117,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19060,15 +19141,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22855,9 +22927,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23894,6 +23963,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24046,6 +24130,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24418,6 +24505,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26285,13 +26375,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26413,6 +26503,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27109,9 +27211,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27643,6 +27742,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27682,6 +27790,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27820,9 +27940,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27914,12 +28031,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29276,33 +29402,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29702,6 +29876,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31363,19 +31543,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32031,6 +32211,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32063,10 +32249,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/fi.po b/i18n/po/fi.po
index 1144067..9c6ef2d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:41+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:42+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: fi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2811,14 +2811,6 @@ msgstr ""
 "kaikki kohteet ladatulta alueelta (ja kaikki näiden polkujen muut pisteet / "
 "relaatioiden muut jäsenet)"
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Hakusanalla \"{0}\" ei löytynyt mitään"
 
@@ -2834,6 +2826,14 @@ msgstr "Valinnasta ei löytynyt mitään hakusanalla \"{0}\""
 msgid "Found {0} matches"
 msgstr "Löytyi {0} osumaa"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "HK"
@@ -4176,9 +4176,6 @@ msgstr "Internet -tagit"
 msgid "Checks for errors in internet-related tags."
 msgstr "Etsii virheitä muualle internetiin viittaavista tageista."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9624,7 +9621,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -15441,6 +15438,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15681,7 +15681,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16667,6 +16667,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18483,18 +18486,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -19684,6 +19702,72 @@ msgstr "Jännite"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Autopesula"
 
@@ -19888,9 +19972,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19915,15 +19996,6 @@ msgstr "Katos"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Asema"
@@ -23710,9 +23782,6 @@ msgstr "Puu"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Kasvitieteellinen nimi"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24750,6 +24819,21 @@ msgstr "{0} ja {1} samassa kohteessa {2}:n kanssa ja arvot ristiriidassa"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Epäilyttävä tagiyhdistelmä: {0} and {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} ei ole enää suositeltu merkintätapa"
 
@@ -24910,6 +24994,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -25296,6 +25383,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -27183,15 +27273,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr ""
+
 msgid "Layer for editing GPX tracks"
 msgstr ""
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Muuta GPX-tasoksi poistaen alkuperäiset aikatiedot"
 
-msgid "EditGpx"
-msgstr ""
-
 msgid "edit gpx tracks"
 msgstr "Muokkaa (poista) GPX-tason tietoja"
 
@@ -27311,6 +27401,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -28024,9 +28126,6 @@ msgstr "Näytä kuvat, joita ei ole geo-merkitty"
 msgid "Imported Images"
 msgstr "Tuodut kuvat"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Kuvatiedostot (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -28569,6 +28668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28608,6 +28716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28746,9 +28866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28840,12 +28957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30221,33 +30347,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30649,6 +30823,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -32319,12 +32499,6 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
-msgstr "Palauta poistettu objekti..."
-
-msgid "Undelete object by id"
-msgstr "Palauta poistettu objekti objektitunnisteen perusteella"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -32334,6 +32508,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Palauta poistettu objekti..."
+
+msgid "Undelete object by id"
+msgstr "Palauta poistettu objekti objektitunnisteen perusteella"
+
 msgid "Undelete Object"
 msgstr "Palauta objekti"
 
@@ -33041,6 +33221,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Lisää nimen puuttuvat kieliversiot Wikipediasta"
 
@@ -33077,10 +33263,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/fil.po b/i18n/po/fil.po
index 10cecc0..eb28b31 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:11+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:13+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: fil\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/fo.po b/i18n/po/fo.po
index 2341c43..c9bfa90 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:40+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:41+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}: valmøguleiki ''{1}'' er tvítýddur"
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/fr.po b/i18n/po/fr.po
index 99b3a36..99d56c2 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-05-13 07:05+0000\n"
-"Last-Translator: Penegal <Unknown>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-07 10:32+0000\n"
+"Last-Translator: Djam <specimail-forums at yahoo.fr>\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: 2016-06-05 04:41+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:42+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: fr\n"
 "X-Poedit-Bookmarks: 1767,-1,-1,2669,-1,-1,-1,-1,-1,-1\n"
 
@@ -689,7 +689,7 @@ msgid "No intersection found. Nothing was changed."
 msgstr "Aucune intersection n’a été trouvée."
 
 msgid "Move tags from ways to relations"
-msgstr "Déplacer les tags des chemins vers les relations"
+msgstr "Déplacer les attributs des chemins vers les relations"
 
 msgid "Reverting changes"
 msgstr "Rétablissement des modifications"
@@ -2849,14 +2849,6 @@ msgstr ""
 "objets (et tous ses nœuds de chemins / membres de relation) dans la zone "
 "téléchargée"
 
-msgid "Searching"
-msgstr "Recherche en cours"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Recherche parmi {0} objet"
-msgstr[1] "Recherche parmi {0} objets"
-
 msgid "No match found for ''{0}''"
 msgstr "Aucun résultat n’a été trouvé pour ''{0}''"
 
@@ -2872,6 +2864,14 @@ msgstr "Aucun résultat n’a été trouvé lors de la recherche ''{0}''"
 msgid "Found {0} matches"
 msgstr "{0} résultats trouvés"
 
+msgid "Searching"
+msgstr "Recherche en cours"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Recherche parmi {0} objet"
+msgstr[1] "Recherche parmi {0} objets"
+
 msgctxt "search"
 msgid "CS"
 msgstr "SC"
@@ -3639,6 +3639,8 @@ msgstr "Aucun calque sélectionné"
 msgid ""
 "WMTS Parser error - start element {0} has different name than end element {2}"
 msgstr ""
+"Erreur du Parser WMTS - l''élément initial {0} a un nom différent de "
+"l''élément de fin {2}"
 
 msgid ""
 "Only square tiles are supported. {0}x{1} returned by server for TileMatrix "
@@ -4010,7 +4012,7 @@ msgstr ""
 "90"
 
 msgid "Sinusoidal"
-msgstr ""
+msgstr "Sinusoïdale"
 
 msgid "Swiss Oblique Mercator"
 msgstr "Mercator oblique suisse"
@@ -4280,9 +4282,6 @@ msgstr "tags internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Recherche d''erreurs dans les tags relatifs à internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " L''URL ne peut pas être convertie en ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'' : {1}"
 
@@ -4334,7 +4333,7 @@ msgid " or "
 msgstr " ou "
 
 msgid "{0}, use {1} instead"
-msgstr "{0}, utilisez {1} au lieu"
+msgstr "{0}, utilisez {1} à la place"
 
 msgid "Adding {0} to tag checker"
 msgstr "Ajouter {0} au vérificateur d''attribut"
@@ -9911,8 +9910,8 @@ msgstr "zoomer pour charger des tuiles"
 msgid "zoom in to load more tiles"
 msgstr "zoomer pour charger davantage de tuiles"
 
-msgid "increase zoom level to see more detail"
-msgstr "Zoomer en avant pour voir les détails"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Pas de tuiles à ce niveau de zoom."
@@ -16260,6 +16259,9 @@ msgstr "Carte de chaleur élo de Strava"
 msgid "Strava running heatmap"
 msgstr "Carte de chaleur piéton de Strava"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Surcouche Localisation"
 
@@ -16420,7 +16422,7 @@ msgid "TEC bus lines (2014)"
 msgstr "Lignes du réseau TEC (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin:cotonou_pleiade_2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Carte des secteurs urbains"
@@ -16500,8 +16502,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr ""
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -16726,10 +16728,10 @@ msgid "Lodi - Italy"
 msgstr "Lodi - Italie"
 
 msgid "Lombardia - Italy (CTR)"
-msgstr ""
+msgstr "Lombardie - Italie (CTR)"
 
 msgid "Lombardia - Italy (CTR DBT)"
-msgstr ""
+msgstr "Lombardie - Italie (CTR DBT)"
 
 msgid "Sicily - Italy"
 msgstr "Sicile - Italie"
@@ -16765,7 +16767,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Lithuanie)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Luxembourg Inspire Chemin de fer"
@@ -17523,6 +17525,9 @@ msgstr ""
 "Discuter avec les utilisateurs qui éditent la carte à proximité, être "
 "notifié quand quelqu’un se rapproche."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19421,18 +19426,33 @@ msgstr "Revêtement"
 msgid "grade1"
 msgstr "catégorie 1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "catégorie 2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "catégorie 3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "catégorie 4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "catégorie 5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Niveau de difficulté VTT"
 
@@ -19947,7 +19967,7 @@ msgid "Kerb"
 msgstr "Bordure"
 
 msgid "Tactile paving"
-msgstr ""
+msgstr "Surface podotactile"
 
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrée (Ouverture d’une barrière)"
@@ -20649,6 +20669,72 @@ msgstr "Tension"
 msgid "Amperage"
 msgstr "Ampérage"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr "Scooter"
+
+msgid "Truck"
+msgstr "Camion"
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Lavage"
 
@@ -20854,9 +20940,6 @@ msgstr "Arrêt de tram (obsolète)"
 msgid "Train"
 msgstr "Train"
 
-msgid "Railway station (legacy)"
-msgstr "Station ferrovière (obsolète)"
-
 msgid "Railway halt (legacy)"
 msgstr "Halte ferrovière (obsolète)"
 
@@ -20881,15 +20964,6 @@ msgstr "Abri"
 msgid "Waste Basket/Trash Can"
 msgstr "Poubelle"
 
-msgid "Highway platform (legacy)"
-msgstr "Quai surélevé (obsolète)"
-
-msgid "Railway platform (legacy)"
-msgstr "Quai (obsolète)"
-
-msgid "funicular"
-msgstr "funiculaire"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Gare"
@@ -24692,9 +24766,6 @@ msgstr "Arbre"
 msgid "A single tree."
 msgstr "Un arbre unique"
 
-msgid "Botanical Name"
-msgstr "Nom botanique"
-
 msgid "Tree Row"
 msgstr "Rangée d''arbres"
 
@@ -25752,6 +25823,21 @@ msgstr "{0} et {1} tous deux avec {2} et valeurs conflictuelles"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Combinaison suspecte de tags : {0} et {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} est déprécié"
 
@@ -25923,6 +26009,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "abbréviation du nom de rue"
 
@@ -26331,6 +26420,9 @@ msgstr "Affiche la couche de grille altimétrique"
 msgid "Elevation Grid"
 msgstr "Grille altimétrique"
 
+msgid "increase zoom level to see more detail"
+msgstr "Zoomer en avant pour voir les détails"
+
 msgid "No SRTM data"
 msgstr "Pas de données SRTM"
 
@@ -28441,15 +28533,15 @@ msgstr "entre {0} {1} et {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  ajout de {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Calque pour modifier les traces GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir en calque GPX en rendant anonyme l’horodatage"
 
-msgid "EditGpx"
-msgstr "EditGPX"
-
 msgid "edit gpx tracks"
 msgstr "Modifier les traces GPX"
 
@@ -28572,6 +28664,18 @@ msgstr "Effacer le journal"
 msgid "Show users on map"
 msgstr "Afficher les utilisateurs sur la carte"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Seulement la position"
 
@@ -29339,9 +29443,6 @@ msgstr "Afficher des photos non géolocalisées"
 msgid "Imported Images"
 msgstr "Images importées"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Fichiers image (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importer des images vectorielles"
 
@@ -29900,6 +30001,15 @@ msgstr "(Dés)assembler les images"
 msgid "Join Mapillary pictures"
 msgstr "Assembler les images Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Envoi de photographies"
 
@@ -29939,6 +30049,18 @@ msgstr "Copier l’attribut de la clé"
 msgid "Edit on website"
 msgstr "Éditer sur le site web"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exporter toutes les images"
 
@@ -30077,9 +30199,6 @@ msgstr "Pause"
 msgid "Pauses the walk."
 msgstr "Suspend la marche."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Inverser la position des boutons lors de l’affichage des photos."
-
 msgid "Display hour when the picture was taken"
 msgstr "Afficher l''heure de la prise de vue"
 
@@ -30177,12 +30296,21 @@ msgstr "Téléchargement des photos Mapillary en cours"
 msgid "Total Mapillary images: {0}"
 msgstr "Nombre total de photos : {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Aucune image trouvée"
 
 msgid "Finished upload"
 msgstr "Envoi terminé"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Envoi en cours : {0}"
 
@@ -31638,33 +31766,81 @@ msgstr "Proj4J greffon"
 msgid "Code"
 msgstr "Code"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -32076,6 +32252,12 @@ msgstr "Corriger les rôles des membres de la relation choisis"
 msgid "Complete multipolygon for way {0}"
 msgstr "Compléter le multipolygone pour le chemin {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Noeud sans \"house\" trouvé"
 
@@ -33931,12 +34113,6 @@ msgstr "Supprimer le membre de l’interdiction de tourner"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Ouvrir l’éditeur basique et choisir un chemin"
 
-msgid "Undelete object..."
-msgstr "Restaurer l’objet…"
-
-msgid "Undelete object by id"
-msgstr "Restaurer l’objet par son identifiant"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Impossible de restaurer le nœud {0}. L’élément a probablement été édité"
@@ -33949,6 +34125,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Impossible de restaurer la relation {0}. L''élément a probablement été édité"
 
+msgid "Undelete object..."
+msgstr "Restaurer l’objet…"
+
+msgid "Undelete object by id"
+msgstr "Restaurer l’objet par son identifiant"
+
 msgid "Undelete Object"
 msgstr "Restaurer l’objet"
 
@@ -34728,6 +34910,12 @@ msgstr[0] ""
 msgstr[1] ""
 "Ecraser ''{0}'' attributs {1} de {2} avec la nouvelle valeur ''{3}'' ?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Ajout du nom depuis Wikipedia"
 
@@ -34766,11 +34954,14 @@ msgstr "Disponible dans le jeu de données local"
 msgid "Not linked yet"
 msgstr "Pas encore lié"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Récupère toutes les coordonnées de Wikipédia dans la vue courante"
diff --git a/i18n/po/ga.po b/i18n/po/ga.po
index 63044e4..29a24bb 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:43+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:44+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/gl.po b/i18n/po/gl.po
index a339ba4..dae9092 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:43+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:44+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: gl\n"
 "X-Poedit-Language: Galician\n"
 
@@ -2779,14 +2779,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr "A procurar"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Non se atoparon coincidencias para «{0}»"
 
@@ -2802,6 +2794,14 @@ msgstr "Non se atopou nada na seleccion buscando por «{0}»"
 msgid "Found {0} matches"
 msgstr "Atopadas {0} coincidencias"
 
+msgid "Searching"
+msgstr "A procurar"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4120,9 +4120,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9372,7 +9369,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -15086,6 +15083,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15326,7 +15326,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16306,6 +16306,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18119,18 +18122,33 @@ msgstr "Tipo de camiño"
 msgid "grade1"
 msgstr "Grado 1 (pavimentada)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "Grado 2 (de áridos)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "Grado 3 (árido con vexetación entre rodaduras)"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "Grado 4 (de terra con vexetación entre rodaduras)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "Grado 5 (con rodaduras apenas visibles entre a vexetación)"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala MTB"
 
@@ -19321,6 +19339,72 @@ msgstr "Voltaxe"
 msgid "Amperage"
 msgstr "Amperaxe"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Limpeza"
 
@@ -19525,9 +19609,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19552,15 +19633,6 @@ msgstr "Refuxio"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estación"
@@ -23347,9 +23419,6 @@ msgstr "Árbore"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Nome botánico"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24386,6 +24455,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24538,6 +24622,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24910,6 +24997,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26792,15 +26882,15 @@ msgstr "entre {0} {1} e {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  engadindo {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditarGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Capa para editar camiños GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Convertir a capa GPX con tempo anónimo"
 
-msgid "EditGpx"
-msgstr "EditarGpx"
-
 msgid "edit gpx tracks"
 msgstr "editar camiños GPX"
 
@@ -26920,6 +27010,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Só posición"
 
@@ -27620,9 +27722,6 @@ msgstr "Amosar fotos non xeolocalizadas"
 msgid "Imported Images"
 msgstr "Imaxes Importadas"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Ficheiros de imaxe (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importar gráficos vectoriais"
 
@@ -28156,6 +28255,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28195,6 +28303,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28333,9 +28453,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28427,12 +28544,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29795,33 +29921,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30221,6 +30395,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31898,12 +32078,6 @@ msgstr "Eliminar o membro da restrición de xiro"
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
-msgstr "Recuperar obxecto…"
-
-msgid "Undelete object by id"
-msgstr "Recuperar obxecto por id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -31913,6 +32087,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Recuperar obxecto…"
+
+msgid "Undelete object by id"
+msgstr "Recuperar obxecto por id"
+
 msgid "Undelete Object"
 msgstr "Recuperar Obxecto"
 
@@ -32567,6 +32747,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32599,10 +32785,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/he.po b/i18n/po/he.po
index 8a8caf6..db7b79d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:45+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:46+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: he\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2624,14 +2624,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "לא נמצאה התאמה עבור \"{0}\""
 
@@ -2647,6 +2639,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "נמצאו {0} התאמות"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3921,9 +3921,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9021,7 +9018,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14595,6 +14592,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14835,7 +14835,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15813,6 +15813,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17596,18 +17599,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18797,6 +18815,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "שטיפה"
 
@@ -19001,9 +19085,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19028,15 +19109,6 @@ msgstr "מקלט"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22823,9 +22895,6 @@ msgstr "עץ"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "שם בוטני"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23862,6 +23931,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24014,6 +24098,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24386,6 +24473,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26253,13 +26343,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26381,6 +26471,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "מיקום בלבד"
 
@@ -27077,9 +27179,6 @@ msgstr "הצג תמונות ללא תיוג גיאוגרפי"
 msgid "Imported Images"
 msgstr "תמונות מיובאות"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "קובצי תמונה (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27614,6 +27713,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27653,6 +27761,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27791,9 +27911,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27885,12 +28002,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29248,33 +29374,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29674,6 +29848,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31335,19 +31515,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32003,6 +32183,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32035,10 +32221,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/hi.po b/i18n/po/hi.po
index 99e9324..8f98b47 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:45+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:47+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: hi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/hr.po b/i18n/po/hr.po
index 6ce41a5..f886111 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:00+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:02+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: hr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2708,14 +2708,6 @@ msgstr "objekti u preuzetom području"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "objekti (i sve točke puta / članovi relacije) u preuzetom području"
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2731,6 +2723,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4019,9 +4019,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9139,7 +9136,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14704,6 +14701,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14944,7 +14944,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15922,6 +15922,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17705,18 +17708,33 @@ msgstr ""
 msgid "grade1"
 msgstr "Kvaliteta1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "Kvaliteta2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "Kvaliteta3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "Kvaliteta4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "Kvaliteta5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB Skala"
 
@@ -18906,6 +18924,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -19110,9 +19194,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19137,15 +19218,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22932,9 +23004,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23971,6 +24040,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24123,6 +24207,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24495,6 +24582,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26362,13 +26452,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26490,6 +26580,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27186,9 +27288,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27720,6 +27819,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27759,6 +27867,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27897,9 +28017,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27991,12 +28108,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29357,33 +29483,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29783,6 +29957,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31445,19 +31625,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32114,6 +32294,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32146,10 +32332,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ht.po b/i18n/po/ht.po
index d88fef2..5b2022e 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:44+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:46+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/hu.po b/i18n/po/hu.po
index ff16cd8..14d1f52 100644
--- a/i18n/po/hu.po
+++ b/i18n/po/hu.po
@@ -8,16 +8,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-02 22:31+0000\n"
-"Last-Translator: Báthory Péter <bathory86p at gmail.com>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-14 20:17+0000\n"
+"Last-Translator: Szem <szem_net at freemail.hu>\n"
 "Language-Team: Hungarian <kde-l10n-hu 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: 2016-06-05 04:46+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:47+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: hu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2834,14 +2834,6 @@ msgstr ""
 "objektumok (és azok vonalainak pontjai / kapcsolat tagjai) a letöltött "
 "területen"
 
-msgid "Searching"
-msgstr "Keresés"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Keresés {0} objektumban"
-msgstr[1] "Keresés {0} objektumokban"
-
 msgid "No match found for ''{0}''"
 msgstr "Nincs találat a(z) \"{0}\" kifejezésre"
 
@@ -2861,6 +2853,14 @@ msgstr "Nem található objektum a kiválasztásban erre keresve: ''{0}''"
 msgid "Found {0} matches"
 msgstr "{0} találat"
 
+msgid "Searching"
+msgstr "Keresés"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Keresés {0} objektumban"
+msgstr[1] "Keresés {0} objektumokban"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4229,9 +4229,6 @@ msgstr "Internet címkék"
 msgid "Checks for errors in internet-related tags."
 msgstr "Internet címkékkel kapcsolatos hibák keresése"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Az URL-t nem lehet ASCII-ba konvertálni: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9795,8 +9792,8 @@ msgstr "csempék megjelenítéséhez közelíts"
 msgid "zoom in to load more tiles"
 msgstr "több csempe megjelenítéséhez közelíts"
 
-msgid "increase zoom level to see more detail"
-msgstr "több részlet megjelenítéséhez növeld a nagyítást"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Nincs csempe ezen a nagyítási szinten"
@@ -16067,6 +16064,9 @@ msgstr "Strava kerékpáros hőtérkép"
 msgid "Strava running heatmap"
 msgstr "Strava futó hőtérkép"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Kereső rátét"
 
@@ -16307,7 +16307,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17330,6 +17330,9 @@ msgstr ""
 "Társalgás a közelben térképet szerkesztő felhasználókkal, értesítsen amikor "
 "valaki közelebb jön."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17774,10 +17777,10 @@ msgid "concrete"
 msgstr "beton"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "betontáblás útburkolat"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "betonozott sávok"
 
 msgid "paving_stones"
 msgstr "térkő (viacolor)"
@@ -17801,13 +17804,13 @@ msgid "gravel"
 msgstr "zúzottkő (nagyszemcsés)"
 
 msgid "pebblestone"
-msgstr "kavics"
+msgstr "kavics (lekerekített)"
 
 msgid "ground"
 msgstr "föld"
 
 msgid "mud"
-msgstr "mocsár"
+msgstr "sár (vizenyős terület)"
 
 msgid "sand"
 msgstr "homok"
@@ -17889,7 +17892,7 @@ msgid "track"
 msgstr "nyomvonal"
 
 msgid "clay"
-msgstr "agyag"
+msgstr "salak"
 
 msgid "dirt"
 msgstr "sár"
@@ -19212,18 +19215,33 @@ msgstr "Födút típusa"
 msgid "grade1"
 msgstr "1. osztály"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "2. osztály"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "3. osztály"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "4. osztály"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "5. osztály"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB skála"
 
@@ -20430,6 +20448,72 @@ msgstr "Feszültség"
 msgid "Amperage"
 msgstr "Áramerősség"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Autómosó"
 
@@ -20634,9 +20718,6 @@ msgstr "Villamosmegálló (örökség)"
 msgid "Train"
 msgstr "Vasúti szerelvény"
 
-msgid "Railway station (legacy)"
-msgstr "Vasútállomás (örökség)"
-
 msgid "Railway halt (legacy)"
 msgstr "Vasúti megálló (örökség)"
 
@@ -20661,15 +20742,6 @@ msgstr "Esőbeálló"
 msgid "Waste Basket/Trash Can"
 msgstr "Szemétkosár/Szemetes"
 
-msgid "Highway platform (legacy)"
-msgstr "Közúti peron (örökség)"
-
-msgid "Railway platform (legacy)"
-msgstr "Peron (örökség)"
-
-msgid "funicular"
-msgstr "sikló"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Állomás"
@@ -24470,9 +24542,6 @@ msgstr "Fa"
 msgid "A single tree."
 msgstr "Egyedülálló fa."
 
-msgid "Botanical Name"
-msgstr "Botanikai név"
-
 msgid "Tree Row"
 msgstr "Fasor"
 
@@ -25530,6 +25599,21 @@ msgstr "{0}, {1} és {2} értéke ugyanaz és ellentmondó az értékük"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Gyanús címke kombináció: {0} és {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} elavult"
 
@@ -25702,6 +25786,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "rövidített utca név"
 
@@ -26100,6 +26187,9 @@ msgstr "A magassági rács réteget mutatja"
 msgid "Elevation Grid"
 msgstr "Magassági Rács"
 
+msgid "increase zoom level to see more detail"
+msgstr "több részlet megjelenítéséhez növeld a nagyítást"
+
 msgid "No SRTM data"
 msgstr "Nincs SRTM adat"
 
@@ -28007,13 +28097,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr "  hozzáadás {0} {1}"
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -28135,6 +28225,18 @@ msgstr "Napló törlése"
 msgid "Show users on map"
 msgstr "Felhasználók mutatása a térképen"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -28848,9 +28950,6 @@ msgstr "Nem geo-cimkézett fotók mutatása"
 msgid "Imported Images"
 msgstr "betöltött képek"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Képfájlok (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Vektorgrafikák betöltés"
 
@@ -29382,6 +29481,15 @@ msgstr "Képek össze/szétkapcsolása"
 msgid "Join Mapillary pictures"
 msgstr "Mapillary képek összekapcsolása"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Képek feltöltése"
 
@@ -29421,6 +29529,18 @@ msgstr "Kulcs címke másolása"
 msgid "Edit on website"
 msgstr "Szerkesztés a weboldalon"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Összes kép exportálása"
 
@@ -29559,9 +29679,6 @@ msgstr "Szünet"
 msgid "Pauses the walk."
 msgstr "Szünetelteti a sétát."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Gombpozíciók felcserélése kép megjelenítésekor."
-
 msgid "Display hour when the picture was taken"
 msgstr "Kép készítési idejének megjelenítése"
 
@@ -29654,12 +29771,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -31037,33 +31163,81 @@ msgstr "Proj4J bővítmény"
 msgid "Code"
 msgstr "Kód"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31465,6 +31639,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -33236,12 +33416,6 @@ msgstr "Tag törlése a kanyarodási korlátozásból"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Váltás az Alap Szerkesztőre és vonal kijelölése"
 
-msgid "Undelete object..."
-msgstr "Objektum visszaállítás..."
-
-msgid "Undelete object by id"
-msgstr "Objektum visszaállítás azonosítóval"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "A(z) {0} pont visszaállítása nem lehetséges. Az objektum valószínűleg "
@@ -33257,6 +33431,12 @@ msgstr ""
 "A(z) {0} kapcsolat visszaállítása nem lehetséges. Az objektum valószínűleg "
 "szerkesztett"
 
+msgid "Undelete object..."
+msgstr "Objektum visszaállítás..."
+
+msgid "Undelete object by id"
+msgstr "Objektum visszaállítás azonosítóval"
+
 msgid "Undelete Object"
 msgstr "Objektum visszaállítása"
 
@@ -33964,6 +34144,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Nevek hozzáadása a Wikipedia-ról"
 
@@ -34002,11 +34188,14 @@ msgstr "A helyi adathalmazban elérhető"
 msgid "Not linked yet"
 msgstr "Nincs még hivatkozás"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Minden koordinátát elhoz a Wikipédiából, az aktuális nézet szerint"
diff --git a/i18n/po/hy.po b/i18n/po/hy.po
index 621730f..df75e06 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:32+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:33+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: hy\n"
 
 msgid "Cancel"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ia.po b/i18n/po/ia.po
index 23bf136..5281602 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:47+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:48+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/id.po b/i18n/po/id.po
index c2917d2..c29344a 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:47+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:49+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: id\n"
 "X-Language: id_ID\n"
 
@@ -2782,14 +2782,6 @@ msgstr ""
 "Objek (dan seluruh way/titik node/titik dan anggota relasi yang ada di "
 "dalamnya) dalam area yang didownload"
 
-msgid "Searching"
-msgstr "Mencari"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Tidak ada yang cocok untuk \"{0}\""
 
@@ -2805,6 +2797,14 @@ msgstr "Tidak ada yang ditemukan dari pilihan untuk pencarian \"{0}\""
 msgid "Found {0} matches"
 msgstr "Ditemukan {0} yang cocok"
 
+msgid "Searching"
+msgstr "Mencari"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4143,9 +4143,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9519,8 +9516,8 @@ msgstr "Perbesar untuk memuat indeks peta"
 msgid "zoom in to load more tiles"
 msgstr "Perbesar untuk memuat indeks lebih banyak"
 
-msgid "increase zoom level to see more detail"
-msgstr "meningkatkan tingkat zoom untuk melihat lebih detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Tidak ada indeks pada tingkat perbesaran ini"
@@ -15568,6 +15565,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15808,7 +15808,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16805,6 +16805,9 @@ msgstr ""
 "Bicara dengan pengguna mengedit peta di sekitarnya, diberitahu ketika "
 "seseorang datang mendekat."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18653,18 +18656,33 @@ msgstr "Tipe Trek"
 msgid "grade1"
 msgstr "kelas1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "kelas2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "kelas3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "kelas4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "kelas5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Skala MTB"
 
@@ -19863,6 +19881,72 @@ msgstr "Tegangan"
 msgid "Amperage"
 msgstr "Tegangan aliran listrik"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Cuci"
 
@@ -20067,9 +20151,6 @@ msgstr "Pemberhentian Tram (peninggalan)"
 msgid "Train"
 msgstr "Kereta"
 
-msgid "Railway station (legacy)"
-msgstr "Stasiun kereta (peninggalan)"
-
 msgid "Railway halt (legacy)"
 msgstr "Pemberhentian kereta"
 
@@ -20094,15 +20175,6 @@ msgstr "Halte"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr "Pembatas Jalan Raya"
-
-msgid "Railway platform (legacy)"
-msgstr "Pembatas Kereta"
-
-msgid "funicular"
-msgstr "Kereta gunung"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stasiun"
@@ -23889,9 +23961,6 @@ msgstr "Pohon"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Nama botani"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -24930,6 +24999,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} sudah usang"
 
@@ -25082,6 +25166,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "mempersingkat nama jalan"
 
@@ -25464,6 +25551,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "meningkatkan tingkat zoom untuk melihat lebih detail"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -27486,15 +27576,15 @@ msgstr "diantara {0} {1} dan {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  menambahkan {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Layer untuk mengubah trek GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Ubah ke layer GPX dengan tidak diketahui"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "edit gpx tracks"
 
@@ -27616,6 +27706,18 @@ msgstr "Hapus catatan"
 msgid "Show users on map"
 msgstr "Tampilkan pengguna pada peta"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Hanya posisi"
 
@@ -28367,9 +28469,6 @@ msgstr "Menampilkan foto non-geotagged"
 msgid "Imported Images"
 msgstr "Gambar diimport"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "File gambar (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Import vektor grafik"
 
@@ -28935,6 +29034,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28974,6 +29082,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29112,9 +29232,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29206,12 +29323,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30631,33 +30757,81 @@ msgstr "Plugin Proj4J"
 msgid "Code"
 msgstr "Kode"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31061,6 +31235,12 @@ msgstr "Memperbaiki peran dari anggota relasi yang dipilih"
 msgid "Complete multipolygon for way {0}"
 msgstr "Multipoligon lengkap untuk way/garis {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Node/titik tanpa peran \"house\" ditemukan"
 
@@ -32869,12 +33049,6 @@ msgstr "Hapus anggota dari larangan untuk berputar"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Ubah kedalam editor dasar dan pilih way/garis"
 
-msgid "Undelete object..."
-msgstr "Batalkan menghapus objek"
-
-msgid "Undelete object by id"
-msgstr "Batalkan menghapus objek berdasarkan id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -32884,6 +33058,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Batalkan menghapus objek"
+
+msgid "Undelete object by id"
+msgstr "Batalkan menghapus objek berdasarkan id"
+
 msgid "Undelete Object"
 msgstr "Batalkan menghapus objek"
 
@@ -33624,6 +33804,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Menambahkan nama dari Wikipedia"
 
@@ -33661,11 +33847,14 @@ msgstr "Tersedia pada dataset lokal"
 msgid "Not linked yet"
 msgstr "Belum tertautan"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "mengambil semua koordinat dari wikipedia dalam pandangan saat ini"
diff --git a/i18n/po/is.po b/i18n/po/is.po
index 92ca1f1..697c554 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:46+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:48+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: is\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2630,14 +2630,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2653,6 +2645,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3925,9 +3925,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9029,7 +9026,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14605,6 +14602,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14845,7 +14845,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15823,6 +15823,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17607,18 +17610,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18808,6 +18826,72 @@ msgstr "Volt"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Bílaþvottastöð"
 
@@ -19012,9 +19096,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19039,15 +19120,6 @@ msgstr "Skýli"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22834,9 +22906,6 @@ msgstr "Tré"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Fræðiheiti"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23873,6 +23942,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24025,6 +24109,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24397,6 +24484,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26264,13 +26354,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26392,6 +26482,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27088,9 +27190,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27622,6 +27721,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27661,6 +27769,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27799,9 +27919,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27893,12 +28010,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29255,33 +29381,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29681,6 +29855,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31342,19 +31522,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32010,6 +32190,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32042,10 +32228,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/it.po b/i18n/po/it.po
index aebc381..038d3b0 100644
--- a/i18n/po/it.po
+++ b/i18n/po/it.po
@@ -4,7 +4,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm 20081003\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-05-10 13:53+0000\n"
 "Last-Translator: Don-vip <Unknown>\n"
 "Language-Team: Italian <talk-it at lists.openstreetmap.org>\n"
@@ -12,8 +12,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: 2016-06-05 04:48+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:49+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: it\n"
 "X-Language: it_IT\n"
 "X-Source-Language: en\n"
@@ -2886,14 +2886,6 @@ msgstr ""
 "oggetti (e tutti i loro nodi di percorso / membri della relazione) "
 "nell''area scaricata"
 
-msgid "Searching"
-msgstr "Ricerca in corso"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Ricerca in {0} oggetto"
-msgstr[1] "Ricerca in {0} oggetti"
-
 msgid "No match found for ''{0}''"
 msgstr "Nessuna corrispondenza trovata per ''{0}''"
 
@@ -2910,6 +2902,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Trovate {0} corrispondenze"
 
+msgid "Searching"
+msgstr "Ricerca in corso"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Ricerca in {0} oggetto"
+msgstr[1] "Ricerca in {0} oggetti"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4321,9 +4321,6 @@ msgstr "Etichette Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Verificare per errori legati alle etichette internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " L''URL non può essere convertito in ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -10038,8 +10035,8 @@ msgstr "ingrandire per caricare dei tasselli"
 msgid "zoom in to load more tiles"
 msgstr "ingrandire per caricare più tasselli"
 
-msgid "increase zoom level to see more detail"
-msgstr "aumenta il livello di ingrandimento per vedere più dettagli"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Nessun tassello in questo livello di ingrandimento"
@@ -16468,6 +16465,9 @@ msgstr "Mappa per il ciclismo di Strava (c)"
 msgid "Strava running heatmap"
 msgstr "Mappa per la corsa di Strava (c)"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -16708,7 +16708,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17721,6 +17721,9 @@ msgstr ""
 "Parla con gli utenti che stanno modificando la mappa nelle vicinanze, sii "
 "avvisato quando qualcuno si avvicina."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19618,18 +19621,33 @@ msgstr "Tipo di strada sterrata"
 msgid "grade1"
 msgstr "grado1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grado2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grado3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grado4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grado5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Scala di classificazione MTB"
 
@@ -20846,6 +20864,72 @@ msgstr "Tensione"
 msgid "Amperage"
 msgstr "Amperaggio"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Autolavaggio"
 
@@ -21050,9 +21134,6 @@ msgstr "Fermata del tram (ereditato)"
 msgid "Train"
 msgstr "Treno"
 
-msgid "Railway station (legacy)"
-msgstr "Stazione ferroviaria (ereditato)"
-
 msgid "Railway halt (legacy)"
 msgstr "Fermata ferroviaria (ereditato)"
 
@@ -21077,15 +21158,6 @@ msgstr "Pensilina/ricovero"
 msgid "Waste Basket/Trash Can"
 msgstr "Cestino"
 
-msgid "Highway platform (legacy)"
-msgstr "Banchina stradale (ereditato)"
-
-msgid "Railway platform (legacy)"
-msgstr "Banchina ferroviaria (ereditato)"
-
-msgid "funicular"
-msgstr "funicolare"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stazione"
@@ -24880,9 +24952,6 @@ msgstr "Albero"
 msgid "A single tree."
 msgstr "Un albero isolato"
 
-msgid "Botanical Name"
-msgstr "Nome Botanico"
-
 msgid "Tree Row"
 msgstr "Fila di alberi"
 
@@ -25937,6 +26006,21 @@ msgstr "{0} e {1} insieme a {2} e valori in conflitto"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Sospetta combinazione di etichette: {0} e {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} è deprecata"
 
@@ -26101,6 +26185,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome abbreviato della strada"
 
@@ -26499,6 +26586,9 @@ msgstr "Visualizza livello griglia altitudine"
 msgid "Elevation Grid"
 msgstr "Gliglia altitudine"
 
+msgid "increase zoom level to see more detail"
+msgstr "aumenta il livello di ingrandimento per vedere più dettagli"
+
 msgid "No SRTM data"
 msgstr "Nessun dato SRTM"
 
@@ -28610,15 +28700,15 @@ msgstr "tra {0} {1} e {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  aggiungendo {0} {1}"
 
+msgid "EditGpx"
+msgstr "ModificaGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Livello per la modifica dei tracciati GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Converti in livello GPX con orario anonimo"
 
-msgid "EditGpx"
-msgstr "ModificaGpx"
-
 msgid "edit gpx tracks"
 msgstr "modifica tracciati gpx"
 
@@ -28741,6 +28831,18 @@ msgstr "Azzera registro"
 msgid "Show users on map"
 msgstr "Visualizza utenti sulla mappa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Solo posizione"
 
@@ -29508,9 +29610,6 @@ msgstr "Visualizza le foto non georeferenziate"
 msgid "Imported Images"
 msgstr "Immagini importate"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "File immagine (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importa immagini vettoriali"
 
@@ -30071,6 +30170,15 @@ msgstr "unisci/dividi foto"
 msgid "Join Mapillary pictures"
 msgstr "unisci foto Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Carica foto"
 
@@ -30110,6 +30218,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Esporta tutte le immagini"
 
@@ -30248,9 +30368,6 @@ msgstr "Metti in pausa"
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr "Mostra l''ora in cui è stata scattata la foto"
 
@@ -30342,12 +30459,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Nessuna immagine trovata"
 
 msgid "Finished upload"
 msgstr "Caricamento terminato"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "In caricamento: {0}"
 
@@ -31808,33 +31934,81 @@ msgstr "Estensione Proj4J"
 msgid "Code"
 msgstr "Codice"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -32245,6 +32419,12 @@ msgstr "Correggi i ruoli dei membri della relazione scelti"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completa multi poligono per il percorso {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Trovato nodo senza il ruolo ''house''"
 
@@ -34103,12 +34283,6 @@ msgstr "Elimina il membro dal divieto di svolta"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Seleziona un percorso mediante l''editor di base"
 
-msgid "Undelete object..."
-msgstr "Ripristina oggetto..."
-
-msgid "Undelete object by id"
-msgstr "Ripristina oggetto da identificativo"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Impossibile ripristinare il nodo {0}. L''oggetto è stato probabilmente "
@@ -34124,6 +34298,12 @@ msgstr ""
 "Impossibile ripristinare la relazione {0}. L''oggetto è stato probabilmente "
 "revisionato"
 
+msgid "Undelete object..."
+msgstr "Ripristina oggetto..."
+
+msgid "Undelete object by id"
+msgstr "Ripristina oggetto da identificativo"
+
 msgid "Undelete Object"
 msgstr "Ripristina Oggetto"
 
@@ -34877,6 +35057,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Aggiungi nomi da Wikipedia"
 
@@ -34915,11 +35101,14 @@ msgstr "Disponibile nell''insieme di dati locale"
 msgid "Not linked yet"
 msgstr "Non ancora collegato"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/ja.po b/i18n/po/ja.po
index 7cd0b3a..2ebc2b9 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-05-22 08:00+0000\n"
-"Last-Translator: fujimoto <fujimoto at internet.ne.jp>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-16 14:17+0000\n"
+"Last-Translator: Yasunari Yamashita <yasunari at yamasita.jp>\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: 2016-06-05 04:48+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:50+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "X-Poedit-Country: JAPAN\n"
 "Language: ja\n"
 "X-Poedit-Language: Japanese\n"
@@ -2644,13 +2644,6 @@ msgstr "ダウンロード範囲内のオブジェクト"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "ダウンロード範囲内のオブジェクト(と全てのウェイのノード、リレーションのメンバー)"
 
-msgid "Searching"
-msgstr "検索中"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "{0}件のオブジェクトを検索中"
-
 msgid "No match found for ''{0}''"
 msgstr "''{0}'' にマッチするものが見つかりません"
 
@@ -2666,6 +2659,13 @@ msgstr "選択の中に ''{0}'' と一致するものは見つかりませんで
 msgid "Found {0} matches"
 msgstr "{0} の一致が見つかりました"
 
+msgid "Searching"
+msgstr "検索中"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "{0}件のオブジェクトを検索中"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -3937,9 +3937,6 @@ msgstr "インターネットタグ"
 msgid "Checks for errors in internet-related tags."
 msgstr "インターネットに関するタグのエラーをチェックします。"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URLをASCIIに変換できません: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9107,8 +9104,8 @@ msgstr "タイルを読み込むには拡大してください"
 msgid "zoom in to load more tiles"
 msgstr "もっとタイルを読み込むには拡大してください"
 
-msgid "increase zoom level to see more detail"
-msgstr "ズームレベルを上げて詳細を見る"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "このズームレベルではタイルがありません"
@@ -14832,6 +14829,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -15072,7 +15072,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16065,6 +16065,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr "付近の地図を編集しているユーザーと会話しましょう。誰かが近くに来ると通知されます。"
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17875,18 +17878,33 @@ msgstr "農道・林道の状態"
 msgid "grade1"
 msgstr "グレード1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "グレード2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "グレード3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "グレード4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "グレード5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTBスケール"
 
@@ -19078,6 +19096,72 @@ msgstr "電圧"
 msgid "Amperage"
 msgstr "電流"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "洗車場"
 
@@ -19282,9 +19366,6 @@ msgstr "電停(旧)"
 msgid "Train"
 msgstr "鉄道"
 
-msgid "Railway station (legacy)"
-msgstr "鉄道駅(旧)"
-
 msgid "Railway halt (legacy)"
 msgstr "停留所(旧)"
 
@@ -19309,15 +19390,6 @@ msgstr "待合室・避難所"
 msgid "Waste Basket/Trash Can"
 msgstr "ゴミ箱"
 
-msgid "Highway platform (legacy)"
-msgstr "道路上のプラットホーム(旧)"
-
-msgid "Railway platform (legacy)"
-msgstr "鉄道のプラットホーム(旧)"
-
-msgid "funicular"
-msgstr "ケーブルカー"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "駅"
@@ -23104,9 +23176,6 @@ msgstr "樹木・林"
 msgid "A single tree."
 msgstr "単一の木です。"
 
-msgid "Botanical Name"
-msgstr "植物の名前"
-
 msgid "Tree Row"
 msgstr "並木"
 
@@ -23264,7 +23333,7 @@ msgstr "トウモロコシ"
 
 msgctxt "crop"
 msgid "grass"
-msgstr ""
+msgstr "草"
 
 msgctxt "crop"
 msgid "rice"
@@ -23291,28 +23360,28 @@ msgid "olive_trees"
 msgstr ""
 
 msgid "apple_trees"
-msgstr ""
+msgstr "りんご"
 
 msgid "oil_palms"
-msgstr ""
+msgstr "アブラヤシ"
 
 msgid "orange_trees"
-msgstr ""
+msgstr "柑橘類"
 
 msgid "almond_trees"
-msgstr ""
+msgstr "アーモンド"
 
 msgid "banana_plants"
-msgstr ""
+msgstr "バナナ"
 
 msgid "coconut_palms"
-msgstr ""
+msgstr "ココナッツ"
 
 msgid "hazel_plants"
 msgstr ""
 
 msgid "cherry_trees"
-msgstr ""
+msgstr "さくらんぼ"
 
 msgid "persimmon_trees"
 msgstr ""
@@ -23875,7 +23944,7 @@ msgid "natural"
 msgstr "自然"
 
 msgid "Walking Route"
-msgstr ""
+msgstr "ウォーキングルート"
 
 msgid "Riding Route"
 msgstr ""
@@ -24144,6 +24213,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0}は推奨されていません"
 
@@ -24296,6 +24380,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "通り名が略称になっている"
 
@@ -24671,6 +24758,9 @@ msgstr "高度グリッドレイヤーを表示"
 msgid "Elevation Grid"
 msgstr "高度グリッド"
 
+msgid "increase zoom level to see more detail"
+msgstr "ズームレベルを上げて詳細を見る"
+
 msgid "No SRTM data"
 msgstr "SRTMデータがありません"
 
@@ -26665,15 +26755,15 @@ msgstr "{0} {1} と {2} {3}の間"
 msgid "  adding {0} {1}"
 msgstr "  {0} {1} を追加中"
 
+msgid "EditGpx"
+msgstr "GPX編集"
+
 msgid "Layer for editing GPX tracks"
 msgstr "GPXトラックを編集するためのレイヤー"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "時刻を秘匿してGPXレイヤーに変換"
 
-msgid "EditGpx"
-msgstr "GPX編集"
-
 msgid "edit gpx tracks"
 msgstr "GPXトラックの編集"
 
@@ -26795,6 +26885,18 @@ msgstr "ログのクリア"
 msgid "Show users on map"
 msgstr "地図上のユーザーを表示"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "位置のみ"
 
@@ -27516,9 +27618,6 @@ msgstr "ジオタグのない写真を表示"
 msgid "Imported Images"
 msgstr "インポートした画像"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "画像ファイル(*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "ベクターグラフィックスをインポート"
 
@@ -28054,6 +28153,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28093,6 +28201,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28231,9 +28351,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28325,12 +28442,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29704,33 +29830,81 @@ msgstr "Proj4J プラグイン"
 msgid "Code"
 msgstr "コード"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30130,6 +30304,12 @@ msgstr "選択されたリレーションメンバーのロールを修正"
 msgid "Complete multipolygon for way {0}"
 msgstr "ウェイ {0} のマルチポリゴンを完結"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "ノードのない ''house'' ロールが見つかりました"
 
@@ -31851,12 +32031,6 @@ msgstr "進行方向制限からメンバーを削除"
 msgid "Change to the Basic Editor and select a way"
 msgstr "基本エディタに変更してウェイを選択"
 
-msgid "Undelete object..."
-msgstr "オブジェクト削除を取り消す..."
-
-msgid "Undelete object by id"
-msgstr "IDでオブジェクトの削除を取り消し"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr "ノード{0}の削除を取り消せません。オブジェクトが変更されたようです"
 
@@ -31866,6 +32040,12 @@ msgstr "ウェイ{0}の削除を取り消せません。オブジェクトが変
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr "リレーション{0}の削除を取り消せません。オブジェクトが変更されたようです"
 
+msgid "Undelete object..."
+msgstr "オブジェクト削除を取り消す..."
+
+msgid "Undelete object by id"
+msgstr "IDでオブジェクトの削除を取り消し"
+
 msgid "Undelete Object"
 msgstr "オブジェクトの削除を取り消し"
 
@@ -32549,6 +32729,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Wikipediaから名前を追加"
 
@@ -32581,11 +32767,14 @@ msgstr "ローカルデータセットで有効"
 msgid "Not linked yet"
 msgstr "まだリンクされていません"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "現在のビューのすべての座標をWikipedia上で検索"
diff --git a/i18n/po/ka.po b/i18n/po/ka.po
index b8a10de..b7f495c 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:42+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:43+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ka\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2621,14 +2621,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2644,6 +2636,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3911,9 +3911,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8999,7 +8996,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14559,6 +14556,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14799,7 +14799,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15777,6 +15777,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17560,18 +17563,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18761,6 +18779,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18965,9 +19049,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18992,15 +19073,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22787,9 +22859,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23826,6 +23895,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23978,6 +24062,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24350,6 +24437,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26217,13 +26307,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26345,6 +26435,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27041,9 +27143,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27575,6 +27674,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27614,6 +27722,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27752,9 +27872,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27846,12 +27963,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29208,33 +29334,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29634,6 +29808,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31295,19 +31475,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31963,6 +32143,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31995,10 +32181,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/km.po b/i18n/po/km.po
index 4bec7fc..c2f1e81 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:49+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:50+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2773,14 +2773,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "វត្ថុ (និង​តំណ​ផ្លូវ/ធាតុ​ទំនាក់ទំនង​របស់​វា​ទាំងអស់) នៅ​ក្នុង​តំបន់​ទាញ​យក"
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "រក​មិន​ឃើញ​ការ​ផ្គូផ្គង​សម្រាប់ ''{0}''"
 
@@ -2796,6 +2788,14 @@ msgstr "រក​មិន​ឃើញ​អ្វី​តាម​រយៈ​
 msgid "Found {0} matches"
 msgstr "បាន​រក​ឃើញ​ការ​ផ្គូផ្គង {0}"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4149,9 +4149,6 @@ msgstr "ស្លាក​អ៊ីនធឺណិត"
 msgid "Checks for errors in internet-related tags."
 msgstr "ពិនិត្យមើល​កំហុស​ក្នុង​ស្លាក​អ៊ីនធឺណិត​ពាក់ព័ន្ធ"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " មិន​បម្លែង URL ទៅ ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9675,8 +9672,8 @@ msgstr "ពង្រីក​ដើម្បី​ផ្ទុក​ក្រឡ
 msgid "zoom in to load more tiles"
 msgstr "ពង្រីក​ដើម្បី​ផ្ទុក​ក្រឡា​ច្រើន​ទៀត"
 
-msgid "increase zoom level to see more detail"
-msgstr "បង្កើន​កម្រិត​ពង្រីក​ដើម្បី​មើល​ព័ត៌មាន​លម្អិត​បន្ថែម"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "មិន​មាន​ក្រឡា​នៅ​កម្រិត​ពង្រីក​នេះ​ទេ"
@@ -15912,6 +15909,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -16152,7 +16152,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17163,6 +17163,9 @@ msgstr ""
 "ជជែក​ជាមួយ​អ្នកប្រើ​ដែល​កែសម្រួល​ផែនទី​នៅ​ក្បែរ "
 "ដោយ​ជូនដំណឹង​ពេល​ពួកគេ​មក​ក្បែរ។"
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19001,18 +19004,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -20202,6 +20220,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -20406,9 +20490,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -20433,15 +20514,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -24228,9 +24300,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -25267,6 +25336,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -25419,6 +25503,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -25791,6 +25878,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "បង្កើន​កម្រិត​ពង្រីក​ដើម្បី​មើល​ព័ត៌មាន​លម្អិត​បន្ថែម"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -27658,13 +27748,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -27786,6 +27876,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -28482,9 +28584,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -29016,6 +29115,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -29055,6 +29163,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29193,9 +29313,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29287,12 +29404,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30649,33 +30775,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31075,6 +31249,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -32736,19 +32916,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -33404,6 +33584,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -33436,11 +33622,14 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/ko.po b/i18n/po/ko.po
index 2982152..8870098 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-04-01 12:42+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: 2016-06-05 04:50+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:52+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ko\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2607,14 +2607,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "''{0}''를 찾을 수 없음"
 
@@ -2630,6 +2622,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "{0}개를 찾음"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3890,9 +3890,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8982,7 +8979,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14542,6 +14539,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14782,7 +14782,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15760,6 +15760,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17543,18 +17546,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18744,6 +18762,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18948,9 +19032,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18975,15 +19056,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22770,9 +22842,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23809,6 +23878,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23961,6 +24045,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24333,6 +24420,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26200,13 +26290,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26328,6 +26418,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27024,9 +27126,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27558,6 +27657,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27597,6 +27705,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27735,9 +27855,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27829,12 +27946,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29191,33 +29317,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29617,6 +29791,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31278,19 +31458,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31945,6 +32125,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31977,10 +32163,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr "아직 링크되지 않았습니다"
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ky.po b/i18n/po/ky.po
index e99ee07..7fade43 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:49+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:51+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/lb.po b/i18n/po/lb.po
index d317e08..955ce3e 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:52+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:54+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}:D''Optioun \"{1}\" ass net eendeiteg"
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/lo.po b/i18n/po/lo.po
index ca5e07d..e897b9d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:51+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:52+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/lt.po b/i18n/po/lt.po
index 47f3d23..10779cf 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-05-27 19:35+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: 2016-06-05 04:52+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:53+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: lt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2841,15 +2841,6 @@ msgstr "objektai atsiųstame plote"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "objektai (ir visi jo kelių taškai / ryšių nariai) atsisiųstame plote"
 
-msgid "Searching"
-msgstr "Ieškoma"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Ieškoma {0} objecte"
-msgstr[1] "Ieškoma {0} objektuose"
-msgstr[2] "Ieškoma {0} objekte (-uose)"
-
 msgid "No match found for ''{0}''"
 msgstr "„{0}“ nerasta"
 
@@ -2865,6 +2856,15 @@ msgstr "Ieškant „{0}“ pažymėjime nieko nerasta"
 msgid "Found {0} matches"
 msgstr "Rasta {0} atitikmenų"
 
+msgid "Searching"
+msgstr "Ieškoma"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Ieškoma {0} objecte"
+msgstr[1] "Ieškoma {0} objektuose"
+msgstr[2] "Ieškoma {0} objekte (-uose)"
+
 msgctxt "search"
 msgid "CS"
 msgstr "SR"
@@ -4262,9 +4262,6 @@ msgstr "Interneto žymos"
 msgid "Checks for errors in internet-related tags."
 msgstr "Ieško klaidų su internetu susijusiose žymose."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL negalima konvertuoti į ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "„{0}“: {1}"
 
@@ -9839,8 +9836,8 @@ msgstr "padidinkite, kad įkeltumėte kaladėles"
 msgid "zoom in to load more tiles"
 msgstr "padidinkite, kad įkeltumėte daugiau kaladėlių"
 
-msgid "increase zoom level to see more detail"
-msgstr "padidinkite, kad matytumėte daugiau detalių"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Šiame mastelyje nėra kaladėlių"
@@ -15989,6 +15986,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator padengtis"
 
@@ -16229,7 +16229,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17214,6 +17214,9 @@ msgstr ""
 "Kalbėkite su vartotojais, redaguojančiais žemėlapį šalia jūsų, būkite "
 "informuotas, jeigu kažkas prie jūsų artėja."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19010,18 +19013,33 @@ msgstr "Vėžės būklė"
 msgid "grade1"
 msgstr "būklė1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "būklė2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "būklė3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "būklė4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "būklė5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -20211,6 +20229,72 @@ msgstr "Įtampa"
 msgid "Amperage"
 msgstr "Srovė"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Plovykla"
 
@@ -20415,9 +20499,6 @@ msgstr ""
 msgid "Train"
 msgstr "Traukinys"
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -20442,15 +20523,6 @@ msgstr "Pastogė"
 msgid "Waste Basket/Trash Can"
 msgstr "Šiukšlių dėžė"
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr "funikulierius"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stotis"
@@ -24237,9 +24309,6 @@ msgstr "Medis"
 msgid "A single tree."
 msgstr "Vienas medis."
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr "Medžių eilė"
 
@@ -25283,6 +25352,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Įtartina žymų kombinacija: {0} ir {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} pasenusi"
 
@@ -25439,6 +25523,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "sutrumpintas gatvės pavadinimas"
 
@@ -25814,6 +25901,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "padidinkite, kad matytumėte daugiau detalių"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -27705,15 +27795,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr ""
+
 msgid "Layer for editing GPX tracks"
 msgstr "Sluoksnis naudojamas GPX trasų keitimui"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
-msgid "EditGpx"
-msgstr ""
-
 msgid "edit gpx tracks"
 msgstr "keisti gpx trasas"
 
@@ -27833,6 +27923,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -28543,9 +28645,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -29080,6 +29179,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Išsiųsti nuotraukas"
 
@@ -29119,6 +29227,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29257,9 +29377,6 @@ msgstr "Pristabdyti"
 msgid "Pauses the walk."
 msgstr "Pristabdo ėjimą."
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr "Rodyti valandą kada nuotrauka padaryta"
 
@@ -29351,12 +29468,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30724,33 +30850,81 @@ msgstr "Proj4J papildinys"
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31150,6 +31324,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Rastas taškas be rolės „house“"
 
@@ -32826,12 +33006,6 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
-msgstr "Grąžinti pašalintą objektą..."
-
-msgid "Undelete object by id"
-msgstr "Grąžinti pašalintą objektą pagal id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Nepavyko grąžinti pašalinto taško {0}. Objektas greičiausiai buvo pakeistas"
@@ -32844,6 +33018,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Nepavyko grąžinti pašalinto ryšio {0}. Objektas greičiausiai buvo pakeistas"
 
+msgid "Undelete object..."
+msgstr "Grąžinti pašalintą objektą..."
+
+msgid "Undelete object by id"
+msgstr "Grąžinti pašalintą objektą pagal id"
+
 msgid "Undelete Object"
 msgstr "Grąžinti pašalintą objektą"
 
@@ -33510,6 +33690,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -33544,11 +33730,14 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Gauna visas koordinates iš Vikipedijos dabartiniame rodinyje"
diff --git a/i18n/po/lv.po b/i18n/po/lv.po
index f6c1819..813c50d 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:51+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:53+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: lv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2627,14 +2627,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2650,6 +2642,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3917,9 +3917,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9004,7 +9001,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14568,6 +14565,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14808,7 +14808,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15786,6 +15786,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17569,18 +17572,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18770,6 +18788,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18974,9 +19058,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19001,15 +19082,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22796,9 +22868,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23835,6 +23904,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23987,6 +24071,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24359,6 +24446,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26226,13 +26316,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26354,6 +26444,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27050,9 +27152,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27584,6 +27683,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27623,6 +27731,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27761,9 +27881,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27855,12 +27972,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29217,33 +29343,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29643,6 +29817,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31304,19 +31484,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31972,6 +32152,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32004,10 +32190,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/mk.po b/i18n/po/mk.po
index 5658841..20b2fd7 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:52+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:54+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: mk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2619,14 +2619,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2642,6 +2634,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3909,9 +3909,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8997,7 +8994,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14558,6 +14555,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14798,7 +14798,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15776,6 +15776,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17559,18 +17562,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18760,6 +18778,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18964,9 +19048,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18991,15 +19072,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22786,9 +22858,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23825,6 +23894,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23977,6 +24061,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24349,6 +24436,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26216,13 +26306,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26344,6 +26434,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27040,9 +27142,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27574,6 +27673,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27613,6 +27721,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27751,9 +27871,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27845,12 +27962,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29207,33 +29333,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29633,6 +29807,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31294,19 +31474,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31962,6 +32142,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31994,10 +32180,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/mr.po b/i18n/po/mr.po
index 0a9b26b..cc76fc3 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:53+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:55+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: mr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2647,14 +2647,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2670,6 +2662,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3937,9 +3937,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9025,7 +9022,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14596,6 +14593,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14836,7 +14836,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15814,6 +15814,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17597,18 +17600,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18798,6 +18816,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -19002,9 +19086,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19029,15 +19110,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22824,9 +22896,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23863,6 +23932,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24015,6 +24099,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24387,6 +24474,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26254,13 +26344,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26382,6 +26472,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27078,9 +27180,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27612,6 +27711,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27651,6 +27759,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27789,9 +27909,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27883,12 +28000,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29245,33 +29371,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29671,6 +29845,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31332,19 +31512,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32000,6 +32180,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32032,10 +32218,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ms.po b/i18n/po/ms.po
index cd7e152..1095bb9 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:53+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:55+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ms\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/nb.po b/i18n/po/nb.po
index 38a3178..37882a8 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2015-11-28 16:18+0000\n"
 "Last-Translator: Magnus Meyer Hustveit <Unknown>\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: 2016-06-05 04:55+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:57+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: nb\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2663,14 +2663,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Fant ingen treff for «{0}»"
 
@@ -2686,6 +2678,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Fant {0} treff"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3965,9 +3965,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9116,7 +9113,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14749,6 +14746,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14989,7 +14989,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15970,6 +15970,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17765,18 +17768,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18966,6 +18984,72 @@ msgstr "Spenning"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Bilvask"
 
@@ -19170,9 +19254,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19197,15 +19278,6 @@ msgstr "Ly"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stasjon"
@@ -22992,9 +23064,6 @@ msgstr "Tre"
 msgid "A single tree."
 msgstr "Et enkelt tre."
 
-msgid "Botanical Name"
-msgstr "Botanisk navn"
-
 msgid "Tree Row"
 msgstr "Trerekke"
 
@@ -24031,6 +24100,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24189,6 +24273,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24563,6 +24650,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26451,15 +26541,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr "Rediger GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Lag for redigering av GPX-spor"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Konverter til GPX lag med anonymisert tid"
 
-msgid "EditGpx"
-msgstr "Rediger GPX"
-
 msgid "edit gpx tracks"
 msgstr "Rediger GPX-spor"
 
@@ -26579,6 +26669,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Bare posisjon"
 
@@ -27278,9 +27380,6 @@ msgstr "Vis foto uten geotag posisjon"
 msgid "Imported Images"
 msgstr "Importerte bilder"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Bildefiler (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27822,6 +27921,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27861,6 +27969,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27999,9 +28119,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28093,12 +28210,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29456,33 +29582,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29882,6 +30056,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31549,19 +31729,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32217,6 +32397,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32249,10 +32435,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/nds.po b/i18n/po/nds.po
index 09db443..4cd3207 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:54+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:56+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr "Boom"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/nl.po b/i18n/po/nl.po
index 1e2bb9e..d5067c9 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-05-08 14:17+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-26 12:48+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: 2016-06-05 04:38+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:40+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: nl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2883,14 +2883,6 @@ msgstr ""
 "objecten (en alle wegen knopen / leden van relaties ervan) in gedownloade "
 "gebied"
 
-msgid "Searching"
-msgstr "Zoeken"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Zoeken in {0} object"
-msgstr[1] "Searching in {0} objecten"
-
 msgid "No match found for ''{0}''"
 msgstr "Geen overeenkomst gevonden voor ''{0}''"
 
@@ -2906,6 +2898,14 @@ msgstr "Niets gevonden in selectie met zoeken op \"{0}\""
 msgid "Found {0} matches"
 msgstr "{0} overeenkomsten gevonden"
 
+msgid "Searching"
+msgstr "Zoeken"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Zoeken in {0} object"
+msgstr[1] "Searching in {0} objecten"
+
 msgctxt "search"
 msgid "CS"
 msgstr "HG (hoofdlettergevoelig)"
@@ -4305,9 +4305,6 @@ msgstr "Internet tags"
 msgid "Checks for errors in internet-related tags."
 msgstr "Kontroleer fouten in internet-gerelateerde tags"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL kan niet omgezet worden naar ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9982,8 +9979,9 @@ msgstr "inzoomen om tegels te laden"
 msgid "zoom in to load more tiles"
 msgstr "inzoomen om meer tegels te laden"
 
-msgid "increase zoom level to see more detail"
-msgstr "vergoot het zoomniveau om meer detail te zien"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"zoomniveau voor tegels verhogen (resolutie wijzigen) om meer detail te zien"
 
 msgid "No tiles at this zoom level"
 msgstr "Geen tegels op dit zoomniveau"
@@ -10663,7 +10661,7 @@ msgid "No imagery layers"
 msgstr "Geen lagen met afbeeldingen"
 
 msgid "HDOP"
-msgstr ""
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Tijd"
@@ -10672,7 +10670,7 @@ msgid "Direction"
 msgstr "Richting"
 
 msgid "Velocity, {0}"
-msgstr ""
+msgstr "Snelheid, {0}"
 
 msgid "gps point"
 msgstr "GPS-punt"
@@ -16329,6 +16327,9 @@ msgstr "Strava fietsen heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava hardlopen heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -16489,7 +16490,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC buslijnen (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Benin:cotonou_pleiade_2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Mapa de Setores Urbanos"
@@ -16569,8 +16570,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr ""
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17594,6 +17595,9 @@ msgstr ""
 "Spreek met gebruikers de de kaart dichtbij bewerken, krijg bericht als "
 "iemand dichtbij komt."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Stelt u in staat een bestand van GeoJSON weer te geven als laag."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17737,6 +17741,8 @@ msgstr ""
 
 msgid "Allows the user to work with pictures hosted at mapillary.com"
 msgstr ""
+"Stelt de gebruiker in staat om te werken met afbeeldingen die worden gehost "
+"op mapillary.com"
 
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
@@ -17857,6 +17863,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Verschaft validatie en probleemoplossing voor routes openbaar vervoer "
+"overeenkomstig versie 2 van het schema voor openbaar vervoer"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -18067,10 +18075,10 @@ msgid "concrete"
 msgstr "beton"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "beton:platen"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "beton:rijstroken"
 
 msgid "paving_stones"
 msgstr "straatstenen"
@@ -19507,18 +19515,34 @@ msgstr "Type spoor"
 msgid "grade1"
 msgstr "graad 1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Vast: geplaveid of bijzonder gecomprimeerd hard oppervlak"
+
 msgid "grade2"
 msgstr "graad 2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "Meestal vast: gravel/steen met daarin zacht materiaal gemixt"
+
 msgid "grade3"
 msgstr "graad 3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Gelijk mengsel van harde en zachte materialen"
+
 msgid "grade4"
 msgstr "graad 4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+"Meestal zacht: aarde/zand/gras met daarin enigszins hard materiaal gemixt"
+
 msgid "grade5"
 msgstr "graad 5"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Zacht: aarde/zand/gras"
+
 msgid "MTB Scale"
 msgstr "MTB schaal"
 
@@ -20033,7 +20057,7 @@ msgid "Kerb"
 msgstr "Berm"
 
 msgid "Tactile paving"
-msgstr ""
+msgstr "Geleidetegels"
 
 msgid "Entrance (Barrier Opening)"
 msgstr "Ingang (opening met barrière)"
@@ -20729,6 +20753,72 @@ msgstr "Voltage"
 msgid "Amperage"
 msgstr "Laadstroom"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Typen voertuigen die kunnen worden opgeladen:"
+
+msgid "Scooter"
+msgstr "Scooter"
+
+msgid "Truck"
+msgstr "Vrachtwagen"
+
+msgid "Number of Sockets:"
+msgstr "Aantal stopcontacten:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE blue"
+
+msgid "CEE red 16A"
+msgstr "CEE red 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE red 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Authenticatie:"
+
+msgid "Phone call"
+msgstr "Telefoongesprek"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Lidmaatschapskaart"
+
 msgid "Wash"
 msgstr "Autowasstraat"
 
@@ -20934,9 +21024,6 @@ msgstr "Tramhalte (oude tagging)"
 msgid "Train"
 msgstr "Trein"
 
-msgid "Railway station (legacy)"
-msgstr "Treinstation (oude tagging)"
-
 msgid "Railway halt (legacy)"
 msgstr "Treinhalte (oude tagging)"
 
@@ -20961,15 +21048,6 @@ msgstr "Schuilplaats"
 msgid "Waste Basket/Trash Can"
 msgstr "Afvalemmer/Afvalbak"
 
-msgid "Highway platform (legacy)"
-msgstr "Hoofdperron (oud)"
-
-msgid "Railway platform (legacy)"
-msgstr "Spoorwegperron (oud)"
-
-msgid "funicular"
-msgstr "kabelbaan"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Station"
@@ -24764,9 +24842,6 @@ msgstr "Boom"
 msgid "A single tree."
 msgstr "Eén enkele boom"
 
-msgid "Botanical Name"
-msgstr "Botanische naam"
-
 msgid "Tree Row"
 msgstr "Bomenrij"
 
@@ -25083,7 +25158,7 @@ msgid "Local name"
 msgstr "Plaatselijke naam"
 
 msgid "Regional name"
-msgstr "Ragionale naam"
+msgstr "Regionale naam"
 
 msgid "National name"
 msgstr "Nationale naam"
@@ -25552,16 +25627,16 @@ msgid "Riding Route"
 msgstr ""
 
 msgid "ihn"
-msgstr ""
+msgstr "ihn"
 
 msgid "nhn"
-msgstr ""
+msgstr "nhn"
 
 msgid "rhn"
-msgstr ""
+msgstr "rhn"
 
 msgid "lhn"
-msgstr ""
+msgstr "lhn"
 
 msgid "Piste Route"
 msgstr "Piste-route"
@@ -25815,6 +25890,27 @@ msgstr "{0} en {1} samen met {2} en conflicterende waarden"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Verdachte tagcombinatie: {0} en {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} op een relatie zonder {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Lange waterweg met {0} maar zonder een tag die het als tunnel of ondergronds "
+"definieert. Verwijder {1} of voeg een tag tunnel toe indien van toepassing. "
+"Controleer ook kruisende bruggen en hun {1} tags."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Korte waterweg met {0} maar zonder een tag die het als tunnel of ondergronds "
+"definieert. Verwijder {1} of voeg een tag tunnel toe indien van toepassing. "
+"Controleer ook kruisende bruggen en hun {1} tags."
+
 msgid "{0} is deprecated"
 msgstr "{0} is vervallen"
 
@@ -25915,7 +26011,7 @@ msgid "questionable key (ending with a number): {0}"
 msgstr "onwaarschijnlijke sleutel (eindigt op ene getal): {0}"
 
 msgid "The key {0} has an uncommon value."
-msgstr ""
+msgstr "De sleutel {0} heeft een ongewone waarde."
 
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} op een knoop. Zou moeten wordne gebruikt op een weg."
@@ -25988,6 +26084,11 @@ msgid ""
 "Waterway ends without a connection to another waterway or the direction of "
 "the waterway is wrong."
 msgstr ""
+"Waterweg eindigt zonder een verbinding met een andere waterweg of de "
+"richting van de waterweg is verkeerd."
+
+msgid "Coastline inside {1}"
+msgstr "Kustlijn binnen {1}"
 
 msgid "abbreviated street name"
 msgstr "afgekorte straatnaam"
@@ -26394,6 +26495,9 @@ msgstr "Hoogte-rasterlaag weergeven"
 msgid "Elevation Grid"
 msgstr "Hoogteraster"
 
+msgid "increase zoom level to see more detail"
+msgstr "vergoot het zoomniveau om meer detail te zien"
+
 msgid "No SRTM data"
 msgstr "Geen gegevens SRTM"
 
@@ -28498,15 +28602,15 @@ msgstr "tussen {0} {1} en {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  toevoegen {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Laag voor bewerken van GPX-sporen"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Converteren naar GPX-laag met anonieme tijd"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "GPX-sporen bewerken"
 
@@ -28629,6 +28733,18 @@ msgstr "Log wissen"
 msgid "Show users on map"
 msgstr "Gebruikers op kaart weergeven"
 
+msgid "GeoJSON file"
+msgstr "GeoJSON-bestand"
+
+msgid "Loading json file..."
+msgstr "JSON-bestand laden..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Gegevenslaag van GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Fout bij laden van GeoJSON-bestand {0}"
+
 msgid "Position only"
 msgstr "Alleen positie"
 
@@ -29396,9 +29512,6 @@ msgstr "Foto''s zonder geo-tags weergeven"
 msgid "Imported Images"
 msgstr "Geïmporteerde afbeeldingen"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Afbeeldingsbestanden (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Vectorafbeeldingen importeren"
 
@@ -29957,6 +30070,15 @@ msgstr "Afbeeldingen samenvoegen/van elkaar losmaken"
 msgid "Join Mapillary pictures"
 msgstr "Afbeeldingen van Mapillary samenvoegen"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Afbeeldingen uploaden"
 
@@ -29996,6 +30118,18 @@ msgstr "Sleutel van tag kopiëren"
 msgid "Edit on website"
 msgstr "Op website bewerken"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Alle afbeeldingen exporteren"
 
@@ -30134,9 +30268,6 @@ msgstr "Pauze"
 msgid "Pauses the walk."
 msgstr "Onderbreekt de wandeling"
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Positie van de knoppen omdraaien bij weergeven van afbeeldingen."
-
 msgid "Display hour when the picture was taken"
 msgstr "Uur weergeven van wanneer de afbeelding werd gemaakt"
 
@@ -30148,7 +30279,7 @@ msgstr ""
 "Naar locatie van afbeeldingen verplaatsen met knoppen Volgende/Vorige"
 
 msgid "Preview images when hovering its icon"
-msgstr ""
+msgstr "Voorbeeld van afbeeldingen bij bevinden boven pictogram"
 
 msgid "Download mode"
 msgstr "Modus Downloaden"
@@ -30231,12 +30362,21 @@ msgstr "Afbeeldingen van Mapillary downloaden"
 msgid "Total Mapillary images: {0}"
 msgstr "Totaal aantal afbeeldingen van Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Geen afbeeldingen gevonden"
 
 msgid "Finished upload"
 msgstr "Uploaden voltooid"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Uploaden: {0}"
 
@@ -31689,33 +31829,86 @@ msgstr "Plug-in Proj4J"
 msgid "Code"
 msgstr "Code"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Onthoud mijn keuze en vraag me dat in deze sessie niet meer"
+
+msgid "PT_Assistant Fetch Request"
+msgstr "Verzoek om op te halen PT_Assistant"
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Routerelaties hebben niet complete leden.\n"
+"Zij moeten worden gedownload om door te kunnen gaan met valideren.\n"
+"Wilt u ze downloaden?"
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr "Plug-in PT_Assistant vindt dat deze relatie (id={0}) fouten heeft:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} fout in rechting"
+msgstr[1] "{0} fouten in richting"
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} fout in type weg"
+msgstr[1] "{0} fouten in type weg"
 
-msgid "PT: Route contains an overshoot"
+msgid "How do you want to proceed?"
+msgstr "Hoe wilt u verder gaan?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "Verzoek door te gaan met PT_Assistant"
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "Public Transport Assistant tests"
+msgstr "Testen Assistent openbaar vervoer"
+
+msgid ""
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
+"Controleren of routerelaties overeenkomen met openbaar vervoer versie 2"
+
+msgid "Fix error"
+msgstr "Fout oplossen"
 
-msgid "Platforms first"
+msgid "PT: dummy test warning"
+msgstr "PT: dummy testwaarschuwing"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "PT: Route bevat een gat dat kan worden opgelost door te sorteren"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "PT: Rol van het lid van de relatie komt niet overene met de tags"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "PT: Route zou moeten beginnen en eindigen met een stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "PT: Eerste of laatste weg zou moeten wordne gesplitst"
+
+msgid "PT: Route type does not match the type of the road it passes on"
 msgstr ""
+"PT: Type route komt niet overeen met het type weg waar het overheen gaat"
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Road is under construction"
 msgstr ""
 
-msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -32124,6 +32317,12 @@ msgstr "Repareer de rollen voor de leden van de gekozen relatie"
 msgid "Complete multipolygon for way {0}"
 msgstr "Maak het multipolygoon voor weg {0} compleet"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Twee ringen zijn gelijk en zouden dat niet moeten zijn."
+
+msgid "Multipolygon from rings"
+msgstr "Multipolygoon uit ringen"
+
 msgid "Node without ''house'' role found"
 msgstr "Node zonder de rol ''house'' gevonden"
 
@@ -32839,13 +33038,13 @@ msgid "Tool:To-fix"
 msgstr "Programma:Te repareren"
 
 msgid "Enable Tofix plugin"
-msgstr ""
+msgstr "Plug-in Tofix inschakelen"
 
 msgid "Auto delete layer"
-msgstr ""
+msgstr "Laag automatisch verwijderen"
 
 msgid "Select the checkbox to:"
-msgstr ""
+msgstr "Het keuzevak selecteren om:"
 
 msgid "Skip"
 msgstr "Overslaan"
@@ -32863,10 +33062,10 @@ msgid "Not an error"
 msgstr "Geen fout"
 
 msgid "<html><a href=\"\">List of tasks</a></html>"
-msgstr ""
+msgstr "<html><a href=\"\">Takenlijst</a></html>"
 
 msgid "Select a task ..."
-msgstr ""
+msgstr "Een taak selecteren ..."
 
 msgid "Set download area (m²)"
 msgstr "Downloadgebied instellen (m²)"
@@ -32875,13 +33074,13 @@ msgid "~.02"
 msgstr "~.02"
 
 msgid "Tasks"
-msgstr ""
+msgstr "Taken"
 
 msgid "Config"
-msgstr ""
+msgstr "Configureren"
 
 msgid "Activation"
-msgstr ""
+msgstr "Activeren"
 
 msgid "tofix:Skip item"
 msgstr "tofix:Item overslaan"
@@ -32893,7 +33092,7 @@ msgid "tofix:Not a Error item"
 msgstr "tofix:Item Geen fout"
 
 msgid "Activate to-fix plugin."
-msgstr ""
+msgstr "Plug-in to-fix activeren"
 
 msgid "Maintenance server"
 msgstr "Onderhoudsserver"
@@ -32909,7 +33108,7 @@ msgid "Something went wrong, try again"
 msgstr "Er ging iets mis, probeer opnieuw"
 
 msgid "No change to upload!"
-msgstr ""
+msgstr "Geen wijziging om te uploaden!"
 
 msgid "Cannot place a node outside of the world."
 msgstr "Kan geen knoop buiten de wereld plaatsen."
@@ -33972,12 +34171,6 @@ msgstr "Het lid uit de beperking Afslaan verwijderen"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Schakel over naar de bewerker Basis en selecteer een weg"
 
-msgid "Undelete object..."
-msgstr "Object terughalen..."
-
-msgid "Undelete object by id"
-msgstr "Object terughalen op ID"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Onmogelijk verwijderen ongedaan te maken voor knoop {0}. Object is "
@@ -33993,6 +34186,12 @@ msgstr ""
 "Onmogelijk verwijderen ongedaan te maken voor relatie {0}. Object is "
 "vermoedelijk bewerkt"
 
+msgid "Undelete object..."
+msgstr "Object terughalen..."
+
+msgid "Undelete object by id"
+msgstr "Object terughalen op ID"
+
 msgid "Undelete Object"
 msgstr "Object terughalen"
 
@@ -34739,6 +34938,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] "Overschrijf ''{0}'' tag {1} van {2} met nieuwe waarde ''{3}''?"
 msgstr[1] "Overschrijf ''{0}'' tags {1} van {2} met nieuwe waarde ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Voeg namen vanaf Wikipedia toe"
 
@@ -34777,11 +34982,14 @@ msgstr "beschikbaar in lokale gegevensset"
 msgid "Not linked yet"
 msgstr "Nog niet gekoppeld"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Haalt alle coördinaten van Wikipedia op voor de huidige weergave"
diff --git a/i18n/po/nn.po b/i18n/po/nn.po
index 269dba2..0e146e4 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:54+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:56+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: nn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/oc.po b/i18n/po/oc.po
index af2a087..09d3612 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:55+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:57+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2623,14 +2623,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2646,6 +2638,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "SC"
@@ -3913,9 +3913,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9001,7 +8998,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14563,6 +14560,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14803,7 +14803,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15781,6 +15781,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17564,18 +17567,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18765,6 +18783,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18969,9 +19053,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18996,15 +19077,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22791,9 +22863,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23830,6 +23899,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23982,6 +24066,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24354,6 +24441,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26221,13 +26311,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26349,6 +26439,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27045,9 +27147,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27579,6 +27678,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27618,6 +27726,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27756,9 +27876,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27850,12 +27967,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29212,33 +29338,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29638,6 +29812,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31299,19 +31479,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31967,6 +32147,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31999,10 +32185,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/pa.po b/i18n/po/pa.po
index 127a232..1a6e958 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:56+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:58+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: pa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/pl.po b/i18n/po/pl.po
index 42bbe18..21ee5a2 100644
--- a/i18n/po/pl.po
+++ b/i18n/po/pl.po
@@ -7,17 +7,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-05 11:05+0000\n"
-"Last-Translator: Rafał Rudzik <rrudzik at gmail.com>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-10 06:11+0000\n"
+"Last-Translator: Daniel Koć <daniel at xn--ko-wla.pl>\n"
 "Language-Team: Polish <josm-lang-pl at googlegroups.com>\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: 2016-06-06 04:31+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:59+0000\n"
+"X-Generator: Launchpad (build 18115)\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"
@@ -2863,15 +2863,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "obiekty (i wszystkie jego węzły linii / członków relacji) w pobranym obszarze"
 
-msgid "Searching"
-msgstr "Szukanie"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Szukanie w {0} obiekcie"
-msgstr[1] "Szukanie w {0} obiektach"
-msgstr[2] "Szukanie w {0} obiektach"
-
 msgid "No match found for ''{0}''"
 msgstr "Nie znaleziono nic szukając ''{0}''"
 
@@ -2887,6 +2878,15 @@ msgstr "Nic nie zostało znalezione w zaznaczeniu szukając \"{0}\""
 msgid "Found {0} matches"
 msgstr "Znaleziono {0} pasujących."
 
+msgid "Searching"
+msgstr "Szukanie"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Szukanie w {0} obiekcie"
+msgstr[1] "Szukanie w {0} obiektach"
+msgstr[2] "Szukanie w {0} obiektach"
+
 msgctxt "search"
 msgid "CS"
 msgstr "wielkość liter istotna"
@@ -4289,9 +4289,6 @@ msgstr "Tagi internetowe"
 msgid "Checks for errors in internet-related tags."
 msgstr "Sprawdza błędy w tagach związanych z Internetem"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Nie można skonwertować adresu URl na ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9773,8 +9770,8 @@ msgstr "przybliż by wczytać kafelki"
 msgid "zoom in to load more tiles"
 msgstr "przybliż by wczytać więcej kafelków"
 
-msgid "increase zoom level to see more detail"
-msgstr "przybliż by zobaczyć więcej detali"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Brak kafelków na tym poziomie przybliżenia"
@@ -15704,6 +15701,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15944,7 +15944,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16926,6 +16926,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17302,10 +17305,10 @@ msgid "concrete"
 msgstr "beton"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "beton (płyty)"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "beton (ślady)"
 
 msgid "paving_stones"
 msgstr "kostka"
@@ -17471,7 +17474,7 @@ msgid "Width (meters)"
 msgstr "Szerokość (w metrach)"
 
 msgid "Sidewalk"
-msgstr "Chodnik"
+msgstr ""
 
 msgctxt "sidewalk"
 msgid "both"
@@ -17698,7 +17701,7 @@ msgid "isolated"
 msgstr "wydzielone pomieszczenie"
 
 msgid "outside"
-msgstr ""
+msgstr "na zewnątrz"
 
 msgid "Height (meters)"
 msgstr "Wysokość (w metrach)"
@@ -18039,7 +18042,7 @@ msgstr ""
 "liście odpadają i nowe zaczynają rosnąć"
 
 msgid "semi_evergreen"
-msgstr "częsciowo zawsze zielone"
+msgstr "częściowo zawsze zielone"
 
 msgid ""
 "Plants that lose most, but not all, of their foliage for a fraction of the "
@@ -18644,7 +18647,7 @@ msgid "All vehicles"
 msgstr "Wszystkie typy pojazdów"
 
 msgid "use_sidepath"
-msgstr ""
+msgstr "jazda poboczem"
 
 msgid "Motor vehicles"
 msgstr "Pojazdy silnikowe"
@@ -18730,18 +18733,33 @@ msgstr "Typ drogi"
 msgid "grade1"
 msgstr "1 stopnia"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "2 stopnia"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "3 stopnia"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "4 stopnia"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "5 stopnia"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Skala MTB"
 
@@ -18893,11 +18911,11 @@ msgstr "Ścieżka dla pieszych"
 
 msgctxt "footway"
 msgid "sidewalk"
-msgstr ""
+msgstr "chodnik wzdłuż drogi"
 
 msgctxt "footway"
 msgid "crossing"
-msgstr ""
+msgstr "przejście dla pieszych"
 
 msgid "Steps"
 msgstr "Schody"
@@ -18921,7 +18939,7 @@ msgid "Luggage ramp"
 msgstr "Rampa na bagaż"
 
 msgid "automatic"
-msgstr "atomatyczna"
+msgstr "automatyczna"
 
 msgid "manual"
 msgstr "ręczna"
@@ -18939,7 +18957,7 @@ msgid "Right handrail"
 msgstr "Poręcz z prawej"
 
 msgid "Escalator"
-msgstr ""
+msgstr "Schody ruchome"
 
 msgid "forward"
 msgstr ""
@@ -19155,7 +19173,7 @@ msgid "Bollard type"
 msgstr "Rodzaj słupka"
 
 msgid "rising"
-msgstr ""
+msgstr "podnoszony"
 
 msgid "removable"
 msgstr "możliwe do usunięcia"
@@ -19203,7 +19221,7 @@ msgid "chain_link"
 msgstr "siatka z drutu"
 
 msgid "electric"
-msgstr "energia elektryczna"
+msgstr "elektryczność"
 
 msgid "pole"
 msgstr "słup"
@@ -19221,10 +19239,10 @@ msgid "Wall"
 msgstr "Mur"
 
 msgid "dry_stone"
-msgstr ""
+msgstr "kamienny"
 
 msgid "noise_barrier"
-msgstr ""
+msgstr "ekran akustyczny"
 
 msgid "City Wall"
 msgstr "Mury miejskie"
@@ -19243,7 +19261,7 @@ msgid "Kerb"
 msgstr "Krawężnik"
 
 msgid "Tactile paving"
-msgstr ""
+msgstr "Nawierzchnia dla niewidomych"
 
 msgid "Entrance (Barrier Opening)"
 msgstr "Przejście przez ogrodzenie"
@@ -19933,6 +19951,72 @@ msgstr "Napięcie"
 msgid "Amperage"
 msgstr "Natężenie"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Myjnia samochodowa"
 
@@ -20137,9 +20221,6 @@ msgstr "Przystanek tramwajowy (przestarzałe)"
 msgid "Train"
 msgstr "Pociąg"
 
-msgid "Railway station (legacy)"
-msgstr "Stacja kolejowa (przestarzałe)"
-
 msgid "Railway halt (legacy)"
 msgstr "Przystanek kolejowy (przestarzałe)"
 
@@ -20164,15 +20245,6 @@ msgstr "Schronienie"
 msgid "Waste Basket/Trash Can"
 msgstr "Kosz na śmieci"
 
-msgid "Highway platform (legacy)"
-msgstr "Peron autobusowy (przestarzałe)"
-
-msgid "Railway platform (legacy)"
-msgstr "Peron kolejowy (przestarzałe)"
-
-msgid "funicular"
-msgstr "Kolej linowo-terenowa"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stacja kolejowa"
@@ -20651,10 +20723,10 @@ msgid "audio"
 msgstr "dźwiękowe"
 
 msgid "radio"
-msgstr ""
+msgstr "radiowe"
 
 msgid "television"
-msgstr ""
+msgstr "telewizyjne"
 
 msgid "video"
 msgstr "filmowe"
@@ -21409,7 +21481,7 @@ msgstr "Bunkier (przeszkoda)"
 
 msgctxt "golf"
 msgid "Natural"
-msgstr ""
+msgstr "Rodzaj"
 
 msgctxt "golf"
 msgid "Frontal Water hazard"
@@ -21871,7 +21943,7 @@ msgstr "wieża transformatorowa"
 
 msgctxt "building"
 msgid "public"
-msgstr ""
+msgstr "budynek użyteczności publicznej"
 
 msgctxt "building"
 msgid "Levels"
@@ -21994,7 +22066,7 @@ msgstr "Zbiornik przemysłowy"
 
 msgctxt "content"
 msgid "fuel"
-msgstr ""
+msgstr "paliwo"
 
 msgctxt "content"
 msgid "manure"
@@ -22429,10 +22501,10 @@ msgid "gas_turbine"
 msgstr "turbina gazowa"
 
 msgid "reciprocating_engine"
-msgstr ""
+msgstr "silnik tłokowy"
 
 msgid "steam_generator"
-msgstr ""
+msgstr "kocioł parowy"
 
 msgid "Biogas Power Generator"
 msgstr "Generator na biogaz"
@@ -22449,11 +22521,11 @@ msgstr ""
 
 msgctxt "generator method"
 msgid "combustion"
-msgstr ""
+msgstr "spalanie"
 
 msgctxt "generator method"
 msgid "gasification"
-msgstr ""
+msgstr "zgazowanie"
 
 msgid "bioreactor"
 msgstr "bioreaktor"
@@ -22462,13 +22534,13 @@ msgid "anaerobic_digestion / combustion"
 msgstr ""
 
 msgid "pyrolysis"
-msgstr ""
+msgstr "piroliza"
 
 msgid "combustion"
-msgstr ""
+msgstr "spalanie"
 
 msgid "steam_turbine"
-msgstr ""
+msgstr "turbina parowa"
 
 msgid "Coal Power Generator"
 msgstr "Elektrownia węglowa"
@@ -22477,7 +22549,7 @@ msgid "Gas Power Generator"
 msgstr "Elektrownia gazowa"
 
 msgid "combined_cycle"
-msgstr ""
+msgstr "gazowo-parowy"
 
 msgid "Oil Power Generator"
 msgstr "Elektrownia na ropę"
@@ -22584,10 +22656,10 @@ msgstr "Elektrownia na odpady"
 
 msgctxt "generator method"
 msgid "pyrolysis"
-msgstr ""
+msgstr "piroliza"
 
 msgid "gasification"
-msgstr ""
+msgstr "zgazowanie"
 
 msgid "Water Turbine"
 msgstr "Turbina wodna"
@@ -22797,7 +22869,7 @@ msgid "Power Compensator"
 msgstr "Kompensator"
 
 msgid "Type of compensator"
-msgstr ""
+msgstr "Typ kompensatora"
 
 msgctxt "power"
 msgid "shunt_reactor"
@@ -22862,7 +22934,7 @@ msgid "tubular"
 msgstr "rurowa"
 
 msgid "solid"
-msgstr ""
+msgstr "wypełniona"
 
 msgid "steel"
 msgstr "stal"
@@ -22876,15 +22948,15 @@ msgstr "Kształt bramki"
 
 msgctxt "power"
 msgid "portal"
-msgstr ""
+msgstr "jednopoziomowa"
 
 msgctxt "power"
 msgid "portal_two-level"
-msgstr ""
+msgstr "dwupoziomowa"
 
 msgctxt "power"
 msgid "portal_three-level"
-msgstr ""
+msgstr "trójpoziomowa"
 
 msgid "Power Tower"
 msgstr "Słup wysokiego napięcia"
@@ -23106,7 +23178,7 @@ msgstr "pod wodą"
 
 msgctxt "power cable"
 msgid "overground"
-msgstr "po ziemi"
+msgstr "na ziemi"
 
 msgid "Historic Places"
 msgstr "Miejsca historyczne"
@@ -23464,7 +23536,7 @@ msgid "food"
 msgstr "jedzenie"
 
 msgid "newspapers"
-msgstr ""
+msgstr "gazety"
 
 msgid "parking_tickets"
 msgstr "bilety parkingowe"
@@ -23479,7 +23551,7 @@ msgid "public_transport_tickets"
 msgstr "bilety komunikacji miejskiej"
 
 msgid "SIM_cards"
-msgstr ""
+msgstr "karty SIM"
 
 msgid "stamps"
 msgstr "znaczki"
@@ -23962,9 +24034,6 @@ msgstr "Drzewo"
 msgid "A single tree."
 msgstr "Pojedyncze drzewo"
 
-msgid "Botanical Name"
-msgstr "Nazwa systematyczna"
-
 msgid "Tree Row"
 msgstr "Rząd drzew"
 
@@ -24151,7 +24220,7 @@ msgid "apple_trees"
 msgstr "jabłonie"
 
 msgid "oil_palms"
-msgstr ""
+msgstr "palmy olejowe"
 
 msgid "orange_trees"
 msgstr "drzewka pomarańczowe"
@@ -24160,7 +24229,7 @@ msgid "almond_trees"
 msgstr "migdałowce"
 
 msgid "banana_plants"
-msgstr ""
+msgstr "bananowce"
 
 msgid "coconut_palms"
 msgstr ""
@@ -24184,7 +24253,7 @@ msgid "peach_trees"
 msgstr "brzoskwinie"
 
 msgid "tea_plants"
-msgstr ""
+msgstr "krzewy herbaciane"
 
 msgid "Vineyard"
 msgstr "Winnica"
@@ -24865,7 +24934,7 @@ msgid "ditch"
 msgstr "rów"
 
 msgid "Name of river/lake/sea/ocean it runs into"
-msgstr ""
+msgstr "Nazwa rzeki/jeziora/morza/oceanu do którego wpada"
 
 msgid "Reference Sandre (FR)"
 msgstr "Oznaczenie Sandre (Francja)"
@@ -25005,6 +25074,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} jest przestarzały"
 
@@ -25157,6 +25241,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -25530,6 +25617,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "przybliż by zobaczyć więcej detali"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -25648,7 +25738,7 @@ msgid "Line information"
 msgstr ""
 
 msgid "Cannot place node outside of the world."
-msgstr ""
+msgstr "Nie można wstawiać punktów poza światem"
 
 msgid "Draw the way by mouse"
 msgstr ""
@@ -26493,7 +26583,7 @@ msgid "Buildings tags:"
 msgstr "Tagi budynków:"
 
 msgid "Cannot place building outside of the world."
-msgstr ""
+msgstr "Nie można wstawiać budynków poza światem"
 
 msgid "Create building"
 msgstr "Stwórz budynek"
@@ -27408,15 +27498,15 @@ msgstr "pomiędzy {0} {1} i {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  dodawanie {0} {1}"
 
+msgid "EditGpx"
+msgstr ""
+
 msgid "Layer for editing GPX tracks"
 msgstr "Warstwa do edycji śladów GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
-msgid "EditGpx"
-msgstr ""
-
 msgid "edit gpx tracks"
 msgstr "edytuj ślady gpx"
 
@@ -27537,6 +27627,18 @@ msgstr "Wyczyść log"
 msgid "Show users on map"
 msgstr "Pokaż użytkowników na mapie"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Tylko pozycja"
 
@@ -28237,9 +28339,6 @@ msgstr "Wyświetl niezgeolokalizowane obrazy"
 msgid "Imported Images"
 msgstr "Wczytane obrazy"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Pliki graficzne (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importuje grafikę wektorową"
 
@@ -28773,6 +28872,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28812,6 +28920,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28950,9 +29070,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29044,12 +29161,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30421,33 +30547,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30847,6 +31021,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr "Uzupełnij wielokąt złożony dla linii {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -32571,12 +32751,6 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
-msgstr "Przywróć obiekt..."
-
-msgid "Undelete object by id"
-msgstr ""
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -32586,6 +32760,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Przywróć obiekt..."
+
+msgid "Undelete object by id"
+msgstr ""
+
 msgid "Undelete Object"
 msgstr "Przywróć obiekt"
 
@@ -33281,6 +33461,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Dodaj nazwy z Wikipedii"
 
@@ -33313,11 +33499,14 @@ msgstr "Dostępne w lokalnym zestawie danych"
 msgid "Not linked yet"
 msgstr "Jeszcze nie połączone"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Pobiera wszystkie współrzędne z Wikipedii dla aktualnego widoku"
diff --git a/i18n/po/pt.po b/i18n/po/pt.po
index 12ef4f2..b2f39d1 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-05-24 18:43+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: 2016-06-05 04:57+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:00+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: pt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2884,14 +2884,6 @@ msgstr ""
 "objetos (e todos os seus nós em linhas / membros de relações) na área "
 "descarregada"
 
-msgid "Searching"
-msgstr "A procurar"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "A pesquisar em {0} objeto"
-msgstr[1] "A pesquisar em {0} objetos"
-
 msgid "No match found for ''{0}''"
 msgstr "Não foi encontrado nada com ''{0}''"
 
@@ -2907,6 +2899,14 @@ msgstr "Não foi encontrado nada na seleção ao procurar por ''{0}''"
 msgid "Found {0} matches"
 msgstr "Encontrados {0} resultados"
 
+msgid "Searching"
+msgstr "A procurar"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "A pesquisar em {0} objeto"
+msgstr[1] "A pesquisar em {0} objetos"
+
 msgctxt "search"
 msgid "CS"
 msgstr "MAI"
@@ -4313,9 +4313,6 @@ msgstr "Etiquetas de páginas da internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Verifica se existem erros em etiquetas sobre Internet"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " não foi possível converter o URL para ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9974,8 +9971,8 @@ msgstr "aproximar o enquadramento para carregar qualquer tela"
 msgid "zoom in to load more tiles"
 msgstr "aproximar o enquadramento para carregar mais telas"
 
-msgid "increase zoom level to see more detail"
-msgstr "aproxime o enquadramento para ver mais detalhes"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Sem telas a este nível"
@@ -16343,6 +16340,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator - Sobreposição"
 
@@ -16583,7 +16583,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17598,6 +17598,9 @@ msgstr ""
 "Converse com outras pessoas que estejam a editar nas redondezas do local que "
 "está a editar (necessário que usem o JOSM e este módulo)."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19537,18 +19540,33 @@ msgstr "Tipo de carreiro"
 msgid "grade1"
 msgstr "grau1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grau2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grau3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grau4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grau5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala MTB"
 
@@ -20753,6 +20771,72 @@ msgstr "Voltagem (em volts)"
 msgid "Amperage"
 msgstr "Amperagem"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Lavagem"
 
@@ -20957,9 +21041,6 @@ msgstr "Paragem de elétrico (em desuso)"
 msgid "Train"
 msgstr "Comboio"
 
-msgid "Railway station (legacy)"
-msgstr "Estação ferroviária (em desuso)"
-
 msgid "Railway halt (legacy)"
 msgstr "Apeadeiro ferroviário (em desuso)"
 
@@ -20984,15 +21065,6 @@ msgstr "Abrigo"
 msgid "Waste Basket/Trash Can"
 msgstr "Caixote de lixo"
 
-msgid "Highway platform (legacy)"
-msgstr "Plataforma rodoviária (em desuso)"
-
-msgid "Railway platform (legacy)"
-msgstr "Plataforma ferroviária (em desuso)"
-
-msgid "funicular"
-msgstr "funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estação Ferroviária"
@@ -24788,9 +24860,6 @@ msgstr "Árvore"
 msgid "A single tree."
 msgstr "Uma árvore."
 
-msgid "Botanical Name"
-msgstr "Nome Botânico"
-
 msgid "Tree Row"
 msgstr "Linha de Árvores"
 
@@ -25847,6 +25916,21 @@ msgstr "{0} e {1} junto com {2} e valores em conflito"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Combinação de etiquetas suspeita: {0} e {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "''{0}'' está em desuso"
 
@@ -26008,6 +26092,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome abreviado da rua"
 
@@ -26406,6 +26493,9 @@ msgstr "Mostra a camada da grelha de elevação"
 msgid "Elevation Grid"
 msgstr "Grelha de Elevação"
 
+msgid "increase zoom level to see more detail"
+msgstr "aproxime o enquadramento para ver mais detalhes"
+
 msgid "No SRTM data"
 msgstr "Sem dados SRTM"
 
@@ -28494,15 +28584,15 @@ msgstr "entre {0} {1} e {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  adicionando {0} {1}"
 
+msgid "EditGpx"
+msgstr "Editar GPX"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Camada para editar trilhos GPS (GPX)"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Converter numa camada GPX (GPS) com marcas de tempo anónimas"
 
-msgid "EditGpx"
-msgstr "Editar GPX"
-
 msgid "edit gpx tracks"
 msgstr "editar trilhos gps"
 
@@ -28625,6 +28715,18 @@ msgstr "Limpar registo"
 msgid "Show users on map"
 msgstr "Mostrar utilizadores no mapa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Apenas posição"
 
@@ -29388,9 +29490,6 @@ msgstr "Mostrar fotografias sem geo-referências"
 msgid "Imported Images"
 msgstr "Imagens Importadas"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Ficheiros de imagens (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importar gráficos vetoriais"
 
@@ -29945,6 +30044,15 @@ msgstr "Unir/Separar imagens"
 msgid "Join Mapillary pictures"
 msgstr "Unir imagens Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Enviar imagens"
 
@@ -29984,6 +30092,18 @@ msgstr "Copiar etiqueta da chave"
 msgid "Edit on website"
 msgstr "Editar no site"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exportar todas as imagens"
 
@@ -30122,9 +30242,6 @@ msgstr "Pausa"
 msgid "Pauses the walk."
 msgstr "Pausa o modo a pé"
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Inverter posição dos botões ao ver as imagens."
-
 msgid "Display hour when the picture was taken"
 msgstr "Mostrar a hora a que a fotografia foi tirada"
 
@@ -30219,12 +30336,21 @@ msgstr "A descarregar imagens Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Total de imagens Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Nenhuma imagem encontrada"
 
 msgid "Finished upload"
 msgstr "Envio terminado"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "A enviar: {0}"
 
@@ -31681,33 +31807,81 @@ msgstr "Módulo Proj4J (projeções adicionais, experimental)"
 msgid "Code"
 msgstr "Código da projeção"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -32116,6 +32290,12 @@ msgstr "Corrigir funções dos membros da relação escolhida"
 msgid "Complete multipolygon for way {0}"
 msgstr "Completar multi-polígono na linha {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Encontrado nó sem a função ''house'' (habitação)"
 
@@ -33965,13 +34145,6 @@ msgstr "Remover o membro da restrição"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Mudar para o Editor Básico e selecionar uma linha"
 
-msgid "Undelete object..."
-msgstr "Recuperar objeto eliminado..."
-
-msgid "Undelete object by id"
-msgstr ""
-"Recuperar um objeto eliminado no OpenStreetMap através do seu identificador"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -33981,6 +34154,13 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Recuperar objeto eliminado..."
+
+msgid "Undelete object by id"
+msgstr ""
+"Recuperar um objeto eliminado no OpenStreetMap através do seu identificador"
+
 msgid "Undelete Object"
 msgstr "Recuperar Objeto Eliminado"
 
@@ -34748,6 +34928,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Adicionar nomes da Wikipédia"
 
@@ -34785,11 +34971,14 @@ msgstr "Já aplicado num objeto no mapa local"
 msgid "Not linked yet"
 msgstr "Nenhum objeto no mapa local com esta etiqueta da Wikipédia"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/pt_BR.po b/i18n/po/pt_BR.po
index d694e9e..ac12451 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-04 18:16+0000\n"
-"Last-Translator: Lucas Pereira <lucaspefreitas at gmail.com>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-11 23:20+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: 2016-06-05 05:07+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:10+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: pt_BR\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -966,7 +966,7 @@ msgid "Cannot move objects outside of the world."
 msgstr "Não é possível mover objetos para fora do planeta."
 
 msgid "Move Node..."
-msgstr "Move Nó..."
+msgstr "Mover Nó..."
 
 msgid "Edit latitude and longitude of a node."
 msgstr "Editar latitude e longitude de um nó."
@@ -2840,14 +2840,6 @@ msgstr ""
 "objetos (e todos os nós dos caminhos / membros da relação) na área "
 "descarregada"
 
-msgid "Searching"
-msgstr "Procurando"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Pesquisando em {0} objeto"
-msgstr[1] "Pesquisando em {0} objetos"
-
 msgid "No match found for ''{0}''"
 msgstr "Não há valores coincidentes para ''{0}''"
 
@@ -2863,6 +2855,14 @@ msgstr "Nada encontrado na seleção ao pesquisar por ''{0}''"
 msgid "Found {0} matches"
 msgstr "Encontrados {0} resultados"
 
+msgid "Searching"
+msgstr "Procurando"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Pesquisando em {0} objeto"
+msgstr[1] "Pesquisando em {0} objetos"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4258,9 +4258,6 @@ msgstr "Tags da internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Verifica se há erros nas tags relacionados à internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL não pode ser convertida para ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9815,7 +9812,7 @@ msgid "Metadata "
 msgstr "Metadados "
 
 msgid "Load tile"
-msgstr "Carregr tile"
+msgstr "Carregar tile"
 
 msgid "Auto zoom"
 msgstr "Zoom automático"
@@ -9856,8 +9853,8 @@ msgstr "zoom para carregar todos os quadros"
 msgid "zoom in to load more tiles"
 msgstr "zoom para carregar mais quadros"
 
-msgid "increase zoom level to see more detail"
-msgstr "aumentar nível de zoom para ver mais detalhes"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Sem quadros neste nível de zoom"
@@ -12067,14 +12064,15 @@ msgid ""
 "{0} is replaced by tile zoom level, also supported:<br>offsets to the zoom "
 "level: {1} or {2}<br>reversed zoom level: {3}"
 msgstr ""
-"{0} foi substituído pelo nível de zoom tile, também apoiou:<br>compensações "
-"ao nível de zoom:{1} ou {2}<br>revertido nível de zoom: {3}"
+"{0} é substituído pelo nível de zoom do tile, também "
+"suportando:<br>deslocamentos no nível de zoom:{1} ou {2}<br>nível de zoom "
+"inverso: {3}"
 
 msgid "{0} is replaced by X-coordinate of the tile"
-msgstr "{0} foi substituído por coordenada X do tile"
+msgstr "{0} é substituído pela coordenada X do tile"
 
 msgid "{0} is replaced by Y-coordinate of the tile"
-msgstr "{0} foi substituído por coordenadaY do tile"
+msgstr "{0} é substituído pela coordenada Y do tile"
 
 msgid "{0} is replaced by {1} (Yahoo style Y coordinate)"
 msgstr "{0} foi substituido por {1} (Yahoo style Y coordinate)"
@@ -12083,15 +12081,15 @@ msgid ""
 "{0} is replaced by {1} (OSGeo Tile Map Service Specification style Y "
 "coordinate)"
 msgstr ""
-"{0} foi substituído por {1} (OSGeo Tile Map Service Specification style Y "
+"{0} é substituído por {1} (OSGeo Tile Map Service Specification style Y "
 "coordinate)"
 
 msgid ""
 "{0} is replaced by a random selection from the given comma separated list, "
 "e.g. {1}"
 msgstr ""
-"{0} foi substituído por uma seleção aleatória da lista separada vírgula "
-"dada, por exemplo, {1}"
+"{0} é substituído por uma seleção aleatória de uma lista separada por "
+"vírgula, por exemplo, {1}"
 
 msgid "2. Enter maximum zoom (optional)"
 msgstr "2.  Digite o zoom máximo (opcional)"
@@ -16128,6 +16126,9 @@ msgstr "Strava cycling heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava running heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -16368,7 +16369,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -17385,6 +17386,9 @@ msgstr ""
 "Converse com os usuários que estão editando o mapa próximo, ser notificado "
 "quando alguém chegar perto."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17935,7 +17939,7 @@ msgstr "campo"
 
 msgctxt "riding"
 msgid "sports_centre"
-msgstr "sports_centre"
+msgstr "centro de esportes"
 
 msgctxt "riding"
 msgid "stadium"
@@ -18248,7 +18252,7 @@ msgid "pitch"
 msgstr "campo"
 
 msgid "sports_centre"
-msgstr "sports_centre"
+msgstr "centro de esportes"
 
 msgid "stadium"
 msgstr "estádio"
@@ -19255,7 +19259,7 @@ msgid "construction"
 msgstr "em construção"
 
 msgid "Ford"
-msgstr "Travessia de rio"
+msgstr "Vau"
 
 msgid "Ways"
 msgstr "Vias"
@@ -19269,18 +19273,33 @@ msgstr "Tipo de trilha"
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "Escala MTB"
 
@@ -19912,7 +19931,7 @@ msgid "Dam"
 msgstr "Barragem"
 
 msgid "Groyne"
-msgstr "Molhe"
+msgstr "Espigão"
 
 msgid "Breakwater"
 msgstr "Quebra-mar"
@@ -20492,6 +20511,72 @@ msgstr "Voltagem"
 msgid "Amperage"
 msgstr "Amperagem"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Lava Jato"
 
@@ -20559,7 +20644,7 @@ msgid "ground_slots"
 msgstr "encaixe no chão"
 
 msgid "informal"
-msgstr "Informal"
+msgstr "informal"
 
 msgid "lockers"
 msgstr "armários"
@@ -20571,7 +20656,7 @@ msgid "shed"
 msgstr "abrigo"
 
 msgid "stands"
-msgstr "u-invertido"
+msgstr "\"u\" invertido"
 
 msgid "wall_loops"
 msgstr "grelha"
@@ -20696,9 +20781,6 @@ msgstr "Parada de bonde (legado)"
 msgid "Train"
 msgstr "Trem"
 
-msgid "Railway station (legacy)"
-msgstr "Estação Ferroviária"
-
 msgid "Railway halt (legacy)"
 msgstr "Parada Ferroviária (legado)"
 
@@ -20723,15 +20805,6 @@ msgstr "Abrigo"
 msgid "Waste Basket/Trash Can"
 msgstr "Cesta de Lixo/Lata de lixo"
 
-msgid "Highway platform (legacy)"
-msgstr "Plataforma Rodoviária (legado)"
-
-msgid "Railway platform (legacy)"
-msgstr "Plataforma Ferroviária"
-
-msgid "funicular"
-msgstr "Funicular"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Estação"
@@ -22005,11 +22078,11 @@ msgstr "Multi"
 
 msgctxt "running"
 msgid "pitch"
-msgstr "passo"
+msgstr "campo"
 
 msgctxt "running"
 msgid "sports_centre"
-msgstr "sports_centre"
+msgstr "centro de esportes"
 
 msgctxt "running"
 msgid "stadium"
@@ -22017,7 +22090,7 @@ msgstr "estádio"
 
 msgctxt "running"
 msgid "track"
-msgstr "trilha"
+msgstr "pista"
 
 msgid "Nine-pin Bowling"
 msgstr "Boliche de nove pinos"
@@ -22046,7 +22119,7 @@ msgstr "arremesso"
 
 msgctxt "racing"
 msgid "sports_centre"
-msgstr "sports_centre"
+msgstr "centro de esportes"
 
 msgctxt "racing"
 msgid "stadium"
@@ -22054,7 +22127,7 @@ msgstr "estádio"
 
 msgctxt "racing"
 msgid "track"
-msgstr "trilha"
+msgstr "pista"
 
 msgid "Dog Racing"
 msgstr "Corrida de Cães"
@@ -22271,15 +22344,15 @@ msgstr "Pista para Aeromodelo"
 
 msgctxt "aerialway"
 msgid "pitch"
-msgstr "passo"
+msgstr "campo"
 
 msgctxt "aerialway"
 msgid "sports_centre"
-msgstr "sports_centre"
+msgstr "centro de esportes"
 
 msgctxt "aerialway"
 msgid "track"
-msgstr "trilha"
+msgstr "pista"
 
 msgid "RC Car"
 msgstr "Carro RC"
@@ -24527,9 +24600,6 @@ msgstr "Árvore"
 msgid "A single tree."
 msgstr "Uma única árvore."
 
-msgid "Botanical Name"
-msgstr "Nome Botânico"
-
 msgid "Tree Row"
 msgstr "Fileira de árvores"
 
@@ -25585,6 +25655,21 @@ msgstr "{0} e {1} junta com {2} e valores conflitantes"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Combinação suspeita de etiquetas: {0} e {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} está obsoleta"
 
@@ -25750,6 +25835,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome da rua abreviado"
 
@@ -26145,6 +26233,9 @@ msgstr "Mostrar camada da Grade de elevação"
 msgid "Elevation Grid"
 msgstr "Grade de elevação"
 
+msgid "increase zoom level to see more detail"
+msgstr "aumentar nível de zoom para ver mais detalhes"
+
 msgid "No SRTM data"
 msgstr "Sem dados SRTM"
 
@@ -28242,15 +28333,15 @@ msgstr "entre {0} {1} e {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  adicionando {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Camada para editar trilhas GPX"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Converte para camada GPX com tempo anônimo"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "Editar trilhas GPX"
 
@@ -28374,6 +28465,18 @@ msgstr "Limpar log"
 msgid "Show users on map"
 msgstr "Mostrar usuários no mapa"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Somente posição"
 
@@ -29131,9 +29234,6 @@ msgstr "Mostrar fotos não georeferenciadas"
 msgid "Imported Images"
 msgstr "Imagens importadas"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Arquivo de imagens (*.jpg *.jpeg *.png *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importar gráficos vetoriais"
 
@@ -29684,6 +29784,15 @@ msgstr "Juntar/Desunir imagens"
 msgid "Join Mapillary pictures"
 msgstr "Junte-se ao Mapillary pictures"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Enviar imagens"
 
@@ -29723,6 +29832,18 @@ msgstr "Copiar chave da tag"
 msgid "Edit on website"
 msgstr "Editar no site"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exportar todas as imagens"
 
@@ -29861,9 +29982,6 @@ msgstr "Pausar"
 msgid "Pauses the walk."
 msgstr "Pausa a caminhada."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Inverta a posição botões quando exibir imagens."
-
 msgid "Display hour when the picture was taken"
 msgstr "Mostra hora quando a foto foi tirada"
 
@@ -29958,12 +30076,21 @@ msgstr "Baixar imagens do Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Total de imagens Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Nenhuma imagem encontrada"
 
 msgid "Finished upload"
 msgstr "Upload terminado"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Enviando: {0}"
 
@@ -31412,33 +31539,81 @@ msgstr "Proj4J Plugin"
 msgid "Code"
 msgstr "Código"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31846,6 +32021,12 @@ msgstr "Corrigir as funções dos membros escolhidos da relação"
 msgid "Complete multipolygon for way {0}"
 msgstr "Multipolígono completo para a via {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Nó sem função ''casa'' encontrado"
 
@@ -33681,12 +33862,6 @@ msgstr "Apagar o número da restrição da conversão"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Altera para o editor básico e seleciona uma via"
 
-msgid "Undelete object..."
-msgstr "Retornar objetos apagados..."
-
-msgid "Undelete object by id"
-msgstr "Retornar objetos apagados por id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Não é possível desfazer a exclusão do nó {0}. Objeto foi provavelmente "
@@ -33702,6 +33877,12 @@ msgstr ""
 "Não é possível desfazer a exclusão da relação {0}. Objeto foi provavelmente "
 "etitado"
 
+msgid "Undelete object..."
+msgstr "Retornar objetos apagados..."
+
+msgid "Undelete object by id"
+msgstr "Retornar objetos apagados por id"
+
 msgid "Undelete Object"
 msgstr "Retornar objetos apagados..."
 
@@ -34435,6 +34616,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Adicionar nomes da Wikipédia"
 
@@ -34472,11 +34659,14 @@ msgstr "Disponível na base local"
 msgid "Not linked yet"
 msgstr "Não foi linkado ainda"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Retorna todas as coordenadas de Wikipedia na visão atual"
diff --git a/i18n/po/rm.po b/i18n/po/rm.po
index 9e5de35..47d6356 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:58+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:00+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ro.po b/i18n/po/ro.po
index b518426..a664dfc 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:58+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:01+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "X-Poedit-Country: ROMANIA\n"
 "Language: ro\n"
 "X-Poedit-Language: Romanian\n"
@@ -2670,14 +2670,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2693,6 +2685,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3964,9 +3964,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9054,7 +9051,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14621,6 +14618,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14861,7 +14861,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15839,6 +15839,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17622,18 +17625,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18823,6 +18841,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -19027,9 +19111,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19054,15 +19135,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22849,9 +22921,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23888,6 +23957,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24040,6 +24124,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24412,6 +24499,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26279,13 +26369,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26407,6 +26497,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27103,9 +27205,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27637,6 +27736,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27676,6 +27784,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27814,9 +27934,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27908,12 +28025,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29270,33 +29396,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29696,6 +29870,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31357,19 +31537,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32025,6 +32205,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32057,10 +32243,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/ru.po b/i18n/po/ru.po
index 4146b64..bdd825d 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-03 11:57+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-10 17:59+0000\n"
 "Last-Translator: Nkolay Parukhin <parukhin at gmail.com>\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: 2016-06-05 04:59+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:01+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ru_RU\n"
 
 msgid "Use OAuth"
@@ -2883,15 +2883,6 @@ msgstr "объекты в скачанной области"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "объекты (и все их точки/участники отношения) в скачанной области"
 
-msgid "Searching"
-msgstr "Поиск"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Поиск в {0} объекте"
-msgstr[1] "Поиск в {0} объектах"
-msgstr[2] "Поиск в {0} объектах"
-
 msgid "No match found for ''{0}''"
 msgstr "Не найдено совпадений для ''{0}''"
 
@@ -2907,6 +2898,15 @@ msgstr "Ничего не найдено в выделенном, при пои
 msgid "Found {0} matches"
 msgstr "Найдено {0} совпадений"
 
+msgid "Searching"
+msgstr "Поиск"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Поиск в {0} объекте"
+msgstr[1] "Поиск в {0} объектах"
+msgstr[2] "Поиск в {0} объектах"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4148,7 +4148,7 @@ msgid "Checks for errors in barriers and entrances."
 msgstr "Проверка ошибок в преградах и проходах."
 
 msgid "Barrier entrance not set on a barrier"
-msgstr "Для преграды не указан проход"
+msgstr "Проход  в преграде не на преграде"
 
 msgid "Coastlines"
 msgstr "Береговые линии"
@@ -4313,9 +4313,6 @@ msgstr "Интернет-теги"
 msgid "Checks for errors in internet-related tags."
 msgstr "Проверка на ошибки в тегах, связанных с Интернетом."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Не удалось преобразовать URL в ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -5349,7 +5346,7 @@ msgstr "Данные"
 
 msgctxt "menu"
 msgid "Selection"
-msgstr "Выделенные объекты"
+msgstr "Выделение"
 
 msgctxt "menu"
 msgid "Presets"
@@ -7106,7 +7103,7 @@ msgid "Relations: {0}"
 msgstr "Отношения: {0}"
 
 msgid "Selection"
-msgstr "Выделенные объекты"
+msgstr "Выделение"
 
 msgid "Open a selection list window."
 msgstr "Показать окно со списком выделенных объектов."
@@ -9983,8 +9980,10 @@ msgstr "приблизьте для загрузки квадратов"
 msgid "zoom in to load more tiles"
 msgstr "приблизьте для загрузки дополнительных квадратов"
 
-msgid "increase zoom level to see more detail"
-msgstr "увеличьте масштаб для лучшей детализации"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"увеличьте масштаб квадратов (измените разрешение), чтобы увидеть больше "
+"деталей"
 
 msgid "No tiles at this zoom level"
 msgstr "Нет квадратов на данном масштабе"
@@ -10093,7 +10092,7 @@ msgid "Save GPX file"
 msgstr "Сохранить файл GPX"
 
 msgid "Imagery fade"
-msgstr ""
+msgstr "Угасание подложки"
 
 msgid "Unsupported imagery type: {0}"
 msgstr "Неподдерживаемый тип подложки: {0}"
@@ -16295,6 +16294,9 @@ msgstr "Теплокарта Strava для велосипедистов"
 msgid "Strava running heatmap"
 msgstr "Теплокарта Strava для бегунов"
 
+msgid "Strava both heatmap"
+msgstr "Теплокарта Strava (оба вида)"
+
 msgid "Locator Overlay"
 msgstr "MapBox Locator (оверлей)"
 
@@ -16455,7 +16457,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC автобусные маршруты (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Бенин: Котону, Pleiade 2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE: карта городских районов"
@@ -16535,8 +16537,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr ""
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Бордо - 2012"
@@ -17547,6 +17549,9 @@ msgstr ""
 "Пообщаться с пользователями, редактирующими карту поблизости, получать "
 "уведомления, когда кто-нибудь окажется рядом."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Позволяет загрузить файл GeoJSON как слой."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18001,10 +18006,10 @@ msgid "concrete"
 msgstr "бетон"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "бетонные плиты (сплошные)"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "бетонные плиты (колея)"
 
 msgid "paving_stones"
 msgstr "тротуарная плитка"
@@ -19439,18 +19444,37 @@ msgstr "Уровень проходимости"
 msgid "grade1"
 msgstr "тип1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Твёрдая: асфальт или тщательно уплотнённый твёрдый материал"
+
 msgid "grade2"
 msgstr "тип2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+"Преимущественно твёрдая: гравий или камни в смеси с каким-либо мягким "
+"материалом"
+
 msgid "grade3"
 msgstr "тип3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Смесь твёрдых и мягких материалов в равной пропорции"
+
 msgid "grade4"
 msgstr "тип4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+"Преимущественно мягкая: грунт/песок/трава в смеси с каким-либо твёрдым "
+"материалом"
+
 msgid "grade5"
 msgstr "тип5"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Мягкая: грунт/песок/трава"
+
 msgid "MTB Scale"
 msgstr "Шкала MTB"
 
@@ -20660,6 +20684,72 @@ msgstr "Напряжение"
 msgid "Amperage"
 msgstr "Сила тока"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Типы транспорта, которые можно зарядить:"
+
+msgid "Scooter"
+msgstr "Скутер"
+
+msgid "Truck"
+msgstr "Грузовик"
+
+msgid "Number of Sockets:"
+msgstr "Количество разъёмов:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE синий"
+
+msgid "CEE red 16A"
+msgstr "CEE красный 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE красный 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Идентификация:"
+
+msgid "Phone call"
+msgstr "Телефонный звонок"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Членская карта"
+
 msgid "Wash"
 msgstr "Автомойка"
 
@@ -20866,9 +20956,6 @@ msgstr "Трамвайная остановка (устаревшее)"
 msgid "Train"
 msgstr "Поезд"
 
-msgid "Railway station (legacy)"
-msgstr "Железнодорожная станция (устаревший формат)"
-
 msgid "Railway halt (legacy)"
 msgstr "Остановочный пункт (устаревшее)"
 
@@ -20893,15 +20980,6 @@ msgstr "Навес"
 msgid "Waste Basket/Trash Can"
 msgstr "Урна"
 
-msgid "Highway platform (legacy)"
-msgstr "Остановка общественного транспорта (устар.)"
-
-msgid "Railway platform (legacy)"
-msgstr "Железнодорожная платформа (устаревший формат)"
-
-msgid "funicular"
-msgstr "фуникулёр"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Станция"
@@ -24694,9 +24772,6 @@ msgstr "Дерево"
 msgid "A single tree."
 msgstr "Отдельное дерево."
 
-msgid "Botanical Name"
-msgstr "Научное название"
-
 msgid "Tree Row"
 msgstr "Линия деревьев"
 
@@ -25750,6 +25825,27 @@ msgstr "{0} и {1} вместе с {2} и конфликтующие значе
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Подозрительная комбинация тегов: {0} и {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} на отношении без {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Длинный водный путь с {0}, но без тега тоннеля или подземного расположения. "
+"Удалите {1} или добавьте тег tunnel, если это применимо. Проверьте также "
+"пересекающие водный путь мосты и их теги {1}."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Короткий водный путь с {0}, но без тега тоннеля или подземного расположения. "
+"Удалите {1} или добавьте тег tunnel, если это применимо. Проверьте также "
+"пересекающие водный путь мосты и их теги {1}."
+
 msgid "{0} is deprecated"
 msgstr "{0} устарел"
 
@@ -25924,6 +26020,9 @@ msgstr ""
 "Водный путь заканчивается без соединения с другим водным путём или у него "
 "неправильное направление."
 
+msgid "Coastline inside {1}"
+msgstr "Береговая линия внутри {1}"
+
 msgid "abbreviated street name"
 msgstr "сокращённое обозначение улицы"
 
@@ -26321,6 +26420,9 @@ msgstr "Показать слой сетки высот"
 msgid "Elevation Grid"
 msgstr "Сетка высот"
 
+msgid "increase zoom level to see more detail"
+msgstr "увеличьте масштаб для лучшей детализации"
+
 msgid "No SRTM data"
 msgstr "Нет данных SRTM"
 
@@ -28412,15 +28514,15 @@ msgstr "между {0} {1} и {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  добавить {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Слой для редактирования GPX треков"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Преобразовать в GPX слой с обезличенным временем"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "Править GPX треки"
 
@@ -28543,6 +28645,18 @@ msgstr "Очистить журнал"
 msgid "Show users on map"
 msgstr "Показать пользователей на карте"
 
+msgid "GeoJSON file"
+msgstr "Файл GeoJSON"
+
+msgid "Loading json file..."
+msgstr "Загрузка json-файла..."
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Слой данных из GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Ошибка загрузки файла GeoJSON {0}"
+
 msgid "Position only"
 msgstr "Только положение"
 
@@ -29292,9 +29406,6 @@ msgstr "Показать фотографии без геотегов"
 msgid "Imported Images"
 msgstr "Импортированные изображения"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Файлы изображений (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Импорт векторной графики"
 
@@ -29854,6 +29965,15 @@ msgstr "Соединить/разъединить снимки"
 msgid "Join Mapillary pictures"
 msgstr "Объединить снимки Mapillary"
 
+msgid "Submit changeset"
+msgstr "Передать пакет правок"
+
+msgid "Submit the current changeset"
+msgstr "Передать текущий пакет правок"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Передать текущий  пакет правок в Mapillary"
+
 msgid "Upload pictures"
 msgstr "Отправить снимки"
 
@@ -29893,6 +30013,18 @@ msgstr "Копировать тег"
 msgid "Edit on website"
 msgstr "Изменить на сайте"
 
+msgid "Current Mapillary changeset"
+msgstr "Текущий  пакет правок Mapillary"
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr "Пакет правок Mapillary"
+
+msgid "Submit"
+msgstr "Передать"
+
 msgid "Export all images"
 msgstr "Экспортировать все снимки"
 
@@ -30031,9 +30163,6 @@ msgstr "Пауза"
 msgid "Pauses the walk."
 msgstr "Приостановить прогулку"
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Поменять расположение кнопок при показе изображений."
-
 msgid "Display hour when the picture was taken"
 msgstr "Показывать время, когда был сделан снимок"
 
@@ -30133,12 +30262,21 @@ msgstr "Скачивание снимков Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Всего снимков Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Передача пакета правок Mapillary"
+
 msgid "No images found"
 msgstr "Изображения не найдены"
 
 msgid "Finished upload"
 msgstr "Отправка завершена"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr "Не выполнен вход, войдите в Mapillary в Настройках"
+
+msgid "Not Logged in to Mapillary"
+msgstr "Не выполнен вход в Mapillary"
+
 msgid "Uploading: {0}"
 msgstr "Отправка: {0}"
 
@@ -31580,37 +31718,93 @@ msgstr "Модуль Proj4J"
 msgid "Code"
 msgstr "Код"
 
-msgid "Gaps"
-msgstr "Разрывы"
+msgid "Add stop position"
+msgstr "Добавить позицию остановки"
+
+msgid "Do you want to download referrers of platforms and stop positions?"
+msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
-msgstr "Проверяет наличие разрывов в отношениях маршрутов."
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Запомнить мой выбор и больше не спрашивать в этом сеансе"
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
-msgstr "ОТ: Маршрут содержит разрыв, который может быть устранён сортировкой"
+msgid "PT_Assistant Fetch Request"
+msgstr "Запрос загрузки PT_Assistant"
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Отношения маршрутов имеют неполных участников.\n"
+"Они должны быть загружены, чтобы продолжить проверку.\n"
+"Вы хотите загрузить их?"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
+"Модуль PT_Assistant обнаружил, что в этом отношении (id={0}) есть ошибки:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} ошибка направления"
+msgstr[1] "{0} ошибки направления"
+msgstr[2] "{0} ошибок направления"
 
-msgid "Fix gaps in public transport route"
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} ошибка типа дороги"
+msgstr[1] "{0} ошибки типа дороги"
+msgstr[2] "{0} ошибок типа дороги"
+
+msgid "How do you want to proceed?"
+msgstr "Что вы выберете для продолжения?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "Запрос следующего действия PT_Assistant"
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
-msgstr "Платформы в начале"
+msgid "PT: Platform should not be part of a way"
+msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
-"Проверять, что платформы расположены перед линиями в отношениях маршрутов."
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
-"ОТ: Отношение(я) маршрута(ов)  содержит линию(и), расположеннную(ые)  перед "
-"платформой(ами) в списке участников"
+"Проверяет совместимость отношений маршрутов со 2-й версией маршрутов "
+"общественного транспорта"
+
+msgid "Fix error"
+msgstr "Исправить ошибку"
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "ОТ: Маршрут содержит разрыв, который может быть устранён сортировкой"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "ОТ: Роли участника отношения не соответствуют тегам"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "ОТ: Маршрут должен начинаться и заканчиваться stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "ОТ:  Первую или последнюю линию требуется разделить"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+"ОТ: Тип маршрута не соответствует типу дороги, по которой он проходит"
+
+msgid "PT: Road is under construction"
+msgstr "ОТ: Строящаяся дорога"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr ""
+"ОТ: Маршрут проходит по дороге с односторонним движением в обратном "
+"направлении"
 
 msgid "Can''t parse a time from this string."
 msgstr "Невозможно разобрать время из этой последовательности."
@@ -32015,6 +32209,12 @@ msgstr "Починить роли участников выбранного от
 msgid "Complete multipolygon for way {0}"
 msgstr "Замкнуть мультиполигон для линии {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Две окружности одинаковы, этого не должно быть."
+
+msgid "Multipolygon from rings"
+msgstr "Мультиполигон из окружностей"
+
 msgid "Node without ''house'' role found"
 msgstr "Найдена точка без роли ''house''"
 
@@ -33847,12 +34047,6 @@ msgstr "Удалить участника из ограничения на по
 msgid "Change to the Basic Editor and select a way"
 msgstr "Перейти к Основному редактору и выделить линию"
 
-msgid "Undelete object..."
-msgstr "Восстановить объект..."
-
-msgid "Undelete object by id"
-msgstr "Восстановить объект по id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Не удалось восстановить точку {0}. Объект, вероятно, был отредактирован"
@@ -33865,6 +34059,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Не удалось восстановить отношение {0}. Объект, вероятно, был отредактирован"
 
+msgid "Undelete object..."
+msgstr "Восстановить объект..."
+
+msgid "Undelete object by id"
+msgstr "Восстановить объект по id"
+
 msgid "Undelete Object"
 msgstr "Восстановить объект"
 
@@ -33938,10 +34138,10 @@ msgstr ""
 "буфере обмена"
 
 msgid "Split Object"
-msgstr "Разрезать объекты"
+msgstr "Разрезать объект"
 
 msgid "Split an object at the selected nodes."
-msgstr "Разрезать объекты в выделенных точках."
+msgstr "Разрезать объект в выделенных точках."
 
 msgid "The current selection cannot be used for splitting."
 msgstr "Текущее выделение невозможно разделить."
@@ -34605,6 +34805,12 @@ msgstr[0] "Перезаписать тег ''{0}''  {1} из {2} новым зн
 msgstr[1] "Перезаписать теги ''{0}''  {1} из {2} новым значением ''{3}''?"
 msgstr[2] "Перезаписать теги ''{0}''  {1} из {2} новым значением ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Добавить названия из Википедии"
 
@@ -34642,11 +34848,15 @@ msgstr "Доступно в локальном наборе данных"
 msgid "Not linked yet"
 msgstr "Ссылка ещё не создана"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr "{0}: {1}"
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr "Викиданные"
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
+"Получение из Викиданных всех координат для видимой в окне области карты"
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/sk.po b/i18n/po/sk.po
index 06b1fde..7e0a3d9 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: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-06-05 15:19+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-11 22:33+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: 2016-06-06 04:32+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:03+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: sk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2846,15 +2846,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objekty (a všetky ich body ciest / členovia relácií) v stiahnutej oblasti"
 
-msgid "Searching"
-msgstr "Vyhľadávanie"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Hľadá sa v {0} objektoch"
-msgstr[1] "Hľadá sa v {0} objekte"
-msgstr[2] "Hľadá sa v {0} objektoch"
-
 msgid "No match found for ''{0}''"
 msgstr "Neboli nájdené záznamy pre \"{0}\""
 
@@ -2870,6 +2861,15 @@ msgstr "Nič sa nenašlo vo výbere vyhľadávania pre \"{0}\""
 msgid "Found {0} matches"
 msgstr "Nájdených {0} zodpovedajúcich objektov"
 
+msgid "Searching"
+msgstr "Vyhľadávanie"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Hľadá sa v {0} objektoch"
+msgstr[1] "Hľadá sa v {0} objekte"
+msgstr[2] "Hľadá sa v {0} objektoch"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4278,9 +4278,6 @@ msgstr "Značky pre Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Kontroluje chyby v značkách súvisiacich s Internetom."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL sa nedá prekonvertovať do ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "\"{0}\": {1}"
 
@@ -9893,8 +9890,8 @@ msgstr "Zväčšiť pri načítaní dlaždíc"
 msgid "zoom in to load more tiles"
 msgstr "Zväčšiť pri načítaní viacerýchdlaždíc"
 
-msgid "increase zoom level to see more detail"
-msgstr "zvýšiť úroveň zväčšenia pre viditeľnosť viacej detailov"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr "zvýšiť priblíženie dlaždíc (zmeniť rozlíšenie) pre viac detailov"
 
 msgid "No tiles at this zoom level"
 msgstr "Žiadne dlaždice na tejto úrovni priblíženia"
@@ -16220,6 +16217,9 @@ msgstr "Strava cyklistická heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava bežecká heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Prekryvná vrstva Locator"
 
@@ -16460,8 +16460,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr "BD Orto"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
@@ -17471,6 +17471,9 @@ msgstr ""
 "Porozprávajte sa s používateľmi, ktorí upravujú mapu vo Vašej blízkosti a "
 "buďte informovaní keď sa niekto priblíži."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Umožňuje zobraziť súbor GeoJSON ako vrstvu."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -19348,18 +19351,33 @@ msgstr "Typ cesty (viditeľnosť)"
 msgid "grade1"
 msgstr "kvalita1 (najlepšia)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Pevný: spevnený alebo zhutnený tvrdý povrch"
+
 msgid "grade2"
 msgstr "kvalita2 (dobrá)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "Zväčša pevný: štrk/kamene s trochou mäkšieho materiálu"
+
 msgid "grade3"
 msgstr "kvalita3 (priemerná)"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Zmes tvrdých a mäkších materiálov"
+
 msgid "grade4"
 msgstr "kvalita4 (horšia)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "Zväčša mäkký: pôda/piesok/tráva s primiešaným tvrdým materiálom"
+
 msgid "grade5"
 msgstr "kvalita5 (najhoršia)"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Mäkký: pôda/piesok/tráva"
+
 msgid "MTB Scale"
 msgstr "MTB Rozsah"
 
@@ -20570,6 +20588,72 @@ msgstr "Napätie"
 msgid "Amperage"
 msgstr "Prúd (A)"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Typy vozidiel, ktoré je možné nabíjať:"
+
+msgid "Scooter"
+msgstr "Skúter"
+
+msgid "Truck"
+msgstr "Nákladné auto"
+
+msgid "Number of Sockets:"
+msgstr "Počet zásuviek:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Typ 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Typ 1 Kombinovaný"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Typ 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Typ 2 Kombinovaný"
+
+msgid "Type 3 (SCAME)"
+msgstr "Typ 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supernabíjačka"
+
+msgid "Schuko"
+msgstr "Schuko (Európska zásuvka)"
+
+msgid "CEE blue"
+msgstr "CEE modrá"
+
+msgid "CEE red 16A"
+msgstr "CEE červená 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE červená 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Overenie totožnosti:"
+
+msgid "Phone call"
+msgstr "Telefónnym hovorom"
+
+msgid "Short message"
+msgstr "SMS"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Členská karta"
+
 msgid "Wash"
 msgstr "Umývačka"
 
@@ -20774,9 +20858,6 @@ msgstr "Električková zastávka (zastaralé)"
 msgid "Train"
 msgstr "Vlak"
 
-msgid "Railway station (legacy)"
-msgstr "Železničná stanica (zastaralé)"
-
 msgid "Railway halt (legacy)"
 msgstr "Železničná zastávka (zastaralé)"
 
@@ -20801,15 +20882,6 @@ msgstr "Prístrešok"
 msgid "Waste Basket/Trash Can"
 msgstr "Odpadkový kôš"
 
-msgid "Highway platform (legacy)"
-msgstr "Cestné nástupište (zastaralé)"
-
-msgid "Railway platform (legacy)"
-msgstr "Železničné nástupište (zastaralé)"
-
-msgid "funicular"
-msgstr "lanovka"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Stanica"
@@ -24600,9 +24672,6 @@ msgstr "Strom"
 msgid "A single tree."
 msgstr "Jeden strom."
 
-msgid "Botanical Name"
-msgstr "Botanický názov"
-
 msgid "Tree Row"
 msgstr "Stromoradie"
 
@@ -25655,6 +25724,27 @@ msgstr "{0} a {1} spolu s {2} a odporujúce si hodnoty"
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Podozrivá kombinácia značiek: {0} a {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} na relácii bez {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Dlhá vodná cesta s \"{0}\", ale bez značky, ktorá by ju označovala za tunel "
+"alebo podzemný tok. Odstráňte \"{1}\" alebo pridajte ''tunel'' podľa "
+"potreby. Tiež skontrolujte križujúce mosty a ich značky \"{1}\"."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Krátka vodná cesta s \"{0}\", ale bez značky, ktorá by ju označovala za "
+"tunel alebo podzemný tok. Odstráňte \"{1}\" alebo pridajte ''tunel'' podľa "
+"potreby. Tiež skontrolujte križujúce mosty a ich značky \"{1}\"."
+
 msgid "{0} is deprecated"
 msgstr "{0} je zastaralý"
 
@@ -25822,6 +25912,9 @@ msgid ""
 msgstr ""
 "Vodný tok bez pripojenia na iný vodný tok alebo je nesprávny smer toku."
 
+msgid "Coastline inside {1}"
+msgstr "Pobrežie vovnútri \"{1}\""
+
 msgid "abbreviated street name"
 msgstr "skrátený názov ulice"
 
@@ -26218,6 +26311,9 @@ msgstr "Zobrazí vrstvu s výškovým profilom"
 msgid "Elevation Grid"
 msgstr "Výškový profil"
 
+msgid "increase zoom level to see more detail"
+msgstr "zvýšiť úroveň zväčšenia pre viditeľnosť viacej detailov"
+
 msgid "No SRTM data"
 msgstr "Žiadne dáta SRTM"
 
@@ -28157,15 +28253,15 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
+msgid "EditGpx"
+msgstr "UpraviťGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Vrstva na úoravu GPX stôp(tracks)"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Konvertovať do GPX vrstvy s neznámym časom"
 
-msgid "EditGpx"
-msgstr "UpraviťGpx"
-
 msgid "edit gpx tracks"
 msgstr "upraviť gpx stopy(tracks)"
 
@@ -28182,7 +28278,7 @@ msgid "External tool error"
 msgstr ""
 
 msgid "Error executing the script:"
-msgstr ""
+msgstr "Chyba pri vykonávaní skriptu:"
 
 msgid ""
 "Child script have returned invalid data.\n"
@@ -28286,6 +28382,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Iba poloha"
 
@@ -29005,9 +29113,6 @@ msgstr "Zobraziť fotky bez informácií o polohe"
 msgid "Imported Images"
 msgstr "Importované obrázky"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Obrázky (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importovať vektorovú grafiku"
 
@@ -29551,6 +29656,15 @@ msgstr "Spojiť/oddeliť obrázky"
 msgid "Join Mapillary pictures"
 msgstr "Spojiť obrázky Mapillary"
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr "Odoslať obrázky"
 
@@ -29590,6 +29704,18 @@ msgstr "Kopírovať značku"
 msgid "Edit on website"
 msgstr "Upraviť na webstránke"
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr "Exportovať všetky obrázky"
 
@@ -29728,9 +29854,6 @@ msgstr "Pozastaviť"
 msgid "Pauses the walk."
 msgstr "Pozastaví chôdzu."
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Otočiť pozície tlačidiel pri zobrazení obrázkov."
-
 msgid "Display hour when the picture was taken"
 msgstr "Zobraziť hodinu kedy bol obrázok zaznamenaný"
 
@@ -29828,12 +29951,21 @@ msgstr "Sťahujú sa obrázky Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Spolu obrázkov Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr "Nenašli sa žiadne obrázky"
 
 msgid "Finished upload"
 msgstr "Odoslanie ukončené"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr "Odosiela sa: {0}"
 
@@ -31198,34 +31330,83 @@ msgstr "Plugin Proj4J"
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr "PT: Miesto zastavenia vozidla nie je súčasťou cesty"
+
+msgid "PT: Platform should not be part of a way"
+msgstr "PT: Nástupište by nemalo byť súčasťou cesty"
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr "PT: testovacie varovanie"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
 msgstr ""
+"PT: Trasa obsahuje medzeru, ktorú je možné upraviť usporiadaním členov"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "PT: Role členov relácie nesúhlasia so značkami"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "PT: Trasa by mala začínať a končiť so \"stop_position\""
+
+msgid "PT: First or last way needs to be split"
+msgstr "PT: Prvý alebo posledný úsek by asi mal byť rozdelený"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr "PT: Typ trasy nesúhlasí s typom cesty, po ktorej prechádza"
+
+msgid "PT: Road is under construction"
+msgstr "PT: Cesta je vo výstavbe"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr "PT: Trasa prechádza jednosmernou cestou nesprávnym smerom"
 
 msgid "Can''t parse a time from this string."
 msgstr ""
@@ -31624,6 +31805,12 @@ msgstr "Opraviť úlohy vybratých členov relácie"
 msgid "Complete multipolygon for way {0}"
 msgstr "Dokončiť multipolygón pre cestu {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Nájdený bod bez role \"house\" (dom)"
 
@@ -33388,12 +33575,6 @@ msgstr "Vymazať člena zo zákazu odbočenia"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Prejsť na základný editor a vybrať cestu"
 
-msgid "Undelete object..."
-msgstr "Obnoviť objekt..."
-
-msgid "Undelete object by id"
-msgstr "Obnoviť objekt s id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr "Nepodarilo sa zmazať bod {0}. Objekt bol asi revidovaný"
 
@@ -33403,6 +33584,12 @@ msgstr "Nepodarilo sa zmazať cestu {0}. Objekt bol asi revidovaný"
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr "Nepodarilo sa zmazať reláciu {0}. Objekt bol asi revidovaný"
 
+msgid "Undelete object..."
+msgstr "Obnoviť objekt..."
+
+msgid "Undelete object by id"
+msgstr "Obnoviť objekt s id"
+
 msgid "Undelete Object"
 msgstr "Obnoviť Objekt"
 
@@ -34117,6 +34304,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Pridať názvy z Wikipedie"
 
@@ -34152,11 +34345,14 @@ msgstr "Dostupné v lokálnej dátovej sade"
 msgid "Not linked yet"
 msgstr "Zatiaľ neprepojené"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Získa všetky súradnice z Wikipedie v aktuálnom zobrazení"
diff --git a/i18n/po/sl.po b/i18n/po/sl.po
index 3e232bd..a66f4b0 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:01+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:03+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: sl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2630,14 +2630,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2653,6 +2645,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Najdeno {0} zadetkov"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3930,9 +3930,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9040,7 +9037,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14618,6 +14615,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14858,7 +14858,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15836,6 +15836,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17619,18 +17622,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18820,6 +18838,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -19024,9 +19108,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19051,15 +19132,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22846,9 +22918,6 @@ msgstr "Drevo"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23885,6 +23954,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24037,6 +24121,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24409,6 +24496,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26276,13 +26366,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26404,6 +26494,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27100,9 +27202,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27636,6 +27735,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27675,6 +27783,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27813,9 +27933,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27907,12 +28024,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29269,33 +29395,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29695,6 +29869,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31356,19 +31536,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32026,6 +32206,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32058,11 +32244,14 @@ msgstr "Na voljo v lokalnih podatkih"
 msgid "Not linked yet"
 msgstr "Še ni povezan"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Iz Wikipedije poišči vse koordinate v trenutnem pogledu"
diff --git a/i18n/po/sq.po b/i18n/po/sq.po
index d071170..518bacd 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:31+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 04:31+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/sr.po b/i18n/po/sr.po
index 3fc1184..6ce0b11 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 04:59+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:02+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: sr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2617,14 +2617,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2640,6 +2632,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3907,9 +3907,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8996,7 +8993,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14556,6 +14553,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14796,7 +14796,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15774,6 +15774,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17557,18 +17560,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18758,6 +18776,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18962,9 +19046,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18989,15 +19070,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22784,9 +22856,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23823,6 +23892,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23975,6 +24059,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24347,6 +24434,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26214,13 +26304,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26342,6 +26432,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27038,9 +27140,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27572,6 +27671,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27611,6 +27719,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27749,9 +27869,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27843,12 +27960,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29205,33 +29331,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29631,6 +29805,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31292,19 +31472,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31960,6 +32140,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31992,10 +32178,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/sv.po b/i18n/po/sv.po
index 0b745d3..e3cfbc3 100644
--- a/i18n/po/sv.po
+++ b/i18n/po/sv.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-02-08 15:05+0000\n"
-"Last-Translator: Andreas Vilén <andreas.vilen at gmail.com>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-13 18:17+0000\n"
+"Last-Translator: Niklas Henriksson <fringillus92 at gmail.com>\n"
 "Language-Team: Swedish <sv 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: 2016-06-05 05:02+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:04+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: sv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -98,7 +98,7 @@ msgid "Updating user interface"
 msgstr "Uppdaterar användargränssnittet"
 
 msgid "Failed to save default preferences."
-msgstr ""
+msgstr "Kunde inte spara standardinställningarna."
 
 msgid "Ignoring malformed URL: \"{0}\""
 msgstr "Hoppar över felaktig URL: \"{0}\""
@@ -1920,13 +1920,13 @@ msgid "Download changesets"
 msgstr "Hämta ändringsuppsättningar"
 
 msgid "Querying and downloading changesets"
-msgstr ""
+msgstr "Söker och laddar ner ändringsuppsättningar"
 
 msgid "Determine user id for current user..."
-msgstr ""
+msgstr "Fastställer användar-ID:t för nuvarande användare…"
 
 msgid "Query and download changesets ..."
-msgstr ""
+msgstr "Sök och ladda ner ändringsuppsättningar"
 
 msgid "Errors during download"
 msgstr "Fel under hämtning"
@@ -2444,6 +2444,8 @@ msgid ""
 "{0}Add selection to relation{1}: Verify every single relation to avoid "
 "damage!"
 msgstr ""
+"{0}Lägg till sektion till relation{1}: Kontrollera varje relation för att "
+"undvika skada!"
 
 msgid "Add selection to {0} relation"
 msgid_plural "Add selection to {0} relations"
@@ -2811,14 +2813,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "objekt (och alla dess vägnoder /relationsmedlemmar) i nedladdat område"
 
-msgid "Searching"
-msgstr "Söker"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Söker i {0} objekt"
-msgstr[1] "Söker i {0} objekt"
-
 msgid "No match found for ''{0}''"
 msgstr "Inga sökträffar för ''{0}''"
 
@@ -2834,6 +2828,14 @@ msgstr "Inget funnet i markeringen vid sökande efter \"{0}\""
 msgid "Found {0} matches"
 msgstr "{0} sökträffar"
 
+msgid "Searching"
+msgstr "Söker"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Söker i {0} objekt"
+msgstr[1] "Söker i {0} objekt"
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -2875,7 +2877,7 @@ msgstr ""
 "{1}"
 
 msgid "Cannot parse timestamp ''{0}''"
-msgstr ""
+msgstr "Kunde inte tolka tidsstämpel \"{0}\""
 
 msgid "Expecting {0} after {1}"
 msgstr "Förväntar {0} efter {1}"
@@ -3443,22 +3445,28 @@ msgid ""
 "<html>Failed to initialize preferences.<br>Failed to reset preference file "
 "to default: {0}</html>"
 msgstr ""
+"<html>Kunde inte ladda in inställningarna.<br>Kunde inte sätta "
+"inställningsfilen till standardinställningarna: {0}</html>"
 
 msgid ""
 "<html>Preferences file had errors.<br> Making backup of old one to "
 "<br>{0}<br> and creating a new default preference file.</html>"
 msgstr ""
+"<html>Inställningsfilen har fel.<br>Gör en backup av en gammal "
+"till<br>{0}<br> och skapa en ny standardinställningsfil.</html>"
 
 msgid ""
 "Failed to initialize preferences. Failed to reset preference file to "
 "default: {0}"
 msgstr ""
+"Kunde inte läsa in inställningarna. Kunde inte återställa inställningsfilen "
+"till standardinställningarna: {0}"
 
 msgid "Failed to load defaults cache file: {0}"
-msgstr ""
+msgstr "Kunde inte hämta standardcachefilen: {0}"
 
 msgid "Failed to delete faulty defaults cache file: {0}"
-msgstr ""
+msgstr "Kunde inte radera felaktiga standardcachefiler: {0}"
 
 msgid "Paint style {0}: {1}"
 msgstr "Ritstil{0}: {1}"
@@ -3467,15 +3475,17 @@ msgid "Layer: {0}"
 msgstr "Lager: {0}"
 
 msgid "Failed to persist preferences to ''{0}''"
-msgstr ""
+msgstr "Kunde inte avsluta inställningarna till \"{0}\""
 
 msgid ""
 "Try enabling IPv6 network, prefering IPv6 over IPv4 (only works on early "
 "startup)."
 msgstr ""
+"Försök aktivera IPv6-nätverk, som föredrar IPv6 över IPv4 (fungerar bara vid "
+"tidig uppstart)."
 
 msgid "Preference setting {0} has been removed since it is no longer used."
-msgstr ""
+msgstr "Inställningen {0} har raderats då den inte används längre."
 
 msgid "Metric"
 msgstr "Metriskt (SI)"
@@ -3502,7 +3512,7 @@ msgid "The revision file ''/REVISION'' is missing."
 msgstr "Revisionsfilen \"/REVISION\" saknas."
 
 msgid "Already registered a conflict for primitive ''{0}''."
-msgstr ""
+msgstr "Redan registrerat en konflikt för primitiv \"{0}\"."
 
 msgid "Decimal Degrees"
 msgstr "Decimalgrader"
@@ -3533,7 +3543,7 @@ msgid "E"
 msgstr "Ö"
 
 msgid "Update default entries"
-msgstr ""
+msgstr "Uppdatera standardposterna"
 
 msgid "Projection ''{0}'' is not found, bookmark ''{1}'' is not usable"
 msgstr ""
@@ -3576,11 +3586,14 @@ msgstr "Inget lager valt"
 msgid ""
 "WMTS Parser error - start element {0} has different name than end element {2}"
 msgstr ""
+"WMTS Parser fel - startelementer {0} har ett annat namn än slutelementet {2}"
 
 msgid ""
 "Only square tiles are supported. {0}x{1} returned by server for TileMatrix "
 "identifier {2}"
 msgstr ""
+"Endast fyrkantiga rutor stöds. {0}x{1} skickades tillbaka från serven för "
+"TileMatrix identifier {2}"
 
 msgid "Note"
 msgstr "Anteckning"
@@ -4176,9 +4189,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9395,8 +9405,8 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
-msgstr "öka zoom-nivån för att se mer detaljer"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr ""
@@ -15155,6 +15165,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -15395,7 +15408,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16375,6 +16388,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18172,18 +18188,33 @@ msgstr "Spårtyp"
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB-skala"
 
@@ -18343,7 +18374,7 @@ msgstr "Gångbana"
 
 msgctxt "footway"
 msgid "sidewalk"
-msgstr ""
+msgstr "trottoar"
 
 msgctxt "footway"
 msgid "crossing"
@@ -19381,6 +19412,72 @@ msgstr "Spänning"
 msgid "Amperage"
 msgstr "Ampere"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Biltvätt"
 
@@ -19585,9 +19682,6 @@ msgstr "Spårvägshållplats (föråldrad tagg)"
 msgid "Train"
 msgstr "Tåg"
 
-msgid "Railway station (legacy)"
-msgstr "Järnvägsstation (föråldrad tagg)"
-
 msgid "Railway halt (legacy)"
 msgstr "Järnvägshållplats (föråldrad tagg)"
 
@@ -19612,15 +19706,6 @@ msgstr "Vindskydd"
 msgid "Waste Basket/Trash Can"
 msgstr "Papperskorg"
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr "bergbana"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Järnvägsstation"
@@ -23409,9 +23494,6 @@ msgstr "Träd"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Botaniskt namn"
-
 msgid "Tree Row"
 msgstr "Allé"
 
@@ -24455,6 +24537,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24607,6 +24704,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "förkortat gatunamn"
 
@@ -24981,6 +25081,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "öka zoom-nivån för att se mer detaljer"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26859,15 +26962,15 @@ msgstr "mellan {0} {1} och {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  lägger till {0} {1}"
 
+msgid "EditGpx"
+msgstr "RedigeraGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Lager för redigering av GPX-spår"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Konvertera till GPX-lager med anonymiserad tid"
 
-msgid "EditGpx"
-msgstr "RedigeraGpx"
-
 msgid "edit gpx tracks"
 msgstr "redigera GPX-spår"
 
@@ -26987,6 +27090,18 @@ msgstr "Rensa logg"
 msgid "Show users on map"
 msgstr "Visa användare på karta"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Enbart position"
 
@@ -27690,9 +27805,6 @@ msgstr "Visa bilder utan geotaggning"
 msgid "Imported Images"
 msgstr "Importerade bilder"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Bildfiler (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Importera vektorgrafik"
 
@@ -28236,6 +28348,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -28275,6 +28396,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -28413,9 +28546,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28507,12 +28637,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29879,33 +30018,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -30305,6 +30492,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31969,19 +32162,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32530,13 +32723,13 @@ msgid "Unable to find native libvlc library!"
 msgstr ""
 
 msgid "play"
-msgstr ""
+msgstr "spela upp"
 
 msgid "loop"
-msgstr ""
+msgstr "upprepa"
 
 msgid "mute"
-msgstr ""
+msgstr "ljud av"
 
 msgid "Walking Papers Scanned Map"
 msgstr ""
@@ -32618,32 +32811,38 @@ msgstr ""
 "Sök efter en waypoint. Klicka och sök på kartan för att se waypointen."
 
 msgid "Fetch Wikidata IDs"
-msgstr ""
+msgstr "Hämta Wikidata-ID:n"
 
 msgid "Fetch Wikidata IDs using the ''wikipedia'' tag"
-msgstr ""
+msgstr "Hämta Wikidata-ID:n med hjälp av \"wikipedia\"-taggen."
 
 msgid "Fetching Wikidata IDs"
-msgstr ""
+msgstr "Hämtar Wikidata-ID:n"
 
 msgid "Add Wikidata"
-msgstr ""
+msgstr "Lägg till Wikidata"
 
 msgid "No Wikidata ID found for: {0}"
-msgstr ""
+msgstr "Inget Wikidata-ID hittades för: {0}"
 
 msgid "Fetching {0} Wikidata ID for language ''{1}''"
 msgid_plural "Fetching {0} Wikidata IDs for language ''{1}''"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Hämtar {0} Wikidata-ID för språket ''{1}''"
+msgstr[1] "Hämtar {0} Wikidata-ID:n för språket ''{1}''"
 
 msgid "Add Wikidata for language ''{0}''"
-msgstr ""
+msgstr "Lägg till Wikidata för språket \"{0}\""
 
 msgid "Overwrite ''{0}'' tag {1} from {2} with new value ''{3}''?"
 msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Skriv över''{0}'' tagg {1} från {2} med nya värdet ''{3}''?"
+msgstr[1] "Skriv över''{0}'' taggar {1} från {2} med nya värdet ''{3}''?"
+
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
 
 msgid "Add names from Wikipedia"
 msgstr "Lägg till namn från Wikipedia"
@@ -32680,11 +32879,14 @@ msgstr "Tillgänglig i det lokala datasetet"
 msgid "Not linked yet"
 msgstr "Ej länkad ännu"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Hämtar alla koordinater från Wikipedia i aktuell vy"
diff --git a/i18n/po/ta.po b/i18n/po/ta.po
index ec40e38..1e86d50 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:03+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:05+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "X-Poedit-Country: INDIA\n"
 "Language: ta\n"
 "X-Poedit-Language: Tamil\n"
@@ -2652,14 +2652,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2675,6 +2667,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -3942,9 +3942,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9031,7 +9028,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14593,6 +14590,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14833,7 +14833,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15811,6 +15811,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17594,18 +17597,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18795,6 +18813,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18999,9 +19083,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19026,15 +19107,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22821,9 +22893,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23860,6 +23929,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24012,6 +24096,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24384,6 +24471,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26251,13 +26341,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26379,6 +26469,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27075,9 +27177,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27609,6 +27708,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27648,6 +27756,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27786,9 +27906,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27880,12 +27997,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29248,33 +29374,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29674,6 +29848,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31335,19 +31515,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -32003,6 +32183,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32035,10 +32221,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/te.po b/i18n/po/te.po
index c011480..0febfd5 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:03+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:05+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: te\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/th.po b/i18n/po/th.po
index f7c11b8..52ef353 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:04+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:06+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: th\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/tr.po b/i18n/po/tr.po
index ef38efb..fd4e10f 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:04+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:06+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2666,14 +2666,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "''{0}'' için herhangi karşılık bulunamadı"
 
@@ -2689,6 +2681,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "{0} Eşleşme bulundu"
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3962,9 +3962,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -9060,7 +9057,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14659,6 +14656,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14899,7 +14899,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15877,6 +15877,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17660,18 +17663,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18861,6 +18879,72 @@ msgstr "Voltaj"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Yıkama"
 
@@ -19065,9 +19149,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19092,15 +19173,6 @@ msgstr "Sığınak"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22887,9 +22959,6 @@ msgstr "Ağaç"
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr "Botannik İsim"
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23926,6 +23995,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -24078,6 +24162,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24450,6 +24537,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26317,13 +26407,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26445,6 +26535,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Pozisyon Sadece"
 
@@ -27143,9 +27245,6 @@ msgstr "Gotag yapılmamış görüntüleri göster"
 msgid "Imported Images"
 msgstr "İçeri alınan görüntüler"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Görüntü Dosyaları (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27687,6 +27786,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27726,6 +27834,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27864,9 +27984,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27958,12 +28075,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29322,33 +29448,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29748,6 +29922,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31407,12 +31587,6 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
-msgstr "Nesne silme işlemi geri al..."
-
-msgid "Undelete object by id"
-msgstr "ID’ye göre nesne silme işlemi geri al..."
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -31422,6 +31596,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "Nesne silme işlemi geri al..."
+
+msgid "Undelete object by id"
+msgstr "ID’ye göre nesne silme işlemi geri al..."
+
 msgid "Undelete Object"
 msgstr "Nesne Silme İşlemi Geri Al..."
 
@@ -32075,6 +32255,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -32107,11 +32293,14 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr ""
diff --git a/i18n/po/ug.po b/i18n/po/ug.po
index 259727a..4b6f9af 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:05+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:07+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/uk.po b/i18n/po/uk.po
index 12b3aa3..33ddaba 100644
--- a/i18n/po/uk.po
+++ b/i18n/po/uk.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-05-31 12:48+0000\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-07-06 11:54+0000\n"
 "Last-Translator: andygol <Unknown>\n"
 "Language-Team: Ukrainian <uk at li.org>\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: 2016-06-05 05:05+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:07+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: uk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2879,15 +2879,6 @@ msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 "об’єкти (та всі їхні лінії, точки/члени зв’язків) у завантаженій ділянці"
 
-msgid "Searching"
-msgstr "Пошук"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "Пошук серед {0} об’єкта"
-msgstr[1] "Пошук серед {0} об’єктів"
-msgstr[2] "Пошук серед {0} об’єктів"
-
 msgid "No match found for ''{0}''"
 msgstr "Не знайдено збігів для ''{0}''"
 
@@ -2903,6 +2894,15 @@ msgstr "У виділеному нічого не знайдено під час
 msgid "Found {0} matches"
 msgstr "Знайдено {0} збігів"
 
+msgid "Searching"
+msgstr "Пошук"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "Пошук серед {0} об’єкта"
+msgstr[1] "Пошук серед {0} об’єктів"
+msgstr[2] "Пошук серед {0} об’єктів"
+
 msgctxt "search"
 msgid "CS"
 msgstr "з урахуванням регістру"
@@ -4309,9 +4309,6 @@ msgstr "Інтернет-теґи"
 msgid "Checks for errors in internet-related tags."
 msgstr "Перевірка на помилки теґів, пов’язаних з Інтернет."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " Неможливо перетворити URL в ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "''{0}'': {1}"
 
@@ -9949,8 +9946,10 @@ msgstr "наблизитись для завантаження будь-яких
 msgid "zoom in to load more tiles"
 msgstr "наблизитись для завантаження більшої кількості квадратів мапи"
 
-msgid "increase zoom level to see more detail"
-msgstr "збільшити масштаб, що побачити більше детелей"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
+"збільште масштаб квадратів (змініть роздільну здатність), щоб побачити "
+"більше деталей"
 
 msgid "No tiles at this zoom level"
 msgstr "На цьому рівні масштабування квадрати мапи відсутні"
@@ -16259,6 +16258,9 @@ msgstr "Strava теплова веломапа"
 msgid "Strava running heatmap"
 msgstr "Strava теплова мапа бігунів"
 
+msgid "Strava both heatmap"
+msgstr "Теплова мапа Strava (обидва види)"
+
 msgid "Locator Overlay"
 msgstr "Шар Locator"
 
@@ -16419,7 +16421,7 @@ msgid "TEC bus lines (2014)"
 msgstr "TEC автобусні маршрути (2014)"
 
 msgid "Benin:cotonou_pleiade_2016"
-msgstr ""
+msgstr "Бенін: Котону, Pleiade 2016"
 
 msgid "IBGE Mapa de Setores Urbanos"
 msgstr "IBGE Мапа міських районів"
@@ -16499,8 +16501,8 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
-msgid "BD Ortho"
-msgstr "BD Ortho"
+msgid "BDOrtho IGN"
+msgstr "BDOrtho IGN"
 
 msgid "Bordeaux - 2012"
 msgstr "Бордо - 2012"
@@ -17517,6 +17519,9 @@ msgstr ""
 "Спілкуйтесь із іншими учасниками, що працюють з мапою поруч з вами, "
 "отримуйте сповіщення, якщо хтось з’являється поруч."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr "Дозволяє переглядати GeoJSON файл як шар даних."
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17769,6 +17774,8 @@ msgid ""
 "Provides validation and fixing for public transport route according to "
 "version 2 of the public transport schema"
 msgstr ""
+"Забезпечує перевірку і виправлення маршрутів громадського транспорту "
+"відповідно до версії 2 схеми позначення маршрутів громадського транспорту"
 
 msgid ""
 "This plugin simplifies the mapping and editing of public transport routes."
@@ -17967,10 +17974,10 @@ msgid "concrete"
 msgstr "бетон"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "бетонні плити (суцільні)"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "бетонні плити (колія)"
 
 msgid "paving_stones"
 msgstr "дорожні камені"
@@ -19406,18 +19413,34 @@ msgstr "Дорожнє покриття"
 msgid "grade1"
 msgstr "тип 1 (з покриттям)"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "Тверде: є покриття або щільно втрамбована поверхня"
+
 msgid "grade2"
 msgstr "тип 2 (гравій, втрамбований ґрунт)"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+"Переважно тверде: гравій або каміння в суміші з іншим мʼяким матеріалом"
+
 msgid "grade3"
 msgstr "тип 3 (гравій з піском (не втрамбований))"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "Суміш твердих і мʼяких матеріалів"
+
 msgid "grade4"
 msgstr "тип 4 (ґрунт)"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "Переважно мʼяке: ґрунт/пісок/трава у суміші з іншим матеріалом"
+
 msgid "grade5"
 msgstr "тип 5 (пісок, трава)"
 
+msgid "Soft: soil/sand/grass"
+msgstr "Мʼяке: ґрунт/пісок/трава"
+
 msgid "MTB Scale"
 msgstr "Шкала для гірських велосипедів"
 
@@ -20625,6 +20648,72 @@ msgstr "Напруга"
 msgid "Amperage"
 msgstr "Сила струму"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "Типи траспортних засобів, які можна підзарядити"
+
+msgid "Scooter"
+msgstr "Скутер, самокат"
+
+msgid "Truck"
+msgstr "Вантажівка"
+
+msgid "Number of Sockets:"
+msgstr "Кількість розеток:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "Type 1 (Yazaki)"
+
+msgid "Type 1 Combo"
+msgstr "Type 1 Combo"
+
+msgid "Type 2 (Mennekes)"
+msgstr "Type 2 (Mennekes)"
+
+msgid "Type 2 Combo"
+msgstr "Type 2 Combo"
+
+msgid "Type 3 (SCAME)"
+msgstr "Type 3 (SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "Tesla Supercharger"
+
+msgid "Schuko"
+msgstr "Schuko"
+
+msgid "CEE blue"
+msgstr "CEE блакитна"
+
+msgid "CEE red 16A"
+msgstr "CEE червона 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE червона 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "Автентифікація:"
+
+msgid "Phone call"
+msgstr "Дзвінок по телефону"
+
+msgid "Short message"
+msgstr "СМС"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "Членська картка"
+
 msgid "Wash"
 msgstr "Мийка"
 
@@ -20829,9 +20918,6 @@ msgstr "Зупинка трамваю (застаріле)"
 msgid "Train"
 msgstr "Потяг"
 
-msgid "Railway station (legacy)"
-msgstr "Залізнична станція (застаріле)"
-
 msgid "Railway halt (legacy)"
 msgstr "Залізнична зупинка (застаріле)"
 
@@ -20856,15 +20942,6 @@ msgstr "Навіс"
 msgid "Waste Basket/Trash Can"
 msgstr "Урна для сміття"
 
-msgid "Highway platform (legacy)"
-msgstr "Зупинка на дорозі (застаріле)"
-
-msgid "Railway platform (legacy)"
-msgstr "Залізнична платформа (застаріле)"
-
-msgid "funicular"
-msgstr "фунікулер"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Станція"
@@ -24659,9 +24736,6 @@ msgstr "Дерево"
 msgid "A single tree."
 msgstr "Поодиноке дерево."
 
-msgid "Botanical Name"
-msgstr "Ботанічна назва"
-
 msgid "Tree Row"
 msgstr "Ряд дерев"
 
@@ -25717,6 +25791,27 @@ msgstr "{0} і {1} разом з {2} і значеннями, що спричи
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr "Підозріла комбінація тегів: {0} і {1}"
 
+msgid "{0} on a relation without {1}"
+msgstr "{0} на звʼязку без {1}"
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Довгий водний шлях з {0}, але без теґу, що визначає його, як тунель або "
+"таким, що є під землею. Вилучіть {1} або додайте теґ tunnel, якщо можливо. "
+"Також перевірте перетини з мостами та їх {1} теґи."
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+"Короткий водний шлях з {0}, але без теґу, що визначає його, як тунель або "
+"таким, що є під землею.  Вилучіть {1} або додайте теґ tunnel, якщо можливо. "
+"Також перевірте перетини з мостами та їх {1} теґи."
+
 msgid "{0} is deprecated"
 msgstr "{0} заборонено"
 
@@ -25893,6 +25988,9 @@ msgstr ""
 "Кінець водного шляху не зʼєднується з іншим водним шляхом, або його напрямок "
 "помилковий"
 
+msgid "Coastline inside {1}"
+msgstr "Берегова лінія в середині {1}"
+
 msgid "abbreviated street name"
 msgstr "скорочене позначення вулиці"
 
@@ -26291,6 +26389,9 @@ msgstr "Показує шар з сіткою висот"
 msgid "Elevation Grid"
 msgstr "Сітка висот"
 
+msgid "increase zoom level to see more detail"
+msgstr "збільшити масштаб, що побачити більше детелей"
+
 msgid "No SRTM data"
 msgstr "Без даних SRTM"
 
@@ -28383,15 +28484,15 @@ msgstr "між {0} {1} та {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  додаю {0} {1}"
 
+msgid "EditGpx"
+msgstr "Редагувати Gpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Шар для редагування GPX треків"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Перетворити на GPX шар зі знеособленим часом"
 
-msgid "EditGpx"
-msgstr "Редагувати Gpx"
-
 msgid "edit gpx tracks"
 msgstr "Редагувати gpx треки"
 
@@ -28515,6 +28616,18 @@ msgstr "Очистити журнал"
 msgid "Show users on map"
 msgstr "Показати учасників на мапі"
 
+msgid "GeoJSON file"
+msgstr "Файл GeoJSON"
+
+msgid "Loading json file..."
+msgstr "Завантаження json-файла…"
+
+msgid "Data Layer from GeoJSON: "
+msgstr "Шар даних GeoJSON: "
+
+msgid "Error loading geojson file {0}"
+msgstr "Помилка завантаження файлу GeoJSON {0}"
+
 msgid "Position only"
 msgstr "Тільки положення"
 
@@ -29258,9 +29371,6 @@ msgstr "Показати фотографії, що не мають коорди
 msgid "Imported Images"
 msgstr "Імпортовані зображення"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "Файли зображень (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "Імпорт векторної графіки"
 
@@ -29821,6 +29931,15 @@ msgstr "З’єднати/роз’єднати зображення"
 msgid "Join Mapillary pictures"
 msgstr "З’єднати зображення Mapillary"
 
+msgid "Submit changeset"
+msgstr "Надіслати набір змін"
+
+msgid "Submit the current changeset"
+msgstr "Надіслати поточний набір змін"
+
+msgid "Submit the current changeset to Mapillary"
+msgstr "Надіслати поточний набір змін до Mapillary"
+
 msgid "Upload pictures"
 msgstr "Завантажити знімки"
 
@@ -29860,6 +29979,18 @@ msgstr "Копіювати теґ"
 msgid "Edit on website"
 msgstr "Редагувати на сайті"
 
+msgid "Current Mapillary changeset"
+msgstr "Поточний набір змін Mapillary"
+
+msgid "Open Mapillary changeset dialog"
+msgstr "Відкрити діалог набору змін Mapillary"
+
+msgid "Mapillary changeset"
+msgstr "Набір змін Mapillary"
+
+msgid "Submit"
+msgstr "Надіслати"
+
 msgid "Export all images"
 msgstr "Експортувати всі знімки"
 
@@ -29998,9 +30129,6 @@ msgstr "Пауза"
 msgid "Pauses the walk."
 msgstr "Призупиняє перегляд"
 
-msgid "Reverse buttons position when displaying images."
-msgstr "Зворотнє положення кнопок під час показу знімків."
-
 msgid "Display hour when the picture was taken"
 msgstr "Показувати час, коли було зроблено знімок"
 
@@ -30100,12 +30228,21 @@ msgstr "Завантаження знімків Mapillary"
 msgid "Total Mapillary images: {0}"
 msgstr "Всього знімків Mapillary: {0}"
 
+msgid "Submitting Mapillary Changeset"
+msgstr "Надсилання набору змін Mapillary"
+
 msgid "No images found"
 msgstr "Знімків не знайдено"
 
 msgid "Finished upload"
 msgstr "Надсилання закінчене"
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr "Ви не увійшли, будь ласка, здійсніть вхід в налаштуваннях  Mapillary"
+
+msgid "Not Logged in to Mapillary"
+msgstr "Не увішли до Mapillary"
+
 msgid "Uploading: {0}"
 msgstr "Надсилання: {0}"
 
@@ -31547,34 +31684,91 @@ msgstr "Втулок Proj4J"
 msgid "Code"
 msgstr "Код"
 
-msgid "Gaps"
-msgstr ""
+msgid "Add stop position"
+msgstr "Додати місце зупинки"
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
-msgstr ""
+msgid "Remember my choice and do not ask me again in this session"
+msgstr "Запамʼятати мій вибір та не запитувати знов у цьому сеансі"
 
-msgid "PT: Route contains an overshoot"
-msgstr ""
+msgid "PT_Assistant Fetch Request"
+msgstr "ГТ_Помічник Надіслати запит"
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
+"Звʼязки маршрутів містять незавантажених членів.\n"
+"Їх треба завантажити, для того щоб виконати перевірку.\n"
+"Завантажити їх?"
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
+"ГТ_Помічник втулок визначив, що цей звʼязок (id={0}) містить помилки:"
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] "{0} помилка напрямку"
+msgstr[1] "{0} помилки напрямку"
+msgstr[2] "{0} помилок напрямку"
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] "{0} помилка типу дороги"
+msgstr[1] "{0} помилки типу дороги"
+msgstr[2] "{0} помилок типу дороги"
+
+msgid "How do you want to proceed?"
+msgstr "Як бажаєте продовжити?"
+
+msgid "PT_Assistant Proceed Request"
+msgstr "ГТ_Помічник Продовжити запит"
 
-msgid "Platforms first"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
+msgid "Public Transport Assistant tests"
+msgstr "Перевірки Помічника громадського транспорту"
+
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
 msgstr ""
+"Перевірити чи звʼязок сумісний зі схемою позначення громадського транспорту "
+"версії 2"
+
+msgid "Fix error"
+msgstr "Виправити помилку"
+
+msgid "PT: dummy test warning"
+msgstr "ГТ: фіктивне попередження"
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr "ГТ: Маршрут містить прогалини, що можна усунути впорядкуванням ліній"
+
+msgid "PT: Relation member roles do not match tags"
+msgstr "ГТ: Роль члена звʼязку не відповідає теґам"
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr "ГТ: Маршрут повинен починатись та закінчуватись stop_position"
+
+msgid "PT: First or last way needs to be split"
+msgstr "ГТ: Перший або останній відрізок треба розділити"
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr "ГТ: Тип маршруту не відповідає типу дороги, по якій він проходить"
+
+msgid "PT: Road is under construction"
+msgstr "ГТ: Ремонт дороги"
+
+msgid "PT: Route passes a oneway road in the wrong direction"
+msgstr ""
+"ГТ: Маршрут проходить по дорозі з одностороннім рухом в помилковому напрямку"
 
 msgid "Can''t parse a time from this string."
 msgstr "Неможливо визначити час із цього рядка."
@@ -31978,6 +32172,12 @@ msgstr "Виправити ролі членів вибраного зв’яз
 msgid "Complete multipolygon for way {0}"
 msgstr "Доповнити мультиполігон лінією {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr "Два кола однакові, такого не повинно бути."
+
+msgid "Multipolygon from rings"
+msgstr "Мультиполігон складається з кіл"
+
 msgid "Node without ''house'' role found"
 msgstr "Знайдено точку без ролі ''house''"
 
@@ -33811,12 +34011,6 @@ msgstr "Вилучити члена з обмеження повороту"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Перейдіть у Базовий редактор та виділіть лінію"
 
-msgid "Undelete object..."
-msgstr "Відновити об’єкт…"
-
-msgid "Undelete object by id"
-msgstr "Відновити об’єкт за ідентифікатором"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 "Неможливо відновити точку {0}. Можливо, об’єкт після цього був змінений"
@@ -33829,6 +34023,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Неможливо відновити зв’язок {0}. Можливо, об’єкт після цього був змінений"
 
+msgid "Undelete object..."
+msgstr "Відновити об’єкт…"
+
+msgid "Undelete object by id"
+msgstr "Відновити об’єкт за ідентифікатором"
+
 msgid "Undelete Object"
 msgstr "Відновити об’єкт"
 
@@ -34563,6 +34763,12 @@ msgstr[0] "Перезаписати ''{0}'' теґ {1} з {2} новим зна
 msgstr[1] "Перезаписати ''{0}'' теґи {1} з {2} новим значенням ''{3}''?"
 msgstr[2] "Перезаписати ''{0}'' теґів {1} з {2} новим значенням ''{3}''?"
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Додати назву з Вікіпедії"
 
@@ -34600,11 +34806,14 @@ msgstr "Доступно у локальному наборі даних"
 msgid "Not linked yet"
 msgstr "Ще не має прив’язок"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "Отримати всі координати з Вікіпедії для поточного виду"
diff --git a/i18n/po/ur.po b/i18n/po/ur.po
index aad0354..a7aee82 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:06+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:08+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: ur\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2616,14 +2616,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2639,6 +2631,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3906,9 +3906,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8994,7 +8991,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14554,6 +14551,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14794,7 +14794,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15772,6 +15772,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17555,18 +17558,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18756,6 +18774,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18960,9 +19044,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18987,15 +19068,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22782,9 +22854,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23821,6 +23890,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23973,6 +24057,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24345,6 +24432,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26212,13 +26302,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26340,6 +26430,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27036,9 +27138,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27570,6 +27669,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27609,6 +27717,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27747,9 +27867,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27841,12 +27958,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29203,33 +29329,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29629,6 +29803,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31290,19 +31470,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31958,6 +32138,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31990,10 +32176,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/vi.po b/i18n/po/vi.po
index 328f485..a061889 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:06+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:09+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: vi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2791,14 +2791,6 @@ msgstr ""
 "đối tượng (và tất cả các nút chiều / thành viên liên quan của nó) trong khu "
 "vực được tải về"
 
-msgid "Searching"
-msgstr "Tìm kiếm"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "Không có trận đấu tìm thấy cho '' {0} ''"
 
@@ -2815,6 +2807,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr "Tìm thấy {0} trận"
 
+msgid "Searching"
+msgstr "Tìm kiếm"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -4153,9 +4153,6 @@ msgstr "thẻ Internet"
 msgid "Checks for errors in internet-related tags."
 msgstr "Kiểm tra các lỗi trong các thẻ liên quan đến internet."
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL không thể được chuyển đổi sang ASCII: {0}"
-
 msgid "''{0}'': {1}"
 msgstr "'' {0} '': {1}"
 
@@ -9600,8 +9597,8 @@ msgstr "phóng to để tải bất kỳ gạch"
 msgid "zoom in to load more tiles"
 msgstr "phóng to để tải nhiều gạch"
 
-msgid "increase zoom level to see more detail"
-msgstr "mức tăng zoom để xem chi tiết hơn"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "Không có gạch ở mức thu phóng này"
@@ -15711,6 +15708,9 @@ msgstr "Strava đi xe đạp heatmap"
 msgid "Strava running heatmap"
 msgstr "Strava chạy heatmap"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "Locator Overlay"
 
@@ -15951,7 +15951,7 @@ msgstr "Bano"
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -16958,6 +16958,9 @@ msgstr ""
 "Nói chuyện với người sử dụng chỉnh sửa bản đồ gần đó, được thông báo khi có "
 "người đến gần."
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -18832,18 +18835,33 @@ msgstr "Tracktype"
 msgid "grade1"
 msgstr "grade1"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "grade2"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "grade3"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "grade4"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "grade5"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB Scale"
 
@@ -20051,6 +20069,72 @@ msgstr "Voltage"
 msgid "Amperage"
 msgstr "Cường độ dòng điện"
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "Rửa"
 
@@ -20255,9 +20339,6 @@ msgstr "Tram stop (di sản)"
 msgid "Train"
 msgstr "Train"
 
-msgid "Railway station (legacy)"
-msgstr "ga (di sản)"
-
 msgid "Railway halt (legacy)"
 msgstr "Đường sắt dừng (di sản)"
 
@@ -20282,15 +20363,6 @@ msgstr "Shelter"
 msgid "Waste Basket/Trash Can"
 msgstr "Chất thải Basket / Trash Can"
 
-msgid "Highway platform (legacy)"
-msgstr "lộ nền tảng (di sản)"
-
-msgid "Railway platform (legacy)"
-msgstr "Railway nền tảng (di sản)"
-
-msgid "funicular"
-msgstr "đường sắt leo núi"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "Station"
@@ -24086,9 +24158,6 @@ msgstr "Tree"
 msgid "A single tree."
 msgstr "Một cây duy nhất."
 
-msgid "Botanical Name"
-msgstr "Tên Botanical"
-
 msgid "Tree Row"
 msgstr "Tree Row"
 
@@ -25143,6 +25212,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} bị phản đối"
 
@@ -25307,6 +25391,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "tên đường tắt"
 
@@ -25700,6 +25787,9 @@ msgstr "Hiển lớp lưới độ cao"
 msgid "Elevation Grid"
 msgstr "Elevation Grid"
 
+msgid "increase zoom level to see more detail"
+msgstr "mức tăng zoom để xem chi tiết hơn"
+
 msgid "No SRTM data"
 msgstr "Không có dữ liệu SRTM"
 
@@ -27751,15 +27841,15 @@ msgstr "giữa {0} {1} và {2} {3}"
 msgid "  adding {0} {1}"
 msgstr "  thêm {0} {1}"
 
+msgid "EditGpx"
+msgstr "EditGpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "Layer để chỉnh sửa GPX theo dõi"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "Chuyển đổi sang lớp GPX với thời gian ẩn danh"
 
-msgid "EditGpx"
-msgstr "EditGpx"
-
 msgid "edit gpx tracks"
 msgstr "bài hát chỉnh sửa GPX"
 
@@ -27881,6 +27971,18 @@ msgstr "Xóa nhật ký"
 msgid "Show users on map"
 msgstr "Hiện người dùng trên bản đồ"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "Vị trí chỉ"
 
@@ -28630,9 +28732,6 @@ msgstr "Hiển thị hình ảnh không gắn thẻ địa lý"
 msgid "Imported Images"
 msgstr "hình ảnh nhập khẩu"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "các tập tin hình ảnh (* .jpg, * .jpeg, * .png, * .gif)"
-
 msgid "Import vector graphics"
 msgstr "đồ họa vector nhập khẩu"
 
@@ -29183,6 +29282,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -29222,6 +29330,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -29360,9 +29480,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -29454,12 +29571,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -30883,33 +31009,81 @@ msgstr "Proj4J Plugin"
 msgid "Code"
 msgstr "Code"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -31315,6 +31489,12 @@ msgstr "Fix vai trò của các thành viên liên quan lựa chọn"
 msgid "Complete multipolygon for way {0}"
 msgstr "Hoàn thành multipolygon cho cách {0}"
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr "Node không có '' nhà '' vai trò tìm thấy"
 
@@ -33114,12 +33294,6 @@ msgstr "Xóa thành viên khỏi những hạn chế biến"
 msgid "Change to the Basic Editor and select a way"
 msgstr "Thay đổi để các Basic Editor và chọn một cách"
 
-msgid "Undelete object..."
-msgstr "đối tượng Undelete ..."
-
-msgid "Undelete object by id"
-msgstr "đối tượng Undelete bởi id"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr "Không thể lấy lại nút {0}. Object đã có khả năng được redacted"
 
@@ -33130,6 +33304,12 @@ msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 "Không thể lấy lại các mối quan hệ {0}. Object đã có khả năng được redacted"
 
+msgid "Undelete object..."
+msgstr "đối tượng Undelete ..."
+
+msgid "Undelete object by id"
+msgstr "đối tượng Undelete bởi id"
+
 msgid "Undelete Object"
 msgstr "Object Undelete"
 
@@ -33855,6 +34035,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "Thêm tên từ Wikipedia"
 
@@ -33891,11 +34077,14 @@ msgstr "có sẵn trong tập dữ liệu địa phương"
 msgid "Not linked yet"
 msgstr "Không liên kết nào"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0} .Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0} .Wikipedia.org: {1}"
+msgid "Wikidata"
+msgstr ""
+
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "nạp tất cả các tọa độ từ Wikipedia trong quan điểm hiện tại"
diff --git a/i18n/po/wae.po b/i18n/po/wae.po
index 9b74fd9..fff9110 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\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: 2016-06-05 05:11+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:14+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -2615,14 +2615,6 @@ msgstr ""
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr ""
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr ""
 
@@ -2638,6 +2630,14 @@ msgstr ""
 msgid "Found {0} matches"
 msgstr ""
 
+msgid "Searching"
+msgstr ""
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr ""
@@ -3905,9 +3905,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8993,7 +8990,7 @@ msgstr ""
 msgid "zoom in to load more tiles"
 msgstr ""
 
-msgid "increase zoom level to see more detail"
+msgid "increase tiles zoom level (change resolution) to see more detail"
 msgstr ""
 
 msgid "No tiles at this zoom level"
@@ -14553,6 +14550,9 @@ msgstr ""
 msgid "Strava running heatmap"
 msgstr ""
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14793,7 +14793,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15771,6 +15771,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17554,18 +17557,33 @@ msgstr ""
 msgid "grade1"
 msgstr ""
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr ""
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr ""
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr ""
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr ""
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr ""
 
@@ -18755,6 +18773,72 @@ msgstr ""
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr ""
 
@@ -18959,9 +19043,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -18986,15 +19067,6 @@ msgstr ""
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr ""
-
-msgid "Railway platform (legacy)"
-msgstr ""
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr ""
@@ -22781,9 +22853,6 @@ msgstr ""
 msgid "A single tree."
 msgstr ""
 
-msgid "Botanical Name"
-msgstr ""
-
 msgid "Tree Row"
 msgstr ""
 
@@ -23820,6 +23889,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr ""
 
@@ -23972,6 +24056,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24344,6 +24431,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr ""
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26211,13 +26301,13 @@ msgstr ""
 msgid "  adding {0} {1}"
 msgstr ""
 
-msgid "Layer for editing GPX tracks"
+msgid "EditGpx"
 msgstr ""
 
-msgid "Convert to GPX layer with anonymised time"
+msgid "Layer for editing GPX tracks"
 msgstr ""
 
-msgid "EditGpx"
+msgid "Convert to GPX layer with anonymised time"
 msgstr ""
 
 msgid "edit gpx tracks"
@@ -26339,6 +26429,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr ""
 
@@ -27035,9 +27137,6 @@ msgstr ""
 msgid "Imported Images"
 msgstr ""
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr ""
-
 msgid "Import vector graphics"
 msgstr ""
 
@@ -27569,6 +27668,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27608,6 +27716,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27746,9 +27866,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27840,12 +27957,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29202,33 +29328,81 @@ msgstr ""
 msgid "Code"
 msgstr ""
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Platforms first"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
+msgstr ""
+
+msgid "PT_Assistant Proceed Request"
+msgstr ""
+
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29628,6 +29802,12 @@ msgstr ""
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31289,19 +31469,19 @@ msgstr ""
 msgid "Change to the Basic Editor and select a way"
 msgstr ""
 
-msgid "Undelete object..."
+msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Undelete object by id"
+msgid "Unable to undelete way {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete node {0}. Object has likely been redacted"
+msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
-msgid "Unable to undelete way {0}. Object has likely been redacted"
+msgid "Undelete object..."
 msgstr ""
 
-msgid "Unable to undelete relation {0}. Object has likely been redacted"
+msgid "Undelete object by id"
 msgstr ""
 
 msgid "Undelete Object"
@@ -31957,6 +32137,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr ""
 
@@ -31989,10 +32175,13 @@ msgstr ""
 msgid "Not linked yet"
 msgstr ""
 
-msgid "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
 msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
 msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
diff --git a/i18n/po/zh_CN.po b/i18n/po/zh_CN.po
index b2ecce1..a774b28 100644
--- a/i18n/po/zh_CN.po
+++ b/i18n/po/zh_CN.po
@@ -4,22 +4,22 @@
 # FIRST AUTHOR <EMAIL at ADDRESS>, 2009.
 # mmyangfl <mmyangfl at gmail.com>, 2012.
 # yangfl <yangfl at localhost>, 2014.
-# mmyfl <mmyangfl at gmail.com>, 2011, 2012, 2013, 2015.
+# mmyfl <mmyangfl at gmail.com>, 2011, 2012, 2013, 2015, 2016.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-06-04 17:38+0200\n"
-"PO-Revision-Date: 2016-03-03 01:46+0000\n"
-"Last-Translator: sinopitt <Unknown>\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
+"PO-Revision-Date: 2016-06-15 19:24+0000\n"
+"Last-Translator: mmyfl <Unknown>\n"
 "Language-Team: 汉语 <>\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: 2016-06-05 05:09+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:12+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: zh_CN\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -101,7 +101,7 @@ msgid "Updating user interface"
 msgstr "更新用户界面中"
 
 msgid "Failed to save default preferences."
-msgstr ""
+msgstr "无法保存默认首选项。"
 
 msgid "Ignoring malformed URL: \"{0}\""
 msgstr "忽略不正确的 URL:“{0}”"
@@ -181,7 +181,7 @@ msgid "Report bug"
 msgstr "报告错误"
 
 msgid "Failed to locate resource ''{0}''."
-msgstr "无法定位资源\"{0}\"。"
+msgstr "无法定位资源“{0}”。"
 
 msgid "Failed to load resource ''{0}'', error is {1}."
 msgstr "无法加载资源“{0}”,错误为 {1}。"
@@ -453,10 +453,10 @@ msgid "Delete selected objects."
 msgstr "删除选择的对象。"
 
 msgid "Delete Layer"
-msgstr ""
+msgstr "删除图层"
 
 msgid "Delete the active layer. Does not delete the associated file."
-msgstr ""
+msgstr "删除活动图层。不删除关联文件。"
 
 msgid "Toggle dialogs panel"
 msgstr "切换对话框面板"
@@ -1474,25 +1474,25 @@ msgstr ""
 "否则,所有路径会取得他们自己的复本,并且所有的节点都会被选定。"
 
 msgid "Existing node"
-msgstr ""
+msgstr "既有节点"
 
 msgid "Both nodes"
-msgstr ""
+msgstr "两种节点"
 
 msgid "New node"
-msgstr ""
+msgstr "新节点"
 
 msgid "Tags / Memberships"
 msgstr "标签/所在关系"
 
 msgid "Unglue"
-msgstr ""
+msgstr "拆开"
 
 msgid "Where should the tags of the node be put?"
-msgstr ""
+msgstr "节点标签应置于何处?"
 
 msgid "Where should the memberships of this node be put?"
-msgstr ""
+msgstr "节点关系应置于何处?"
 
 msgid "Unglued Node"
 msgstr "拆开节点"
@@ -1521,13 +1521,11 @@ msgstr "您将要拆开不完整的对象。<br>这会导致一些问题,因
 
 msgid "Unglueing affected {0} relation: {1}"
 msgid_plural "Unglueing affected {0} relations: {1}"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "拆开受影响的 {0} 个关系:{1}"
 
 msgid "Ensure that the relation has not been broken!"
 msgid_plural "Ensure that the relations have not been broken!"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "确认关系未破坏!"
 
 msgid "Disconnect Node from Way"
 msgstr "从路径中断开节点"
@@ -2082,7 +2080,7 @@ msgid "Dual alignment"
 msgstr "双对齐"
 
 msgid "Switch dual alignment mode while extruding"
-msgstr ""
+msgstr "拉伸时切换双对齐模式。"
 
 msgid "Extrude"
 msgstr "拉伸"
@@ -2091,7 +2089,7 @@ msgid "Create areas"
 msgstr "建立区域"
 
 msgid "Extrude Dual alignment"
-msgstr ""
+msgstr "拉伸双对齐"
 
 msgid ""
 "Drag a way segment to make a rectangle. Ctrl-drag to move a segment along "
@@ -2268,7 +2266,7 @@ msgstr "添加选择到关系"
 msgid ""
 "{0}Add selection to relation{1}: Verify every single relation to avoid "
 "damage!"
-msgstr ""
+msgstr "{0}添加选择至关系{1}:验证每个关系,避免破坏!"
 
 msgid "Add selection to {0} relation"
 msgid_plural "Add selection to {0} relations"
@@ -2310,10 +2308,10 @@ msgid "Confirmation"
 msgstr "确认"
 
 msgid "List of recent relations"
-msgstr ""
+msgstr "近期关系列表"
 
 msgid "Open recent relation"
-msgstr ""
+msgstr "打开近期的关系"
 
 msgid "Relation Editor: {0}"
 msgstr "关系编辑器:{0}"
@@ -2622,13 +2620,6 @@ msgstr "在已下载区域的对象"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr "在已下载区域的对象(和其所有的路径节点/关系成员)"
 
-msgid "Searching"
-msgstr "搜索中"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] "在 {0} 个对象中搜索"
-
 msgid "No match found for ''{0}''"
 msgstr "找不到“{0}”的符合项"
 
@@ -2644,6 +2635,13 @@ msgstr "在选择范围中找不到“{0}”"
 msgid "Found {0} matches"
 msgstr "找到 {0} 个匹配"
 
+msgid "Searching"
+msgstr "搜索中"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] "在 {0} 个对象中搜索"
+
 msgctxt "search"
 msgid "CS"
 msgstr "区分大小写"
@@ -2683,10 +2681,10 @@ msgstr ""
 "{1}"
 
 msgid "Cannot parse timestamp ''{0}''"
-msgstr ""
+msgstr "无法解析时间戳“{0}”"
 
 msgid "Expecting {0} after {1}"
-msgstr ""
+msgstr "{1} 后期望 {0}"
 
 msgid "Range of primitive ids expected"
 msgstr "预期元素 id 范围"
@@ -3086,7 +3084,7 @@ msgid "IOError while creating file, autosave will be skipped: {0}"
 msgstr "创建文件时发生 IO 错误,将跳过自动保存:{0}"
 
 msgid "Unable to delete old backup file {0}"
-msgstr "无法删除旧的备份文件 {0}"
+msgstr "无法删除旧备份文件 {0}"
 
 msgid "Your work has been saved automatically."
 msgstr "您的工作已自动保存。"
@@ -3095,19 +3093,19 @@ msgid "Restoring files"
 msgstr "正在还原文件"
 
 msgid "Unable to delete backup file {0}"
-msgstr ""
+msgstr "无法删除备份文件 {0}"
 
 msgid "Unable to delete PID file {0}"
-msgstr ""
+msgstr "无法删除 PID 文件 {0}"
 
 msgid "Unable to delete archived backup file {0}"
-msgstr ""
+msgstr "无法删除已归档的备份文件 {0}"
 
 msgid "Illegal latitude value ''{0}''"
-msgstr "不合法的纬度数值“{0}”"
+msgstr "非法纬度值“{0}”"
 
 msgid "Illegal longitude value ''{0}''"
-msgstr "不合法的经度数值“{0}”"
+msgstr "非法经度值“{0}”"
 
 msgid "Question"
 msgstr "问题"
@@ -3194,10 +3192,10 @@ msgid ""
 msgstr "初始化首选项失败。无法重置首选项文件为默认:{0}"
 
 msgid "Failed to load defaults cache file: {0}"
-msgstr ""
+msgstr "无法加载默认缓存文件:{0}"
 
 msgid "Failed to delete faulty defaults cache file: {0}"
-msgstr ""
+msgstr "无法删除错误的默认缓存文件:{0}"
 
 msgid "Paint style {0}: {1}"
 msgstr "绘画样式 {0}:{1}"
@@ -3272,7 +3270,7 @@ msgid "E"
 msgstr "东"
 
 msgid "Update default entries"
-msgstr ""
+msgstr "更新默认项"
 
 msgid "Projection ''{0}'' is not found, bookmark ''{1}'' is not usable"
 msgstr "找不到投影法“{0}”,无法使用书签“{1}”"
@@ -3313,7 +3311,7 @@ msgstr "未选择图层"
 
 msgid ""
 "WMTS Parser error - start element {0} has different name than end element {2}"
-msgstr ""
+msgstr "WMT S解析器错误 - 开始元素 {0} 与结束元素 {2} 名称不同"
 
 msgid ""
 "Only square tiles are supported. {0}x{1} returned by server for TileMatrix "
@@ -3508,10 +3506,10 @@ msgid "areatext"
 msgstr "区域文字"
 
 msgid "Expected element ''{0}'', but got ''{1}''"
-msgstr ""
+msgstr "期望元素“{0}”,得到“{1}”"
 
 msgid "value expected"
-msgstr ""
+msgstr "预期值"
 
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM 投影(''+proj=utm'')需要“+zone=...”参数。"
@@ -3520,16 +3518,16 @@ msgid "Expected integer value in range 1-60 for ''+zone=...'' parameter."
 msgstr "“+zone=...”参数的预期整数值介于 1-60 之间。"
 
 msgid "No unit found for: {0}"
-msgstr ""
+msgstr "未找到单位:{0}"
 
 msgid "Parameter must begin with a ''+'' character (found ''{0}'')"
 msgstr "参数必须开始于一个“+”字符(发现“{0}”)"
 
 msgid "Unknown parameter: ''{0}''."
-msgstr "未知参数: ''{0}''."
+msgstr "未知参数:“{0}”。"
 
 msgid "Value expected for parameter ''{0}''."
-msgstr "参数的预期值“{0}”。"
+msgstr "参数“{0}”预期值。"
 
 msgid "No value expected for parameter ''{0}''."
 msgstr "参数“{0}”没有预期值。"
@@ -3575,7 +3573,7 @@ msgid "Unknown parameter ''{0}''"
 msgstr "未知参数“{0}”"
 
 msgid "Expected number argument for parameter ''{0}''"
-msgstr "期望参数“{0}”的个数"
+msgstr "参数“{0}”的期望选项个数"
 
 msgid "Unable to parse value ''{1}'' of parameter ''{0}'' as number."
 msgstr "无法将参数“{0}”的值“{1}”解析为数值。"
@@ -3594,25 +3592,25 @@ msgid "WGS84"
 msgstr "WGS84"
 
 msgid "Albers Equal Area"
-msgstr ""
+msgstr "亚尔勃斯等积"
 
 msgid "Parameter ''{0}'' required."
 msgstr "需要参数“{0}”。"
 
 msgid "standard parallels are opposite"
-msgstr ""
+msgstr "纬线相对"
 
 msgid "Cassini-Soldner"
-msgstr ""
+msgstr "卡西尼-斯洛德"
 
 msgid "Double Stereographic"
-msgstr ""
+msgstr "双重极球面"
 
 msgid "Lambert Azimuthal Equal Area"
-msgstr ""
+msgstr "兰勃特方位等积"
 
 msgid "Lambert Conformal Conic"
-msgstr "兰勃特等角投影"
+msgstr "兰伯特等角圆锥"
 
 msgid "Lat/lon (Geodetic)"
 msgstr "纬度/经度(大地)"
@@ -3621,25 +3619,25 @@ msgid "Mercator"
 msgstr "麦卡托投影"
 
 msgid "Oblique Mercator"
-msgstr ""
+msgstr "斜轴墨卡托"
 
 msgid "Unsuitable parameters ''{0}'' and ''{1}'' for two point method."
-msgstr ""
+msgstr "两点法的参数“{0}”和“{1}”不合适。"
 
 msgid "Illegal value for parameter ''{0}'': {1}"
-msgstr ""
+msgstr "参数“{0}”值非法:{1}"
 
 msgid "error in initialization"
-msgstr ""
+msgstr "初始化错误"
 
 msgid "Polar Stereographic"
-msgstr ""
+msgstr "极球面"
 
 msgid "Polar Stereographic: Parameter ''{0}'' must be 90 or -90."
-msgstr ""
+msgstr "极球面:参数“{0}”必须为 90 或 -90。"
 
 msgid "Sinusoidal"
-msgstr ""
+msgstr "正弦"
 
 msgid "Swiss Oblique Mercator"
 msgstr "瑞士斜轴麦卡托"
@@ -3676,7 +3674,7 @@ msgid "E-mail address contains an invalid domain: {0}"
 msgstr "电子邮件地址包含无效域名:{0}"
 
 msgid "Email validator"
-msgstr ""
+msgstr "电子邮件地址验证器"
 
 msgid "URL is invalid"
 msgstr "URL 无效"
@@ -3697,7 +3695,7 @@ msgid "URL contains an invalid fragment: {0}"
 msgstr "URL 包含无效分段:{0}"
 
 msgid "URL validator"
-msgstr ""
+msgstr "URL 验证器"
 
 msgid "Addresses"
 msgstr "地址"
@@ -3832,7 +3830,7 @@ msgid "Building duplicated nodes"
 msgstr "建筑上的重复节点"
 
 msgid "Landuse duplicated nodes"
-msgstr "土地利用上的重复节点"
+msgstr "土地用途上的重复节点"
 
 msgid "Other duplicated nodes"
 msgstr "其他上的重复节点"
@@ -3901,9 +3899,6 @@ msgstr "互联网标签"
 msgid "Checks for errors in internet-related tags."
 msgstr "检查互联网相关标签的错误。"
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr " URL无法转换为ASCII码:{0}"
-
 msgid "''{0}'': {1}"
 msgstr "“{0}”:{1}"
 
@@ -3996,7 +3991,7 @@ msgstr "外部路径的样式不符"
 msgid ""
 "With the currently used mappaint style(s) the style for outer way mismatches "
 "the area style"
-msgstr ""
+msgstr "当前使用的 MapPoint 样式中,外部路径的风格与区域风格不匹配"
 
 msgid "Area style on outer way"
 msgstr "面状要素采用多重多边形路径外边界表示"
@@ -4109,13 +4104,13 @@ msgid "Public Transport Route"
 msgstr "公共交通路线"
 
 msgid "Route relation contains a ''{0}'' role"
-msgstr ""
+msgstr "路线关系含有角色“{0}”"
 
 msgid "Route relation contains a gap"
-msgstr ""
+msgstr "路线关系含有间隙"
 
 msgid "Stop position not part of route"
-msgstr ""
+msgstr "车站位置不是路线的一部分"
 
 msgid "Role verification problem"
 msgstr "角色验证问题"
@@ -4222,10 +4217,10 @@ msgid "Invalid white space in property key"
 msgstr "属性键值中有无效的空白字节"
 
 msgid "Property values start or end with white space"
-msgstr "属性数值以空白字节开头或结尾"
+msgstr "属性数值以空白字符开头或结尾"
 
 msgid "Property values contain multiple white spaces"
-msgstr ""
+msgstr "属性数值含有多重空白字符"
 
 msgid "Property values contain HTML entity"
 msgstr "属性数值含有 HTML 标记"
@@ -4336,7 +4331,7 @@ msgid "No \"to\" way found"
 msgstr "找不到“到达”路径"
 
 msgid "\"from\" way equals \"to\" way"
-msgstr ""
+msgstr "“出发”路径与“到达”路径相同"
 
 msgid "No \"via\" node or way found"
 msgstr "找不到“经过”节点或路径"
@@ -4372,7 +4367,7 @@ msgid "natural type {0}"
 msgstr "自然类型 {0}"
 
 msgid "landuse type {0}"
-msgstr "土地利用的类型 {0}"
+msgstr "土地用途的类型 {0}"
 
 msgid "amenities type {0}"
 msgstr "便利设施类型 {0}"
@@ -4411,7 +4406,7 @@ msgid "Unconnected waterways"
 msgstr "未连接的水路"
 
 msgid "Unconnected natural lands and landuses"
-msgstr "未连接的自然土地和土地利用"
+msgstr "未连接的自然土地和土地用途"
 
 msgid "Unconnected power ways"
 msgstr "未连接的输电线"
@@ -4537,7 +4532,7 @@ msgid "waterway"
 msgstr "航道"
 
 msgid "landuse"
-msgstr "土地利用"
+msgstr "土地用途"
 
 msgid "{0} node"
 msgid_plural "{0} nodes"
@@ -5005,10 +5000,10 @@ msgid "Do not hide status bar"
 msgstr "不要隐藏状态栏"
 
 msgid "The northing at the mouse pointer."
-msgstr ""
+msgstr "鼠标指针所在的北距。"
 
 msgid "The easting at the mouse pointer."
-msgstr ""
+msgstr "鼠标指针所在的东距。"
 
 msgid "The geographic latitude at the mouse pointer."
 msgstr "鼠标指针所在的地理纬度。"
@@ -5858,16 +5853,16 @@ msgid "Open a merge dialog of all selected items in the list above."
 msgstr "打开上列列表中,所有选定的项目的合并对话框。"
 
 msgid "Resolve to my versions"
-msgstr ""
+msgstr "应用我的版本"
 
 msgid "Resolves all unresolved conflicts to ''my'' version"
-msgstr ""
+msgstr "调解所有未解决的冲突为“我”的版本"
 
 msgid "Resolve to their versions"
-msgstr ""
+msgstr "应用另一人的版本"
 
 msgid "Resolves all unresolved conflicts to ''their'' version"
-msgstr ""
+msgstr "调解所有未解决的冲突为“另一人”的版本"
 
 msgid "There was {0} conflict detected."
 msgid_plural "There were {0} conflicts detected."
@@ -5976,19 +5971,19 @@ msgid "Delete filter."
 msgstr "删除过滤器。"
 
 msgid "Move filter up."
-msgstr "将过滤器上移。"
+msgstr "上移过滤器。"
 
 msgid "Move filter down."
-msgstr "将过滤器下移。"
+msgstr "下移过滤器。"
 
 msgid "Filter Hidden:{0} Disabled:{1}"
-msgstr "过滤隐藏:{0} 停用:{1}"
+msgstr "过滤器隐藏:{0} 停用:{1}"
 
 msgid "<html>Error in filter <code>{0}</code>:<br>{1}"
-msgstr ""
+msgstr "<html>过滤器 <code>{0}</code> 错误:<br>{1}"
 
 msgid "Error in filter"
-msgstr "过滤器中的错误"
+msgstr "过滤器错误"
 
 msgctxt "filter"
 msgid "E"
@@ -6204,12 +6199,12 @@ msgstr "您可以用空格、逗号或分号分隔经度和纬度。"
 msgid ""
 "Use positive numbers or N, E characters to indicate North or East cardinal "
 "direction."
-msgstr "使用正数或N、E指示北或东基方向。"
+msgstr "使用正数或 N、E 指示北或东向。"
 
 msgid ""
 "For South and West cardinal directions you can use either negative numbers "
 "or S, W characters."
-msgstr "南或西基方向则可以使用负数或S、W。"
+msgstr "南或西向则可以使用负数或 S、W。"
 
 msgid "Coordinate value can be in one of three formats:"
 msgstr "坐标值可以是三种格式中的一种:"
@@ -6248,19 +6243,19 @@ msgstr "投影坐标:"
 
 msgid ""
 "Enter easting and northing (x and y) separated by space, comma or semicolon."
-msgstr "输入东移量和北移量(x 和 y),用空格、逗号或分号分隔。"
+msgstr "输入东距和北距(x 和 y),用空格、逗号或分号分隔。"
 
 msgid "Lat/Lon"
 msgstr "纬度/经度"
 
 msgid "East/North"
-msgstr "东移/北移"
+msgstr "东距/北距"
 
 msgid "Please enter a GPS coordinates"
 msgstr "请输入 GPS 坐标"
 
 msgid "Please enter a Easting and Northing"
-msgstr "请输入东移量和北移量"
+msgstr "请输入东距和北距"
 
 msgid "Toggle visibility of layer: {0}"
 msgstr "切换图层的可见度:{0}"
@@ -6269,26 +6264,26 @@ msgid "Open a list of all loaded layers."
 msgstr "打开所有加载图层的列表。"
 
 msgid "layer is currently visible (click to hide layer)"
-msgstr "图层目前为显示(点击以隐藏图层)"
+msgstr "图层目前已显示(点击以隐藏图层)"
 
 msgid "layer is currently hidden (click to show layer)"
-msgstr "图层目前为隐藏(点击以显示图层)"
+msgstr "图层目前已隐藏(点击以显示图层)"
 
 msgid "this layer is the active layer"
-msgstr "这个图层是使用中的图层"
+msgstr "此图层为使用中的图层"
 
 msgid "this layer is not currently active (click to activate)"
-msgstr "这个图层不是目前使用中的(点击可使用)"
+msgstr "此图层当前未使用(点击可使用)"
 
 msgid "scale follows native resolution of this layer"
-msgstr ""
+msgstr "比例尺设为该图层的原始分辨率"
 
 msgid ""
 "scale follows native resolution of another layer (click to set this layer)"
-msgstr ""
+msgstr "比例尺设为另一图层的原始分辨率(点击可设定)"
 
 msgid "this layer has no native resolution"
-msgstr ""
+msgstr "此图层无原始分辨率"
 
 msgid "Information about layer"
 msgstr "图层信息"
@@ -6330,10 +6325,10 @@ msgid "Save a copy of this Style to file and add it to the list"
 msgstr "保存这个样式的复本到文件中,并将它添加到列表中"
 
 msgid "Map paint style file (*.mapcss, *.zip)"
-msgstr "地图绘制风格文件(*.mapcss,*.zip)"
+msgstr "地图绘制样式文件(*.mapcss,*.zip)"
 
 msgid "Map paint style file (*.xml, *.zip)"
-msgstr "地图绘制风格文件(*.xml,*.zip)"
+msgstr "地图绘制样式文件(*.xml,*.zip)"
 
 msgid "Reloading style sources"
 msgstr "重新加载样式来源"
@@ -6731,7 +6726,7 @@ msgid "Download objects"
 msgstr "下载对象"
 
 msgid "Download the current version of the selected objects"
-msgstr ""
+msgstr "下载所选对象的当前版本"
 
 msgid "Select in layer"
 msgstr "在图层中选择"
@@ -6899,7 +6894,7 @@ msgid ""
 msgstr "不能限制修改集合的查询为当前的用户,因为当前的用户是匿名的"
 
 msgid "Current value ''{0}'' for user ID is not valid"
-msgstr "用户 ID 目前的数值“{0}”是无效的"
+msgstr "当前用户 ID 值“{0}”无效"
 
 msgid "Cannot restrict the changeset query to the user name ''{0}''"
 msgstr "不能限制为查询用户名“{0}”的修改集合"
@@ -6923,7 +6918,7 @@ msgid "Time:"
 msgstr "时间:"
 
 msgid "Closed after - "
-msgstr "在此后关闭 - "
+msgstr "关闭晚于 - "
 
 msgid "Date:"
 msgstr "日期:"
@@ -7019,7 +7014,7 @@ msgstr "<html>下载在目前地图查看中的修改集合</html>"
 msgid ""
 "Unexpected value for preference ''{0}'', got ''{1}''. Resetting to default "
 "query."
-msgstr "首选项\"{0}\"中出现超出预期的值\"{1}\"。将重置为默认请求。"
+msgstr "首选项\"{0}\"中出现意外值\"{1}\"。正在重置为默认请求。"
 
 msgid "Cannot create changeset query for open changesets of anonymous user"
 msgstr "不能创建匿名用户的开放修改集合查询"
@@ -7096,10 +7091,10 @@ msgid "Copy {1} of {0}"
 msgstr "{0} 的副本 {1}"
 
 msgid "Change visibility of the selected layer."
-msgstr ""
+msgstr "更改所选图层的可见性。"
 
 msgid "Show layer"
-msgstr ""
+msgstr "显示图层"
 
 msgid "Adjust opacity of the layer."
 msgstr "调整图层的不透明度。"
@@ -7114,16 +7109,16 @@ msgid "Gamma"
 msgstr "Gamma"
 
 msgid "Adjust sharpness/blur value of the layer."
-msgstr ""
+msgstr "调整图层的清晰/模糊度。"
 
 msgid "Sharpness"
-msgstr ""
+msgstr "清晰度"
 
 msgid "Adjust colorfulness of the layer."
-msgstr ""
+msgstr "调整图层的色度。"
 
 msgid "Colorfulness"
-msgstr ""
+msgstr "色度"
 
 msgid "Merge this layer into another layer"
 msgstr "将这个图层合并至另一个图层"
@@ -7221,22 +7216,22 @@ msgid "Edit Tags"
 msgstr "编辑标签"
 
 msgid "Go to OSM wiki for tag help"
-msgstr ""
+msgstr "转到 OSM 维基获取标签帮助"
 
 msgid "Launch browser with wiki help for selected object"
 msgstr "启动浏览器并显示选定对象的维基说明"
 
 msgid "Go to Taginfo"
-msgstr "前往Taginfo"
+msgstr "前往 Taginfo"
 
 msgid "Launch browser with Taginfo statistics for selected object"
-msgstr "在浏览器中打开选中对象的Taginfo统计"
+msgstr "在浏览器中打开选定对象的 Taginfo 统计信息"
 
 msgid "Paste Value"
-msgstr "粘贴值参"
+msgstr "粘贴数值"
 
 msgid "Paste the value of the selected tag from clipboard"
-msgstr "从剪贴板粘贴标签的值参"
+msgstr "从剪贴板粘贴标签的数值"
 
 msgid "Copy Value"
 msgstr "复制数值"
@@ -7257,7 +7252,7 @@ msgid "Copy the key and value of all the tags to clipboard"
 msgstr "复制所有标签的键值对到剪切板"
 
 msgid "Copy Tags"
-msgstr ""
+msgstr "复制标签"
 
 msgid "Search Key/Value/Type"
 msgstr "搜索键/值/类型"
@@ -7323,7 +7318,7 @@ msgid "Remember last used tags after a restart"
 msgstr "重启后仍记住最近使用的标签"
 
 msgid "Recent tags with existing key"
-msgstr ""
+msgstr "已有键的最近标签"
 
 msgid "Enable"
 msgstr "启用"
@@ -7332,16 +7327,16 @@ msgid "Hide"
 msgstr "隐藏"
 
 msgid "Refresh recent tags list after applying tag"
-msgstr ""
+msgstr "应用标签后刷新最近标签列表"
 
 msgid "No refresh"
-msgstr ""
+msgstr "不刷新"
 
 msgid "Refresh tag status only (enabled / disabled)"
-msgstr ""
+msgstr "仅刷新标签状态(启用/禁用)"
 
 msgid "Refresh tag status and list of recently added tags"
-msgstr ""
+msgstr "刷新标签状态和最近添加标签列表"
 
 msgid "to apply first suggestion"
 msgstr "以应用第一条建议"
@@ -7353,7 +7348,7 @@ msgid "to add first suggestion without closing the dialog"
 msgstr "以在不关闭对话框的情况下添加第一条建议"
 
 msgid "Please enter the number of recently added tags to display"
-msgstr "请输入应显示多少最近的新标签"
+msgstr "请输入显示最近添加的标签数量"
 
 msgid "Please enter integer number between 0 and {0}"
 msgstr "请输入整数从 0 到 {0}"
@@ -7371,19 +7366,19 @@ msgid "Apply recent tag {0}"
 msgstr "应用最近使用的标签{0}"
 
 msgid "The key ''{0}'' is already used"
-msgstr "键“{0}”已被使用"
+msgstr "键“{0}”已使用"
 
 msgid "Ignore key ''{0}''"
-msgstr ""
+msgstr "忽略键“{0}”"
 
 msgid "Ignore tag ''{0}''"
-msgstr ""
+msgstr "忽略标签“{0}”"
 
 msgid "Edit ignore list"
-msgstr ""
+msgstr "编辑忽略列表"
 
 msgid "You changed the value of ''{0}'' from ''{1}'' to ''{2}''."
-msgstr "您已将键\"{0}\"的值从\"{1}\"改为\"{2}\"."
+msgstr "您已将键“{0}”的值从“{1}”改为“{2}”。"
 
 msgid "Edit the relation the currently selected relation member refers to."
 msgstr "编辑目前选定的关系成员所参照的关系。"
@@ -7419,7 +7414,7 @@ msgid "Downloading relation {0}"
 msgstr "正在下载关系 {0}"
 
 msgid "Ignoring exception because task was canceled. Exception: {0}"
-msgstr "由于任务被取消忽略以下异常: {0}"
+msgstr "由于任务被取消,忽略以下异常: {0}"
 
 msgid "Downloading {0} incomplete object"
 msgid_plural "Downloading {0} incomplete objects"
@@ -7515,7 +7510,7 @@ msgid "Refers to"
 msgstr "参照到"
 
 msgid "Cannot add {0} since it is not part of dataset"
-msgstr ""
+msgstr "无法添加 {0},因为它不是数据集合的一部分"
 
 msgid "Download referring relations"
 msgstr "下载参照的关系"
@@ -7594,7 +7589,7 @@ msgstr "点击以返回关系编辑器,并继续关系的编辑"
 msgid ""
 "<html>The relation has been changed.<br><br>Do you want to save your "
 "changes?</html>"
-msgstr "<html>关系已改变。<br><br>您想保存您的更改吗?</html>"
+msgstr "<html>关系已改变。<br><br>是否保存您的更改?</html>"
 
 msgid "Unsaved changes"
 msgstr "未保存的更改"
@@ -7635,30 +7630,30 @@ msgstr "应用更新并关闭此对话框"
 msgid ""
 "Members from paste buffer cannot be added because they are not included in "
 "current layer"
-msgstr "从剪贴板中的成员不能被添加,因为它们不被包含在当前图层中"
+msgstr "不能添加剪贴板中的成员,因为它们未包含于当前图层中"
 
 msgid "Relation Editor: Refresh"
-msgstr ""
+msgstr "关系编辑器:刷新"
 
 msgid "Refresh relation from data layer"
-msgstr ""
+msgstr "刷新数据图层的关系"
 
 msgid "Refresh"
-msgstr "重新整理"
+msgstr "刷新"
 
 msgid "Yes, discard changes and reload"
-msgstr ""
+msgstr "是,放弃更改并重新加载"
 
 msgid "Click to discard the changes and reload data from layer"
-msgstr ""
+msgstr "点击以放弃更改并从图层中重新加载数据"
 
 msgid ""
 "<html>You have unsaved changes in this editor window.<br><br>Do you want to "
 "discard these changes and reload data from layer?</html>"
-msgstr ""
+msgstr "<HTML>您在此编辑器窗口中有未保存的更改。<br><br>是否要放弃这些更改并从图层中重新加载数据?</html>"
 
 msgid "Click to close window"
-msgstr ""
+msgstr "点击关闭窗口"
 
 msgid "No, continue editing"
 msgstr "否,继续编辑"
@@ -7666,10 +7661,10 @@ msgstr "否,继续编辑"
 msgid ""
 "<html>Relation has been deleted outside editor.<br><br>Do you want to close "
 "this window?</html>"
-msgstr ""
+msgstr "<html>关系已在编辑器之外删除。<br><br>是否要关闭此窗口?</ HTML>"
 
 msgid "Deleted relation"
-msgstr ""
+msgstr "已删除关系"
 
 msgid "Relation Editor: Remove"
 msgstr "关系编辑器:删除"
@@ -7704,13 +7699,12 @@ msgid ""
 "<html>This relation has been changed outside of the editor.<br>You cannot "
 "apply your changes and continue editing.<br><br>Do you want to create a "
 "conflict and close the editor?</html>"
-msgstr ""
-"<html>这个关系已经在此编辑器以外的地方被改变了。<br>您不能应用自己的修改后继续编辑。<br><br>是否要建立冲突并关闭编辑器? </html>"
+msgstr "<html>此关系已在编辑器之外更改。<br>您不能应用自己的修改继续编辑。<br><br>是否要建立冲突并关闭编辑器? </html>"
 
 msgid ""
 "<html>Layer ''{0}'' already has a conflict for object<br>''{1}''.<br>Please "
 "resolve this conflict first, then try again.</html>"
-msgstr "html>图层“{0}”已经有冲突于对象<br>“{1}”。<br>请先调解这个冲突,然后再试一次。</html>"
+msgstr "<html>图层“{0}”已经有冲突于对象<br>“{1}”。<br>请先调解这个冲突,然后再试一次。</html>"
 
 msgid "Select objects for selected relation members"
 msgstr "选择已选定关系成员中的对象"
@@ -7838,13 +7832,13 @@ msgid "Bounding Box"
 msgstr "限定边框"
 
 msgid "The string ''{0}'' is not a valid double value."
-msgstr "字串“{0}”不是一个合格的 double 数值。"
+msgstr "字符串“{0}”不是有效的 double 数值。"
 
 msgid "Value for latitude in range [-90,90] required."
-msgstr "纬度的数值范围必须为[-90,90]。"
+msgstr "纬度的数值范围必须为 [-90,90]。"
 
 msgid "Value for longitude in range [-180,180] required."
-msgstr "经度的数值范围必须为[-180,180]。"
+msgstr "经度的数值范围必须为 [-180,180]。"
 
 msgid "Data Sources and Types:"
 msgstr "数据来源和类型:"
@@ -8015,7 +8009,7 @@ msgstr ""
 msgid ""
 "<html>Failed to open help page for url {0}.<br>This is most likely due to a "
 "network problem, please check<br>your internet connection</html>"
-msgstr "<html>无法打开 url {0} 的帮助页面。<br>这大部分是网络问题造成的,请检查<br>您的互联网网络连接</html>"
+msgstr "<html>无法打开 url {0} 的帮助页面。<br>这很有可能是网络问题造成的,请检查<br>您的互联网网络连接</html>"
 
 msgid "Failed to open URL"
 msgstr "无法打开 URL"
@@ -8046,7 +8040,7 @@ msgid "Go to the JOSM help home page"
 msgstr "转到 JOSM 帮助首页"
 
 msgid "Bad location in HTML document. Exception was: {0}"
-msgstr "HTML文档中有错误。异常是:{0}"
+msgstr "HTML 文档中有错误。异常为:{0}"
 
 msgid "Failed to open help page. The target URL is empty."
 msgstr "无法打开帮助页面。目标 URL 是空的。"
@@ -8134,10 +8128,10 @@ msgid "Object"
 msgstr "对象"
 
 msgid "Changeset comment"
-msgstr "修改集注释"
+msgstr "修改集合注释"
 
 msgid "Changeset source"
-msgstr "修改集数据源"
+msgstr "修改集合来源"
 
 msgid "Imagery used"
 msgstr "使用的影像底图"
@@ -8158,8 +8152,7 @@ msgstr "<html>版本 <strong>{0}</strong> 建立于 <strong>{1}</strong></html>"
 
 msgid "This changeset has {0} comment"
 msgid_plural "This changeset has {0} comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "此修改集合有 {0} 条评论"
 
 msgid "Changeset"
 msgstr "修改集合"
@@ -8180,7 +8173,7 @@ msgid "Launch browser with information about the user"
 msgstr "在浏览器中打开用户信息"
 
 msgid "Show user {0}"
-msgstr "显示用户{0}"
+msgstr "显示用户 {0}"
 
 msgid "Ver"
 msgstr "版本"
@@ -8275,19 +8268,19 @@ msgstr "上传"
 msgid ""
 "Select which actions to perform for this layer, if you click the leftmost "
 "button."
-msgstr ""
+msgstr "选择当点击最左边的按钮时,应对该图层执行哪些操作。"
 
 msgid "Check \"Upload\" to upload the changes to the OSM server."
-msgstr ""
+msgstr "选中“上传”以上传更改至 OSM 服务器。"
 
 msgid "Check \"Save\" to save the layer to the file specified on the left."
-msgstr ""
+msgstr "选中“保存”以将图层保存到左侧指定的文件。"
 
 msgid "Provide a brief comment for the changes you are uploading:"
-msgstr "提供您的修改的一些简短说明:"
+msgstr "为您的修改提供一些简短说明:"
 
 msgid "Enter an upload comment"
-msgstr "输入一个上传注解"
+msgstr "输入上传注释"
 
 msgid "Specify the data source for the changes"
 msgstr "为本次修改制定数据来源"
@@ -8975,7 +8968,7 @@ msgid_plural "{0} objects to delete:"
 msgstr[0] "{0} 个对象要删除:"
 
 msgid "Show tile info"
-msgstr ""
+msgstr "显示瓦片信息"
 
 msgid "Tile Info"
 msgstr "瓦片信息"
@@ -8984,22 +8977,22 @@ msgid "Metadata "
 msgstr "元数据 "
 
 msgid "Load tile"
-msgstr ""
+msgstr "加载瓦片"
 
 msgid "Auto zoom"
-msgstr ""
+msgstr "自动缩放"
 
 msgid "Auto load tiles"
 msgstr "自动加载瓦片"
 
 msgid "Show errors"
-msgstr ""
+msgstr "显示错误"
 
 msgid "Load all tiles"
-msgstr ""
+msgstr "加载所有瓦片"
 
 msgid "Load all error tiles"
-msgstr ""
+msgstr "加载所有出错瓦片"
 
 msgid "Zoom to native resolution"
 msgstr "缩放到原始分辨率"
@@ -9014,7 +9007,7 @@ msgid "Decrease zoom"
 msgstr "减少缩放"
 
 msgid "Flush tile cache"
-msgstr ""
+msgstr "清除瓦片缓存"
 
 msgid "Failed to create tile source"
 msgstr "无法创建瓦片源"
@@ -9025,8 +9018,8 @@ msgstr "放大以加载瓦片"
 msgid "zoom in to load more tiles"
 msgstr "放大以加载更多瓦片"
 
-msgid "increase zoom level to see more detail"
-msgstr "缩小以查看更多信息"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "在此缩放等级没有瓦片"
@@ -9157,13 +9150,13 @@ msgid "All projections are supported"
 msgstr "支持所有的投影法"
 
 msgid "The layer {0} does not support the new projection {1}."
-msgstr ""
+msgstr "图层 {0} 不支持新投影法 {1}。"
 
 msgid "Supported projections are: {0}"
-msgstr ""
+msgstr "支持的投影法为:{0}"
 
 msgid "Change the projection again or remove the layer."
-msgstr ""
+msgstr "再次改变投影法,或删除图层。"
 
 msgid "Save Layer"
 msgstr "保存图层"
@@ -9674,7 +9667,7 @@ msgid "No imagery layers"
 msgstr "没有图像图层"
 
 msgid "HDOP"
-msgstr ""
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "时间"
@@ -9683,7 +9676,7 @@ msgid "Direction"
 msgstr "方向"
 
 msgid "Velocity, {0}"
-msgstr ""
+msgstr "速度,{0}"
 
 msgid "gps point"
 msgstr "gps 点"
@@ -9805,6 +9798,8 @@ msgid ""
 "JOSM does no longer support mappaint styles written in the old XML format.\n"
 "Please update ''{0}'' to MapCSS"
 msgstr ""
+"JOSM 不再支持旧 XML 格式的 MapPoint 样式。\n"
+"请更新“{0}”到 MapCSS"
 
 msgid "loading style ''{0}''..."
 msgstr "加载样式“{0}”中..."
@@ -9856,10 +9851,10 @@ msgid "Authorize URL:"
 msgstr "验证 URL:"
 
 msgid "OSM login URL:"
-msgstr ""
+msgstr "OSM 登录 URL:"
 
 msgid "OSM logout URL:"
-msgstr ""
+msgstr "OSM 注销 URL:"
 
 msgid "Click to reset the OAuth settings to default values"
 msgstr "按这里将 OAuth 设定值重设为默认值"
@@ -10047,6 +10042,8 @@ msgid ""
 "sure to set an OAuth consumer key and secret in the <i>Advanced OAuth "
 "parameters</i>."
 msgstr ""
+"<strong>警告:</strong>由于您使用的不是默认 OSM API,请务必在<i>高级 OAuth 参数</i>中设置 OAuth "
+"使用者键和密钥。"
 
 msgid "Get an Access Token for ''{0}''"
 msgstr "取得“{0}”的访问令牌"
@@ -10982,10 +10979,10 @@ msgid "Use native file choosers (nicer, but do not support file filters)"
 msgstr "使用原生文件选择器(更美观但不支持文件过滤功能)"
 
 msgid "Reverse zoom with mouse wheel"
-msgstr ""
+msgstr "反转鼠标滚轮的缩放"
 
 msgid "Intermediate steps between native resolutions"
-msgstr ""
+msgstr "原始分辨率间的中间步进"
 
 msgid "Show localized name in selection lists, if available"
 msgstr "如果可以,在选择范围列表中显示本地化的名称"
@@ -11011,19 +11008,19 @@ msgid ""
 msgstr "使用更类似原生文件选择器的选择器,更加美观但不支持诸如文件过滤器等功能。"
 
 msgid "Check if you feel opposite direction more convenient"
-msgstr ""
+msgstr "如果反向更方便,选中此项"
 
 msgid ""
 "Divide intervals between native resolution levels to smaller steps if they "
 "are much larger than zoom ratio"
-msgstr ""
+msgstr "在原始分辨率级别之间划出间隔以减小步进值,若步进比缩放比大得多"
 
 msgid "Zoom steps to get double scale"
-msgstr ""
+msgstr "缩放步进"
 
 msgid ""
 "Higher value means more steps needed, therefore zoom steps will be smaller"
-msgstr ""
+msgstr "值越大代表更多步进,因此缩放步进值会变小"
 
 msgid "Look and Feel"
 msgstr "外观与感觉"
@@ -11218,10 +11215,10 @@ msgid "Northing"
 msgstr "向北"
 
 msgid "Auto zoom by default: "
-msgstr "默认情况下,自动缩放: "
+msgstr "默认自动缩放: "
 
 msgid "Autoload tiles by default: "
-msgstr "默认情况下,自动加载瓦片: "
+msgstr "默认自动加载瓦片: "
 
 msgid "Min. zoom level: "
 msgstr "最小缩放级别: "
@@ -11605,7 +11602,7 @@ msgid "3 or 7 term datum transform parameters"
 msgstr "基准变换三参数或七参数"
 
 msgid "NTv2 grid file"
-msgstr "NTv2网格文件"
+msgstr "NTv2 网格文件"
 
 msgid "Built-in:"
 msgstr "内置:"
@@ -11698,16 +11695,16 @@ msgid "Swiss Grid (Switzerland)"
 msgstr "Swiss Grid(瑞士)"
 
 msgid "<i>CH1903 / LV03 (without local corrections)</i>"
-msgstr "<i>CH1903/ LV03(没有本地校正)</i>"
+msgstr "<i>CH1903/ LV03(无本地校正)</i>"
 
 msgid "Guadeloupe Fort-Marigot 1949"
-msgstr "Guadeloupe Fort-Marigot 1949"
+msgstr "瓜德罗普岛堡马里戈特 1949"
 
 msgid "Guadeloupe Ste-Anne 1948"
-msgstr "Guadeloupe Ste-Anne 1948"
+msgstr "瓜德罗普岛圣安妮 1948"
 
 msgid "Martinique Fort Desaix 1952"
-msgstr "Martinique Fort Desaix 1952"
+msgstr "马提尼克岛德塞堡 1952"
 
 msgid "Reunion RGR92"
 msgstr "留尼旺 RGR92"
@@ -11948,13 +11945,13 @@ msgid "Please enter the OSM API URL."
 msgstr "请输入 OSM API URL。"
 
 msgid "Use Overpass server for object downloads"
-msgstr "使用Overpass服务器下载对象"
+msgstr "使用 Overpass 服务器下载对象"
 
 msgid "Overpass server: "
 msgstr "Overpass 服务器: "
 
 msgid "Overpass server"
-msgstr "Overpass服务器"
+msgstr "Overpass 服务器"
 
 msgid "Proxy settings"
 msgstr "代理服务器设定值"
@@ -11986,7 +11983,7 @@ msgid ""
 "Use standard system settings (disabled. Start JOSM with <tt>-"
 "Djava.net.useSystemProxies=true</tt> to enable)"
 msgstr ""
-"使用标准的系统设定值(已停用。使用 <tt>-Djava.net.useSystemProxies=true</tt> 启动 JOSM 可以启用它)"
+"使用标准系统设定值(已停用。使用 <tt>-Djava.net.useSystemProxies=true</tt> 启动 JOSM 以启用)"
 
 msgid "Manually configure a HTTP proxy"
 msgstr "手动设定 HTTP 代理服务器"
@@ -12053,7 +12050,7 @@ msgid "Active rules:"
 msgstr "有效规则:"
 
 msgid "Add a new rule by entering filename or URL"
-msgstr "增加一条输入文件名或URL的规则"
+msgstr "输入文件名或 URL 添加规则"
 
 msgid "New rule entry:"
 msgstr "新建规则条目:"
@@ -12062,16 +12059,16 @@ msgid "Remove the selected rules from the list of active rules"
 msgstr "将已选规则从有效规则中移除"
 
 msgid "Edit the filename or URL for the selected active rule"
-msgstr "编辑所选有效规则的文件名或URL"
+msgstr "编辑所选启用规则的文件名或 URL"
 
 msgid "Add the selected available rules to the list of active rules"
 msgstr "将所选可用规则加入有效规则"
 
 msgid "Reloads the list of available rules from ''{0}''"
-msgstr "重新从 {0} 中加载可用规则列表"
+msgstr "重新从“{0}”中加载可用规则列表"
 
 msgid "Loading rule sources from ''{0}''"
-msgstr "从 {0} 中加载规则源"
+msgstr "从“{0}”中加载规则源"
 
 msgid ""
 "<html>Failed to load the list of rule sources "
@@ -12079,7 +12076,7 @@ msgid ""
 msgstr "<html>从 {0} 加载规则源失败。<br><br>详细信息(未翻译):<br>{1}</html>"
 
 msgid "Warning: illegal format of entry in rule list ''{0}''. Got ''{1}''"
-msgstr "警告:规则列表\"{0}\"中非法的条目格式\"{1}\""
+msgstr "警告:规则列表“{0}”中条目格式非法。得到“{1}”"
 
 msgid "Checks for errors on addresses"
 msgstr "检查地址错误"
@@ -12206,7 +12203,7 @@ msgid "Elements of type {0} are supported."
 msgstr "支持类型 {0} 的元素。"
 
 msgid "This preset also sets: {0}"
-msgstr ""
+msgstr "此预设组合还设置:{0}"
 
 msgid "Edit also …"
 msgstr "亦编辑…"
@@ -12278,7 +12275,7 @@ msgid "Presets"
 msgstr "预设组合(P)"
 
 msgid "Search for objects by preset..."
-msgstr ""
+msgstr "按预设组合搜索对象..."
 
 msgid "Search for objects by preset"
 msgstr "按预设组合搜索对象"
@@ -12324,7 +12321,7 @@ msgid ""
 msgstr "预设标签“{0}-{1}”损坏 - 在“short_descriptions”中的项目数量必须与“values”中的相同"
 
 msgid "This corresponds to the key ''{0}''"
-msgstr ""
+msgstr "其对应于键“{0}”"
 
 msgid "More information about this feature"
 msgstr "关于这个功能的更多信息"
@@ -12412,37 +12409,37 @@ msgid ""
 msgstr "目前的数值不是有效的 OSM ID。请输入大于 0 的整数值"
 
 msgid "false: the property is explicitly switched off"
-msgstr "false:该属性已经被确实关闭了"
+msgstr "假:属性已明确关闭"
 
 msgid "false: the property ''{0}'' is explicitly switched off"
-msgstr ""
+msgstr "假:属性“{0}”已明确关闭"
 
 msgid "true: the property is explicitly switched on"
-msgstr "true:该属性已经被确实打开了"
+msgstr "真:属性已明确打开"
 
 msgid "true: the property ''{0}'' is explicitly switched on"
-msgstr ""
+msgstr "真:属性“{0}”已明确打开"
 
 msgid ""
 "partial: different selected objects have different values, do not change"
-msgstr "部分:不同选定的对象有不同的数值,不要改变"
+msgstr "部分:不同选定的对象有不同的数值,不更改"
 
 msgid ""
 "partial: different selected objects have different values for ''{0}'', do "
 "not change"
-msgstr ""
+msgstr "部分:不同选定的对象的“{0}”有不同的数值,不更改"
 
 msgid "unset: do not set this property on the selected objects"
 msgstr "取消设定:不要在选定的对象上设定这个属性"
 
 msgid "unset: do not set the property ''{0}'' on the selected objects"
-msgstr ""
+msgstr "取消设定:不要在选定的对象上设定属性“{0}”"
 
 msgid "Cut"
 msgstr "剪切"
 
 msgid "Right click = copy to clipboard"
-msgstr "右键=复制到剪贴板"
+msgstr "右键 = 复制到剪贴板"
 
 msgid "Missing mandatory attribute ''{0}''."
 msgstr "缺少必要的属性“{0}”。"
@@ -12522,10 +12519,10 @@ msgstr "服务器功能中元素“{1}”的属性“{0}”值非法。得到“
 msgid ""
 "Error adding certificate {0} - certificate fingerprint mismatch. Expected "
 "{1}, was {2}"
-msgstr ""
+msgstr "添加证书 {0} 时错误 - 证书指纹不匹配。期望 {1},得到 {2}"
 
 msgid "Adding certificate for TLS connections: {0}"
-msgstr ""
+msgstr "正在添加 TLS 连接证书:{0}"
 
 msgid "Failed to parse date ''{0}'' replied by server."
 msgstr "解析服务器返回的日期“{0}”失败。"
@@ -12891,7 +12888,7 @@ msgstr "不支持修改集合内容({1},{2})处的开始元素\"{0}\"。正在
 msgid ""
 "Illegal document structure. Found node, way, or relation outside of "
 "''create'', ''modify'', or ''delete''."
-msgstr "不合法的文件结构。发现节点、路径或关系并非“create”、“modify”或“delete”。"
+msgstr "非法文件结构。发现节点、路径或关系的操作并非“create”、“modify”或“delete”。"
 
 msgid ""
 "Unsupported end element ''{0}'' in changeset content at position ({1},{2}). "
@@ -13321,25 +13318,25 @@ msgid "Data:"
 msgstr "数据:"
 
 msgid "Link to a OSM data file on your local disk."
-msgstr "连接到本地磁盘上的一个 OSM 数据文件。"
+msgstr "链接到本地磁盘上的 OSM 数据文件。"
 
 msgid "Include OSM data in the .joz session file."
 msgstr "将 OSM 数据包含在 .joz 会话文件。"
 
 msgid "Link to a GPX data file on your local disk."
-msgstr ""
+msgstr "链接到本地磁盘上的 GPX 数据文件。"
 
 msgid "Include GPX data in the .joz session file."
-msgstr "将 GPX 数据包含在 .joz 会话文件中"
+msgstr "将 GPX 数据包含在 .joz 会话文件中。"
 
 msgid "No file association"
 msgstr "没有文件关联"
 
 msgid "GPX data will be included in the session file."
-msgstr "GPX 数据将包含于 .joz 会话文件中"
+msgstr "GPX 数据将包含于会话文件中。"
 
 msgid "OSM data will be included in the session file."
-msgstr "OSM 数据将会包含在会话文件中。"
+msgstr "OSM 数据将包含于会话文件中。"
 
 msgid ""
 "Version ''{0}'' of meta data for geoimage layer is not supported. Expected: "
@@ -13352,7 +13349,7 @@ msgid ""
 msgstr "不支持版本“{0}”的 gpx 轨迹图层元数据。预期:0.1"
 
 msgid "File name expected for layer no. {0}"
-msgstr "预计为第 {0} 图层的文件名"
+msgstr "第 {0} 图层的预期文件名"
 
 msgid ""
 "Version ''{0}'' of meta data for imagery layer is not supported. Expected: "
@@ -13361,16 +13358,16 @@ msgstr "不支持版本“{0}”的图像图层元数据。预期:0.1"
 
 msgid ""
 "Version ''{0}'' of meta data for marker layer is not supported. Expected: 0.1"
-msgstr "标注图层元数据版本\"{0}\"不再支持,应为0.1"
+msgstr "不支持版本“{0}”的标记图层元数据。预期:0.1"
 
 msgid ""
 "Version ''{0}'' of meta data for note layer is not supported. Expected: 0.1"
-msgstr ""
+msgstr "不支持版本“{0}”的笔记图层元数据。预期:0.1"
 
 msgid ""
 "Version ''{0}'' of meta data for osm data layer is not supported. Expected: "
 "0.1"
-msgstr "不支持数据图层版本“{0}”的 OSM 元数据。预期:0.1"
+msgstr "不支持版本“{0}”的 OSM 数据图层元数据。预期:0.1"
 
 msgid "Session file (*.jos, *.joz)"
 msgstr "会话文件(*.jos, *.joz)"
@@ -14176,7 +14173,7 @@ msgid "Unable to delete file {0}"
 msgstr "无法删除文件 {0}"
 
 msgid "Unable to create directory {0}"
-msgstr ""
+msgstr "无法创建文件夹 {0}"
 
 msgid "ms"
 msgstr "毫秒"
@@ -14280,7 +14277,7 @@ msgstr "(该文字已复制到您的剪贴板中。)"
 
 msgid ""
 "Opening the bug report failed. Please report manually using this website:"
-msgstr ""
+msgstr "打开错误报告失败。请使用此网站手动报告:"
 
 msgid ""
 "Error in search expression on position {0} - right side of or(|) expression "
@@ -14608,7 +14605,7 @@ msgid "Bing aerial imagery"
 msgstr "Bing 航拍图像"
 
 msgid "HDM (Humanitarian OpenStreetMap Team)"
-msgstr "HDM(人道主义 OSM 团队)"
+msgstr "HDM (人道主义 OSM 团队)"
 
 msgid "Mapbox Satellite"
 msgstr "Mapbox 卫星"
@@ -14620,10 +14617,10 @@ msgid "OpenCycleMap"
 msgstr "OpenCycleMap"
 
 msgid "OpenSeaMap"
-msgstr ""
+msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (标准图层)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik 黑白)"
@@ -14632,13 +14629,13 @@ msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik,无标签)"
 
 msgid "OpenStreetMap (French Style)"
-msgstr ""
+msgstr "OpenStreetMap (法国样式)"
 
 msgid "OpenStreetMap (German Style)"
 msgstr "OpenStreetMap (德国样式)"
 
 msgid "OpenStreetMap GPS Traces"
-msgstr "OSM GPS轨迹"
+msgstr "OSM GPS 轨迹"
 
 msgid "MapQuest OSM"
 msgstr "MapQuest OSM"
@@ -14656,7 +14653,7 @@ msgid "Cambodia, Laos, Thailand, Vietnam bilingual"
 msgstr "柬埔寨、老挝、泰国、越南多语言"
 
 msgid "OpenPT Map (overlay)"
-msgstr "OpenPT Map (叠加层)"
+msgstr "OpenPT Map (叠加层)"
 
 msgid "Strava cycling heatmap"
 msgstr "Strava自行车热力图"
@@ -14664,29 +14661,32 @@ msgstr "Strava自行车热力图"
 msgid "Strava running heatmap"
 msgstr "Strava跑步热力图"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr "定位符叠加层"
 
 msgid "QA No Address"
-msgstr "质量控制(QA):无地址"
+msgstr "质量控制(QA)地址"
 
 msgid "Waymarked Trails: Hiking"
-msgstr ""
+msgstr "路标路线:步行"
 
 msgid "Waymarked Trails: Cycling"
-msgstr ""
+msgstr "路标路线:自行车"
 
 msgid "Waymarked Trails: MTB"
-msgstr ""
+msgstr "路标路线:摩托车"
 
 msgid "Waymarked Trails: Skating"
-msgstr ""
+msgstr "路标路线:滑冰"
 
 msgid "Waymarked Trails: Horse Riding"
-msgstr ""
+msgstr "路标路线:骑马"
 
 msgid "Waymarked Trails: Winter Sports"
-msgstr ""
+msgstr "路标路线:冬季运动"
 
 msgid "OSM Inspector: Geometry"
 msgstr "OSM 检查器:几何"
@@ -14904,7 +14904,7 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15327,16 +15327,16 @@ msgid "ScanEx SPOT"
 msgstr ""
 
 msgid "Freemap.sk Car"
-msgstr ""
+msgstr "Freemap.sk 汽车"
 
 msgid "Freemap.sk Hiking"
-msgstr ""
+msgstr "Freemap.sk 步行"
 
 msgid "Freemap.sk Cyclo"
-msgstr ""
+msgstr "Freemap.sk 自行车"
 
 msgid "Freemap.sk Ski"
-msgstr ""
+msgstr "Freemap.sk 滑雪"
 
 msgid "Katastrálna mapa Slovenska (KaPor, 2010-04)"
 msgstr ""
@@ -15447,13 +15447,13 @@ msgid "Fiez Orthophoto 2013"
 msgstr ""
 
 msgid "Taiwan e-Map Open Data"
-msgstr ""
+msgstr "台湾电子地图开放数据"
 
 msgid "Taiwan e-Map Open Data (with Contour Line)"
-msgstr ""
+msgstr "台湾电子地图开放数据(带等高线)"
 
 msgid "Taiwan Village Boundaries"
-msgstr ""
+msgstr "台湾村界"
 
 msgid "Taiwan Land-Section Data"
 msgstr ""
@@ -15528,232 +15528,232 @@ msgid "OS 1:25k historic (OSM-Limited)"
 msgstr ""
 
 msgid "OS Scottish Popular historic"
-msgstr ""
+msgstr "OS 苏格兰著名历史景点"
 
 msgid "NLS - Bartholomew Half Inch, 1897-1907"
 msgstr ""
 
 msgid "OS Town Plans, Aberdeen 1866-1867 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,阿伯丁(Aberdeen) 1866-1867 (NLS)"
 
 msgid "OS Town Plans, Airdrie 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,艾尔德里(Airdrie) 1858 (NLS)"
 
 msgid "OS Town Plans, Alexandria 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,亚历山大(Alexandria) 1859 (NLS)"
 
 msgid "OS Town Plans, Alloa 1861-1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,阿洛厄(Alloa) 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Annan 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,安南(Annan) 1859 (NLS)"
 
 msgid "OS Town Plans, Arbroath 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,阿布罗斯(Arbroath) 1858 (NLS)"
 
 msgid "OS Town Plans, Ayr 1855 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,埃尔(Ayr) 1855 (NLS)"
 
 msgid "OS Town Plans, Berwick-upon-Tweed 1852 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,特威德河畔贝里克(Berwick-upon-Tweed) 1852 (NLS)"
 
 msgid "OS Town Plans, Brechin 1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,布里金(Brechin) 1862 (NLS)"
 
 msgid "OS Town Plans, Burntisland 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,本泰兰(Burntisland) 1894 (NLS)"
 
 msgid "OS Town Plans, Campbelton 1865 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,堪布尔顿(Campbelton) 1865 (NLS)"
 
 msgid "OS Town Plans, Coatbridge 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,科特布里奇(Coatbridge) 1858 (NLS)"
 
 msgid "OS Town Plans, Cupar 1854 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,库珀(Cupar) 1854 (NLS)"
 
 msgid "OS Town Plans, Cupar 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,库珀(Cupar) 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1852 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,达尔基斯(Dalkeith) 1852 (NLS)"
 
 msgid "OS Town Plans, Dalkeith 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,达尔基斯(Dalkeith) 1893 (NLS)"
 
 msgid "OS Town Plans, Dumbarton 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,敦巴顿(Dumbarton) 1859 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1850 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓弗里斯(Dumfries) 1850 (NLS)"
 
 msgid "OS Town Plans, Dumfries 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓弗里斯(Dumfries) 1893 (NLS)"
 
 msgid "OS Town Plans, Dundee 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓迪(Dundee) 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Dundee 1870-1872 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓迪(Dundee) 1870-1872 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1854 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓弗姆林(Dunfermline) 1854 (NLS)"
 
 msgid "OS Town Plans, Dunfermline 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,邓弗姆林(Dunfermline) 1894 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1849-1851 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,爱丁堡(Edinburgh) 1849-1851 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1876-1877 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,爱丁堡(Edinburgh) 1876-1877 (NLS)"
 
 msgid "OS Town Plans, Edinburgh 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,爱丁堡(Edinburgh) 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Elgin 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,埃尔金(Elgin) 1868 (NLS)"
 
 msgid "OS Town Plans, Falkirk 1858-1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,福尔柯克(Falkirk) 1858-1859 (NLS)"
 
 msgid "OS Town Plans, Forfar 1860-1861 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,福弗尔(Forfar) 1860-1861 (NLS)"
 
 msgid "OS Town Plans, Forres 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,福里斯(Forres) 1868 (NLS)"
 
 msgid "OS Town Plans, Galashiels 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,加拉希尔斯(Galashiels) 1858 (NLS)"
 
 msgid "OS Town Plans, Girvan 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,格文(Girvan) 1857 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,格拉斯哥(Glasgow) 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Glasgow 1892-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,格拉斯哥(Glasgow) 1892-1894 (NLS)"
 
 msgid "OS Town Plans, Greenock 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,格里诺克(Greenock) 1857 (NLS)"
 
 msgid "OS Town Plans, Haddington 1853 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,哈丁顿(Haddington) 1853 (NLS)"
 
 msgid "OS Town Plans, Haddington 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,哈丁顿(Haddington) 1893 (NLS)"
 
 msgid "OS Town Plans, Hamilton 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,汉密尔顿(Hamilton) 1858 (NLS)"
 
 msgid "OS Town Plans, Hawick 1857-1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,霍伊克(Hawick) 1857-1858 (NLS)"
 
 msgid "OS Town Plans, Inverness 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,因弗内斯(Inverness) 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Irvine 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,尔湾(Irvine) 1859 (NLS)"
 
 msgid "OS Town Plans, Jedburgh 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,杰德堡(Jedburgh) 1858 (NLS)"
 
 msgid "OS Town Plans, Kelso 1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,凯尔索(Kelso) 1857 (NLS)"
 
 msgid "OS Town Plans, Kilmarnock 1857-1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,基尔马诺克(Kilmarnock) 1857-1859 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1855 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,柯科迪(Kirkcaldy) 1855 (NLS)"
 
 msgid "OS Town Plans, Kirkcaldy 1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,柯科迪(Kirkcaldy) 1894 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1850 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,柯库布里(Kirkcudbright) 1850 (NLS)"
 
 msgid "OS Town Plans, Kirkcudbright 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,柯库布里(Kirkcudbright) 1893 (NLS)"
 
 msgid "OS Town Plans, Kirkintilloch 1859 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,柯金蒂洛赫(Kirkintilloch) 1859 (NLS)"
 
 msgid "OS Town Plans, Kirriemuir 1861 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,基里缪尔(Kirriemuir) 1861 (NLS)"
 
 msgid "OS Town Plans, Lanark 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,拉纳克(Lanark) 1858 (NLS)"
 
 msgid "OS Town Plans, Linlithgow 1856 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,林利斯戈(Linlithgow) 1856 (NLS)"
 
 msgid "OS Town Plans, Mayole 1856-1857 (NLS)"
 msgstr ""
 
 msgid "OS Town Plans, Montrose 1861-1862 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,蒙特罗斯(Montrose) 1861-1862 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1853 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,马瑟尔堡(Musselburgh) 1853 (NLS)"
 
 msgid "OS Town Plans, Musselburgh 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,马瑟尔堡(Musselburgh) 1893 (NLS)"
 
 msgid "OS Town Plans, Nairn 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,奈恩(Nairn) 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Oban 1867-1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,奥本(Oban) 1867-1868 (NLS)"
 
 msgid "OS Town Plans, Paisley 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,佩斯利(Paisley) 1858 (NLS)"
 
 msgid "OS Town Plans, Peebles 1856 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,皮布尔斯(Peebles) 1856 (NLS)"
 
 msgid "OS Town Plans, Perth 1860 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,珀斯(Perth) 1860 (NLS)"
 
 msgid "OS Town Plans, Peterhead 1868 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,彼得黑德(Peterhead) 1868 (NLS)"
 
 msgid "OS Town Plans, Port Glasgow 1856-1857 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,格拉斯哥港(Port Glasgow) 1856-1857 (NLS)"
 
 msgid "OS Town Plans, Portobello 1893-1894 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,波托贝洛(Portobello) 1893-1894 (NLS)"
 
 msgid "OS Town Plans, Rothesay 1862-1863 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,罗斯西(Rothesay) 1862-1863 (NLS)"
 
 msgid "OS Town Plans, Selkirk 1865 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,塞尔扣克(Selkirk) 1865 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1854 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,圣安德鲁斯(St Andrews) 1854 (NLS)"
 
 msgid "OS Town Plans, St Andrews 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,圣安德鲁斯(St Andrews) 1893 (NLS)"
 
 msgid "OS Town Plans, Stirling 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯特林(Stirling) 1858 (NLS)"
 
 msgid "OS Town Plans, Stonehaven 1864 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯通黑文(Stonehaven) 1864 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1847 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯特兰拉尔(Stranraer) 1847 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1863-1877 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯特兰拉尔(Stranraer) 1863-1877 (NLS)"
 
 msgid "OS Town Plans, Stranraer 1893 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯特兰拉尔(Stranraer) 1893 (NLS)"
 
 msgid "OS Town Plans, Strathaven 1858 (NLS)"
-msgstr ""
+msgstr "OS Town Plans,斯特雷文(Strathaven) 1858 (NLS)"
 
 msgid "OS Town Plans, Wick 1872 (NLS)"
 msgstr "OS Town Plans,维克(Wick) 1872 (NLS)"
@@ -15780,12 +15780,12 @@ msgstr "将选定的两条路径区段形成平行线,以选定的中心轴来
 msgid ""
 "Provides Apache Commons library components. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
-msgstr "提供Apache Commons库组件。不应由用户直接安装,而是作为其他插件的依赖项安装。"
+msgstr "提供 Apache Commons 库组件。不应由用户直接安装,而是作为其他插件的依赖。"
 
 msgid ""
 "Provides Apache HTTP library. Not meant to be installed directly by users, "
 "but rather as a dependency for other plugins."
-msgstr "提供Apache HTTP库。不应由用户直接安装,而是作为其他插件的依赖项安装。"
+msgstr "提供 Apache HTTP 库。不应由用户直接安装,而是作为其他插件的依赖。"
 
 msgid ""
 "Allows selection of areas in an layer and automatic creation of a way as "
@@ -15810,6 +15810,8 @@ msgid ""
 "white background with matching colors for better visibility in bright "
 "sunlight. See dialog in display preferences."
 msgstr ""
+"允许用户创建不同的配色方案,并在其之间进行切换。只需要更改颜色并创建一个新方案。可用于在明亮的阳光下切换到白色背景及相应能见度更佳的颜色。参见显示首选项对"
+"话框。"
 
 msgid ""
 "Imports proprietary CSV files of the Columbus/Visiontac V-900 GPS logger "
@@ -15825,13 +15827,13 @@ msgid "(Warning: Experimental!) Tool for conflating (merging) data."
 msgstr "(警告:实验性!)用于冲突(合并)数据的工具。"
 
 msgid "Downloads new data when you pan/zoom"
-msgstr ""
+msgstr "平移/缩放时下载新的数据"
 
 msgid "Create a grid of ways."
 msgstr "建立路径的格线。"
 
 msgid "Customization of public transport stops."
-msgstr ""
+msgstr "自定义公共交通车站。"
 
 msgid ""
 "Creating and handling address nodes and buildings within Czech Republic."
@@ -15861,7 +15863,7 @@ msgstr "允许用户非常快速的隐藏时间戳记,并删除大量 GPX 轨
 msgid ""
 "Provides the EJML library for other JOSM plugins. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
-msgstr ""
+msgstr "为其他 JOSM 插件提供 EJML 库。不应由用户直接安装,而是作为其他插件的依赖。"
 
 msgid "Shows the elevation profile and some statistical data of a GPX track."
 msgstr "显示 GPX 轨迹的海拔设定和一些统计数据。"
@@ -15882,10 +15884,13 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr "与周围正在编辑地图的用户交流,当有人靠近时会显示通知。"
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
-msgstr "为其他 JOSM 插件提供 GeoTools 库。这并不意味着要由用户直接安装,而是作为其他插件的一个依赖。"
+msgstr "为其他 JOSM 插件提供 GeoTools 库。不应由用户直接安装,而是作为其他插件的依赖。"
 
 msgid ""
 "Download GPS points from Globalsat dg100 data logger directly in JOSM."
@@ -15904,7 +15909,7 @@ msgstr "以路线图显示视觉化路线信息。"
 msgid ""
 "Provides the GSON library for other JOSM plugins. Not meant to be installed "
 "directly by users, but rather as a dependency for other plugins."
-msgstr ""
+msgstr "为其他 JOSM 插件提供 GSON 库。不应由用户直接安装,而是作为其他插件的依赖。"
 
 msgid "Simple tool to tag house numbers."
 msgstr "标记门牌号码的简单工具。"
@@ -15933,12 +15938,12 @@ msgid "Import vector graphics (SVG)"
 msgstr "导入矢量图形(SVG)"
 
 msgid "This plugin simplifies the mapping and editing of indoor corridors."
-msgstr ""
+msgstr "此插件简化室内走廊的绘制和编辑。"
 
 msgid ""
 "Gives assistance for the mapping process of indoor OSM building data. "
 "Includes a validator and a mappaint style for indoor-data."
-msgstr ""
+msgstr "辅助室内建筑 OSM 数据的绘制。包含室内数据的验证器和 MapPoint 样式。"
 
 msgid ""
 "Extra information about current layer objects pop ups - currently GPX "
@@ -15983,7 +15988,7 @@ msgid ""
 msgstr ""
 
 msgid "Allows the user to work with pictures hosted at mapillary.com"
-msgstr ""
+msgstr "可使用户用 mapillary.com 上的图片工作"
 
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
@@ -15998,7 +16003,7 @@ msgid "Adds no left turn for sets of 4 or 5 ways"
 msgstr "为 4 或 5 条路径添加禁止左转"
 
 msgid "Allows to attribute tags to all objects in any selected area at once"
-msgstr "允许在任何选定区域中,一次性给所有的对象添加标签"
+msgstr "可在任何选定区域中,一次性给所有的对象添加标签"
 
 msgid "NanoLog adjustment and browsing layer"
 msgstr ""
@@ -16030,15 +16035,15 @@ msgstr "启动 FireFox 将目前可见的画面显示为很好的 SVG 图片。"
 msgid ""
 "Bring in errors from Osm Inspector and display it on the current JOSM "
 "bounding box"
-msgstr ""
+msgstr "从 OSM 检查器获取错误,并在当前的J OSM 边框中显示"
 
 msgid ""
 "Recommends categories/tags on newly created OSM entities by analysing "
 "spatial entities into training features and using SVM classification"
-msgstr ""
+msgstr "分析空间实体到训练的特征并使用 SVM 分类,为新创建的 OSM 实体推荐类别/标签"
 
 msgid "Import/export OSM data in PBF format"
-msgstr ""
+msgstr "导入/导出 OSM 数据为 PBF 格式"
 
 msgid "Import PDF file and convert to ways."
 msgstr "导入 PDF 文件并转换为路径。"
@@ -16049,7 +16054,7 @@ msgid ""
 msgstr "将 gps 地点信息写入图片文件的文件头。在图片图层按右键菜单就可以执行这项功能。"
 
 msgid "Make photos movable and position them on the map."
-msgstr ""
+msgstr "使照片可移动,并放置在地图上。"
 
 msgid ""
 "This plugin allows to display any picture as a background in the editor and "
@@ -16062,7 +16067,7 @@ msgstr "超棒的 JGoodies 塑胶外观与感觉。"
 msgid ""
 "Shows an additional information about point on map. There is only a Czech "
 "RUIAN module available at this moment."
-msgstr ""
+msgstr "显示地图上一点的额外信息。目前仅捷克 RUIAN 模块可用。"
 
 msgid "Read and write osmosis poly filter files"
 msgstr ""
@@ -16083,7 +16088,7 @@ msgid ""
 msgstr "这个插件简化了公共交通路线的制图与编辑。"
 
 msgid "Displays stops of selected public transport routes as graph"
-msgstr ""
+msgstr "将所选的公共交通路线显示为图表"
 
 msgid ""
 "The RasterFiltersPlugin allows to choose and apply some images'' filters to "
@@ -16101,7 +16106,7 @@ msgid ""
 "can be opened by clicking a small icon in the upper right corner of the "
 "properties window. Available country presets: Belgium, Germany, Poland, "
 "Slovakia, Spain."
-msgstr ""
+msgstr "基于路标选择对象标签的插件。对话框可以通过单击属性窗口右上角的小图标打开。现有的国家预设:比利时,德国,波兰,斯洛伐克,西班牙。"
 
 msgid ""
 "Renders routes (bus, hiking trails, bicycle routes, ..). Route types must be "
@@ -16129,15 +16134,15 @@ msgid "Edit features for OpenSeaMap"
 msgstr "OpenSeaMap 的编辑功能"
 
 msgid "Allows to draw splines"
-msgstr ""
+msgstr "可绘制样条曲线"
 
 msgid ""
 "Allows to edit traffic information and export it to the urban mobility "
 "simulator SUMO"
-msgstr ""
+msgstr "可编辑路况信息,并将其导出到城市交通仿真器 SUMO"
 
 msgid "Allow adding markers/nodes on current gps positions."
-msgstr "允许在目前的 gps 位置添加标记/节点。"
+msgstr "可在目前的 gps 位置添加标记/节点。"
 
 msgid ""
 "Launch browser to a Web resource about a selected object having known tags, "
@@ -16151,7 +16156,7 @@ msgid ""
 "Adds a tagging preset tester to the windows menu, which helps you developing "
 "of tagging presets (quick preview of the dialog that will popup). You can "
 "start the jar-file as standalone as well."
-msgstr ""
+msgstr "添加标签预设组合测试器到窗口菜单,可帮助您开发预设组合标记框(快速预览将会弹出的对话框)。您也可以独立启动此 jar 文件。"
 
 msgid "Make terraced houses out of single blocks."
 msgstr "让连栋房屋能超出单一区块。"
@@ -16159,7 +16164,7 @@ msgstr "让连栋房屋能超出单一区块。"
 msgid ""
 "Integrate to-fix http://osmlab.github.io/to-fix/ into JOSM to repair errors "
 "in OpenStreetMap"
-msgstr ""
+msgstr "集成 http://osmlab.github.io/to-fix/ 的补丁到 JOSM,以修复 OpenStreetMap 中的错误"
 
 msgid ""
 "Provides helper buttons to allow working with single button mouse (stylus). "
@@ -16206,13 +16211,13 @@ msgid ""
 msgstr "支持从 walking-papers.org 下载瓦片式、扫描好的地图。这个插件仍在开发的早期阶段,因此可能有许多程序错误存在。"
 
 msgid "Easy downloading along a long set of interconnected ways"
-msgstr "方便的下载一整组互相联结的路径"
+msgstr "方便下载一整组互相联结的路径"
 
 msgid "Enables searching for waypoint imported from gpx file."
 msgstr "为从 GPX 文件导入的路点打开搜索功能。"
 
 msgid "Simplifies linking OSM objects to Wikipedia articles"
-msgstr ""
+msgstr "简化 OSM 对象到维基百科条目的链接"
 
 msgid ""
 "Drive a race car from point A to point B over aerial imagery, leave cacti "
@@ -16235,10 +16240,10 @@ msgid "concrete"
 msgstr "水泥"
 
 msgid "concrete:plates"
-msgstr ""
+msgstr "水泥:水泥板"
 
 msgid "concrete:lanes"
-msgstr ""
+msgstr "水泥:车辙道"
 
 msgid "paving_stones"
 msgstr "铺路石"
@@ -16359,19 +16364,19 @@ msgid "Lanes"
 msgstr "车道数"
 
 msgid "Lanes in way direction"
-msgstr "沿路径方向车道数量"
+msgstr "顺向车道数"
 
 msgid "Lanes opposed to way direction"
-msgstr "逆路径方向车道数量"
+msgstr "逆向车道数"
 
 msgid "Max. speed (km/h)"
 msgstr "限速(km/h)"
 
 msgid "Max. speed in way direction"
-msgstr "沿路径方向最高限速"
+msgstr "顺向限速"
 
 msgid "Max. speed opposed to way direction"
-msgstr "逆路径方向最高限速"
+msgstr "逆向限速"
 
 msgid "Bridge"
 msgstr "桥梁"
@@ -16441,7 +16446,7 @@ msgid "spur"
 msgstr "专用线"
 
 msgid "crossover"
-msgstr ""
+msgstr "渡线"
 
 msgid "Electrified"
 msgstr "电气化"
@@ -16774,11 +16779,11 @@ msgstr "航模"
 
 msgctxt "sport"
 msgid "motocross"
-msgstr ""
+msgstr "摩托车越野"
 
 msgctxt "sport"
 msgid "motor"
-msgstr ""
+msgstr "摩托车"
 
 msgctxt "sport"
 msgid "pelota"
@@ -16786,27 +16791,27 @@ msgstr "回力球"
 
 msgctxt "sport"
 msgid "racquet"
-msgstr ""
+msgstr "球拍"
 
 msgctxt "sport"
 msgid "rc_car"
-msgstr ""
+msgstr "遥控模型车"
 
 msgctxt "sport"
 msgid "rugby_league"
-msgstr ""
+msgstr "橄榄球联盟"
 
 msgctxt "sport"
 msgid "rugby_union"
-msgstr ""
+msgstr "橄榄球联合"
 
 msgctxt "sport"
 msgid "running"
-msgstr ""
+msgstr "赛跑"
 
 msgctxt "sport"
 msgid "safety_training"
-msgstr ""
+msgstr "安全培训"
 
 msgctxt "sport"
 msgid "shooting"
@@ -16818,11 +16823,11 @@ msgstr "滑板"
 
 msgctxt "sport"
 msgid "ice_skating"
-msgstr ""
+msgstr "滑冰"
 
 msgctxt "sport"
 msgid "roller_skating"
-msgstr ""
+msgstr "轮滑"
 
 msgctxt "sport"
 msgid "soccer"
@@ -16866,7 +16871,7 @@ msgstr "五月-九月 09:30-12:30,14:15-19:30"
 
 msgctxt "parking"
 msgid "multi-storey"
-msgstr ""
+msgstr "多层"
 
 msgctxt "parking"
 msgid "surface"
@@ -17187,7 +17192,7 @@ msgid "Seasonal"
 msgstr "季节性"
 
 msgid "In the tidal range"
-msgstr ""
+msgstr "在涨潮区内"
 
 msgid "culvert"
 msgstr "暗渠"
@@ -17211,7 +17216,7 @@ msgid "Canoe"
 msgstr "独木舟"
 
 msgid "Substance"
-msgstr ""
+msgstr "物质"
 
 msgid "water"
 msgstr "水域"
@@ -17316,40 +17321,40 @@ msgid "Destination"
 msgstr "目的地"
 
 msgid "Destination reference"
-msgstr ""
+msgstr "目的地编号"
 
 msgid "Placement"
-msgstr ""
+msgstr "位置"
 
 msgid "left_of:1"
-msgstr ""
+msgstr "第 1 车道左侧"
 
 msgid "left_of:2"
-msgstr ""
+msgstr "第 2 车道左侧"
 
 msgid "left_of:3"
-msgstr ""
+msgstr "第 3 车道左侧"
 
 msgid "middle_of:1"
-msgstr ""
+msgstr "第 1 车道中心"
 
 msgid "middle_of:2"
-msgstr ""
+msgstr "第 2 车道中心"
 
 msgid "middle_of:3"
-msgstr "路径位于左起第3条车道中心线"
+msgstr "第 3 车道中心"
 
 msgid "right_of:1"
-msgstr "路径位于左起第1条车道右边缘"
+msgstr "第 1 车道右侧"
 
 msgid "right_of:2"
-msgstr "路径位于左起第2条车道右边缘"
+msgstr "第 2 车道右侧"
 
 msgid "right_of:3"
-msgstr "路径位于左起第2条车道右边缘"
+msgstr "第 3 车道右侧"
 
 msgid "transition"
-msgstr "路径位于道路宽度过渡段"
+msgstr "过渡"
 
 msgid "Motorway Link"
 msgstr "高速公路连络线"
@@ -17385,7 +17390,7 @@ msgid "Tertiary Link"
 msgstr "三级道路连络线"
 
 msgid "Unclassified"
-msgstr "未分类道路"
+msgstr "未分类道路(Unclassified)"
 
 msgid "Street has no name"
 msgstr "未命名道路"
@@ -17561,7 +17566,7 @@ msgstr "道路限制"
 msgid ""
 "Some road types already imply some access restrictions which should not be "
 "set again."
-msgstr ""
+msgstr "某些道路类型已隐含一些访问限制,不应再设置。"
 
 msgid "No exit (cul-de-sac)"
 msgstr "没有出口(死路)"
@@ -17609,7 +17614,7 @@ msgid "Tourist buses"
 msgstr "旅游巴士"
 
 msgid "Max. speed Heavy Goods Vehicles (km/h)"
-msgstr ""
+msgstr "重型货车限速(km/h)"
 
 msgid "Min. speed (km/h)"
 msgstr "最低速度(km/h)"
@@ -17665,18 +17670,33 @@ msgstr "路辙类型"
 msgid "grade1"
 msgstr "第一级"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr "固:有铺面或压实的表面"
+
 msgid "grade2"
 msgstr "第二级"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr "近固:混有软质材料的砾石/岩石"
+
 msgid "grade3"
 msgstr "第三级"
 
+msgid "Even mixture of hard and soft materials"
+msgstr "软硬物质的均匀混合物"
+
 msgid "grade4"
 msgstr "第四级"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr "近软:混有硬质材料的土/沙/草"
+
 msgid "grade5"
 msgstr "第五级"
 
+msgid "Soft: soil/sand/grass"
+msgstr "软:土/沙/草"
+
 msgid "MTB Scale"
 msgstr "MTB 比例"
 
@@ -17701,16 +17721,16 @@ msgid ""
 msgstr "有连续印记和持续上坡的步道。部分地势陡峭,有摔伤的危险"
 
 msgid "T3 - difficult, exposed hiking trail"
-msgstr "T3 - 艰难,裸露步道"
+msgstr "T3 - 艰难、裸露步道"
 
 msgid ""
 "exposed sites may be secured with ropes or chains, possible need to use "
 "hands for balance. Partly exposed sites with fall hazard, scree, pathless "
 "jagged rocks"
-msgstr ""
+msgstr "裸露区域有绳子或链条,可能需要用手保持平衡。部分裸露区域有摔伤、落石的危险,或为无路的乱石区"
 
 msgid "T4 - difficult, exposed, steep alpine trail"
-msgstr "T4 - 艰难,裸露,陡峭的高山步道"
+msgstr "T4 - 艰难、裸露、陡峭的高山步道"
 
 msgid ""
 "sometimes need for hand use to get ahead. Terrain quite exposed, precarious "
@@ -17770,7 +17790,7 @@ msgid "Dedicated Bridleway"
 msgstr "专用马道"
 
 msgid "Cycle Lane/Track"
-msgstr ""
+msgstr "自行车道/车径"
 
 msgid "Cycleway"
 msgstr "自行车路"
@@ -17779,13 +17799,13 @@ msgid "lane"
 msgstr "车道"
 
 msgid "track"
-msgstr "轨迹"
+msgstr "车径"
 
 msgid "opposite_lane"
-msgstr ""
+msgstr "对向车道"
 
 msgid "opposite_track"
-msgstr ""
+msgstr "对向车径"
 
 msgid "opposite"
 msgstr "反向"
@@ -17824,15 +17844,15 @@ msgid "Combined Foot- and Cycleway"
 msgstr "合并的步道与自行车道"
 
 msgid "Dedicated Footway"
-msgstr "专用人行步道"
+msgstr "专用步道"
 
 msgctxt "footway"
 msgid "sidewalk"
-msgstr ""
+msgstr "人行道"
 
 msgctxt "footway"
 msgid "crossing"
-msgstr ""
+msgstr "路口"
 
 msgid "Steps"
 msgstr "楼梯"
@@ -17916,7 +17936,7 @@ msgid "Pedestrian crossing type"
 msgstr "人行横道类型"
 
 msgid "uncontrolled"
-msgstr "没有信号灯"
+msgstr "无信号灯"
 
 msgid "traffic_signals"
 msgstr "信号灯"
@@ -17964,7 +17984,7 @@ msgid "Cross on horseback"
 msgstr "骑马穿越"
 
 msgid "Optional values for specific countries"
-msgstr ""
+msgstr "针对特定国家的可选值"
 
 msgid "Stop"
 msgstr "停车让行"
@@ -18050,12 +18070,12 @@ msgstr "距离(公里)"
 
 msgctxt "junction=yes"
 msgid "Named Junction"
-msgstr ""
+msgstr "命名路口"
 
 msgid ""
 "Used in some countries for a named road junction who’s name serves for local "
 "orientation."
-msgstr ""
+msgstr "在某些国家中,命名路口的名称作为地名使用。"
 
 msgid "Elevator"
 msgstr "电梯"
@@ -18130,10 +18150,10 @@ msgid "Fence"
 msgstr "围栏"
 
 msgid "barbed_wire"
-msgstr "铁丝网"
+msgstr "刺钢丝"
 
 msgid "chain_link"
-msgstr ""
+msgstr "铁丝网"
 
 msgid "electric"
 msgstr "电"
@@ -18154,7 +18174,7 @@ msgid "Wall"
 msgstr "墙"
 
 msgid "dry_stone"
-msgstr ""
+msgstr "砌石"
 
 msgid "noise_barrier"
 msgstr "声屏障"
@@ -18166,7 +18186,7 @@ msgid "Retaining Wall"
 msgstr "挡土墙"
 
 msgid "Jersey Barrier"
-msgstr "泽西式道路中央分隔带"
+msgstr "新泽西护栏(凸形隔离栏)"
 
 msgctxt "Barrier"
 msgid "Ditch"
@@ -18176,10 +18196,10 @@ msgid "Kerb"
 msgstr "路缘石"
 
 msgid "Tactile paving"
-msgstr ""
+msgstr "盲道"
 
 msgid "Entrance (Barrier Opening)"
-msgstr "入口(围栏缺口)"
+msgstr "入口(围栏缺口)"
 
 msgid "Gate"
 msgstr "门"
@@ -18382,13 +18402,13 @@ msgid "mangrove"
 msgstr "红树林"
 
 msgid "wet_meadow"
-msgstr ""
+msgstr "湿草甸"
 
 msgid "string_bog"
 msgstr ""
 
 msgid "saltern"
-msgstr ""
+msgstr "盐场"
 
 msgid "Mud"
 msgstr "泥浆地"
@@ -18406,7 +18426,7 @@ msgid "swimming"
 msgstr "游泳"
 
 msgid "surfing"
-msgstr ""
+msgstr "冲浪"
 
 msgid "Bay"
 msgstr "海湾"
@@ -18511,7 +18531,7 @@ msgid "Shell"
 msgstr "壳牌(Shell)"
 
 msgid "Socar"
-msgstr ""
+msgstr "阿塞拜疆石油公司(Socar)"
 
 msgid "Statoil"
 msgstr "挪威国家石油(Statoil)"
@@ -18574,13 +18594,13 @@ msgid "Pier"
 msgstr "渡头"
 
 msgid "Mooring"
-msgstr ""
+msgstr "停泊处"
 
 msgid "commercial"
-msgstr ""
+msgstr "商业"
 
 msgid "Floating"
-msgstr ""
+msgstr "浮船坞"
 
 msgid "Lock Gate"
 msgstr "水闸"
@@ -18738,7 +18758,7 @@ msgid "Mixed Lift"
 msgstr "混合式缆车"
 
 msgid "Number of people per gondola/chair"
-msgstr ""
+msgstr "每厢/椅的人数"
 
 msgid "Drag Lift"
 msgstr "拖曳升降机"
@@ -18746,7 +18766,7 @@ msgstr "拖曳升降机"
 msgid ""
 "drag_lift (general type - use only if exact type (see values below) is "
 "unknown)"
-msgstr ""
+msgstr "拖曳(通用 - 仅当确切类型(见下值)未知时使用)"
 
 msgid "t-bar"
 msgstr ""
@@ -18866,6 +18886,72 @@ msgstr "电压"
 msgid "Amperage"
 msgstr "安"
 
+msgid "Types of vehicles which can be charged:"
+msgstr "可充电车辆类型:"
+
+msgid "Scooter"
+msgstr "摩托车"
+
+msgid "Truck"
+msgstr "卡车"
+
+msgid "Number of Sockets:"
+msgstr "插座数:"
+
+msgid "Type 1 (Yazaki)"
+msgstr "1 型(矢崎)"
+
+msgid "Type 1 Combo"
+msgstr "1 型组合"
+
+msgid "Type 2 (Mennekes)"
+msgstr "2 型(曼奈柯斯)"
+
+msgid "Type 2 Combo"
+msgstr "2 型组合"
+
+msgid "Type 3 (SCAME)"
+msgstr "3 型(SCAME)"
+
+msgid "CHAdeMO"
+msgstr "CHAdeMO"
+
+msgid "Tesla Supercharger"
+msgstr "特斯拉超级充电器"
+
+msgid "Schuko"
+msgstr "Schuko(德式插头)"
+
+msgid "CEE blue"
+msgstr "CEE 蓝"
+
+msgid "CEE red 16A"
+msgstr "CEE 红 16A"
+
+msgid "CEE red 32A"
+msgstr "CEE 红 32A"
+
+msgid "NEMA 5-15"
+msgstr "NEMA 5-15"
+
+msgid "NEMA 5-20"
+msgstr "NEMA 5-20"
+
+msgid "Authentication:"
+msgstr "身份验证:"
+
+msgid "Phone call"
+msgstr "电话"
+
+msgid "Short message"
+msgstr "短信"
+
+msgid "NFC"
+msgstr "NFC"
+
+msgid "Membership card"
+msgstr "会员卡"
+
 msgid "Wash"
 msgstr "洗车"
 
@@ -18906,7 +18992,7 @@ msgid "brand"
 msgstr "品牌"
 
 msgid "oldtimer"
-msgstr "过时的"
+msgstr "古董"
 
 msgid "Safety inspection"
 msgstr "安全检查"
@@ -18933,7 +19019,7 @@ msgid "ground_slots"
 msgstr ""
 
 msgid "informal"
-msgstr ""
+msgstr "非正式"
 
 msgid "lockers"
 msgstr ""
@@ -18987,7 +19073,7 @@ msgid "Public Transport"
 msgstr "公共交通"
 
 msgid "Public Transport Route (Rail)"
-msgstr ""
+msgstr "公共交通路线(铁路)"
 
 msgid "Route type"
 msgstr "路线类型"
@@ -19023,7 +19109,7 @@ msgid "route segment"
 msgstr "路线区段"
 
 msgid "Public Transport Route (Bus)"
-msgstr ""
+msgstr "公共交通路线(公交)"
 
 msgid "trolleybus"
 msgstr "电车"
@@ -19038,7 +19124,7 @@ msgid "route variant/direction (at least 2)"
 msgstr ""
 
 msgid "Stop Area"
-msgstr ""
+msgstr "停车区"
 
 msgid "UIC reference"
 msgstr "UIC 编号"
@@ -19070,9 +19156,6 @@ msgstr "电车站(旧式标记)"
 msgid "Train"
 msgstr "火车"
 
-msgid "Railway station (legacy)"
-msgstr "铁路车站(旧式标记)"
-
 msgid "Railway halt (legacy)"
 msgstr "铁路小站(旧式标记)"
 
@@ -19097,15 +19180,6 @@ msgstr "庇护所"
 msgid "Waste Basket/Trash Can"
 msgstr "废纸篓/垃圾箱"
 
-msgid "Highway platform (legacy)"
-msgstr "公路站台(旧式标记)"
-
-msgid "Railway platform (legacy)"
-msgstr "铁路站台(旧式标记)"
-
-msgid "funicular"
-msgstr "缆车"
-
 msgctxt "railway"
 msgid "Station"
 msgstr "车站"
@@ -19234,7 +19308,7 @@ msgid "Motel"
 msgstr "汽车旅馆"
 
 msgid "Guest House/Bed & Breakfast"
-msgstr "旅舍/ B&B"
+msgstr "旅舍/Bed & Breakfast"
 
 msgid "Chalet"
 msgstr "小木屋"
@@ -19246,7 +19320,7 @@ msgid "Alpine Hut"
 msgstr "高山小屋"
 
 msgid "Wilderness Hut"
-msgstr ""
+msgstr "荒野小屋"
 
 msgid "Access rights"
 msgstr "访问权限"
@@ -19258,16 +19332,16 @@ msgid "seasonal"
 msgstr "时令"
 
 msgid "Reservation"
-msgstr ""
+msgstr "预定"
 
 msgid "required"
-msgstr ""
+msgstr "需要"
 
 msgid "recommended"
-msgstr ""
+msgstr "推荐"
 
 msgid "members_only"
-msgstr ""
+msgstr "仅会员"
 
 msgid "Closer Description"
 msgstr "贴切描述"
@@ -19339,7 +19413,7 @@ msgid "Information Office"
 msgstr "服务中心"
 
 msgid "An office where you can get information about a town or region."
-msgstr ""
+msgstr "可以获得城市或地区信息的办事处。"
 
 msgid "Map"
 msgstr "地图"
@@ -19360,7 +19434,7 @@ msgid "scheme"
 msgstr "设计图"
 
 msgid "toposcope"
-msgstr ""
+msgstr "方位圆盘"
 
 msgid "Shown Area"
 msgstr "显示区域"
@@ -19493,10 +19567,10 @@ msgid "Swimming Pool"
 msgstr "游泳池"
 
 msgid "Used for the water area only."
-msgstr ""
+msgstr "仅用于水域。"
 
 msgid "Fitness Station"
-msgstr ""
+msgstr "健身站"
 
 msgid "Sauna"
 msgstr "桑拿"
@@ -19533,7 +19607,7 @@ msgid "Fishing"
 msgstr "钓鱼"
 
 msgid "Bird Hide"
-msgstr ""
+msgstr "隐蔽观鸟点"
 
 msgid "Night Club"
 msgstr "夜店"
@@ -19578,16 +19652,16 @@ msgid "Artist Name"
 msgstr "艺术家姓名"
 
 msgid "Studio"
-msgstr ""
+msgstr "演播室"
 
 msgid "audio"
 msgstr "音频"
 
 msgid "radio"
-msgstr ""
+msgstr "广播"
 
 msgid "television"
-msgstr ""
+msgstr "电视"
 
 msgid "video"
 msgstr "视频"
@@ -19856,7 +19930,7 @@ msgid "Veterinary"
 msgstr "兽医"
 
 msgid "Emergency"
-msgstr ""
+msgstr "应急"
 
 msgid "Ambulance Station"
 msgstr "急救站"
@@ -19936,7 +20010,7 @@ msgid "Water Tank"
 msgstr "消防水箱"
 
 msgid "Volume (in liters)"
-msgstr "容量(升)"
+msgstr "容量(升)"
 
 msgid "Assembly Point"
 msgstr "会合点"
@@ -19972,22 +20046,22 @@ msgid "civil_defense"
 msgstr "民防/人防"
 
 msgid "Range (in meters)"
-msgstr "射程(米)"
+msgstr "范围(米)"
 
 msgid "Social Facility"
-msgstr ""
+msgstr "社会"
 
 msgid "Nursing Home"
 msgstr "疗养院"
 
 msgid "Group Home"
-msgstr ""
+msgstr "教养院"
 
 msgid "For"
-msgstr ""
+msgstr "为"
 
 msgid "Assisted Living"
-msgstr ""
+msgstr "生活协助"
 
 msgid "Outreach"
 msgstr ""
@@ -20046,7 +20120,7 @@ msgid "Diaper"
 msgstr "尿布"
 
 msgid "room"
-msgstr ""
+msgstr "房间"
 
 msgid "Post Box"
 msgstr "邮筒"
@@ -20259,13 +20333,13 @@ msgid "Lock"
 msgstr "锁"
 
 msgid "Water Point"
-msgstr ""
+msgstr "饮水点"
 
 msgid "Compressed Air"
-msgstr ""
+msgstr "压缩空气"
 
 msgid "Valves"
-msgstr ""
+msgstr "阀"
 
 msgid "Dunlop (Woods)"
 msgstr ""
@@ -22236,7 +22310,7 @@ msgid "Kitchen"
 msgstr "炊具"
 
 msgid "Houseware"
-msgstr ""
+msgstr "家庭用品"
 
 msgid "Curtain"
 msgstr "窗帘"
@@ -22275,7 +22349,7 @@ msgid "Ticket"
 msgstr "车票"
 
 msgid "For the body"
-msgstr ""
+msgstr "用于身体"
 
 msgid "Chemist"
 msgstr "化妆品店"
@@ -22305,7 +22379,7 @@ msgid "Hearing Aids"
 msgstr "助听器"
 
 msgid "Medical Supply"
-msgstr ""
+msgstr "医疗用品"
 
 msgid "Jewellery"
 msgstr "珠宝"
@@ -22395,7 +22469,7 @@ msgid "food"
 msgstr "食物"
 
 msgid "newspapers"
-msgstr ""
+msgstr "报纸"
 
 msgid "parking_tickets"
 msgstr "停车票"
@@ -22410,7 +22484,7 @@ msgid "public_transport_tickets"
 msgstr "公共交通票"
 
 msgid "SIM_cards"
-msgstr ""
+msgstr "SIM 卡"
 
 msgid "stamps"
 msgstr "邮票"
@@ -22633,52 +22707,52 @@ msgid "Photographer"
 msgstr "摄影"
 
 msgid "Metal construction"
-msgstr ""
+msgstr "金工"
 
 msgid "Electrician"
-msgstr ""
+msgstr "电工"
 
 msgid "Brewery"
-msgstr ""
+msgstr "啤酒"
 
 msgid "Plumber"
-msgstr ""
+msgstr "管道"
 
 msgid "Sawmill"
-msgstr ""
+msgstr "锯木"
 
 msgid "Gardener"
 msgstr "园艺"
 
 msgid "Winery"
-msgstr ""
+msgstr "红酒"
 
 msgid "Hvac"
-msgstr ""
+msgstr "暖通空调"
 
 msgid "Painter"
-msgstr ""
+msgstr "漆工"
 
 msgid "Stonemason"
-msgstr ""
+msgstr "石匠"
 
 msgid "Handicraft"
-msgstr ""
+msgstr "手工艺"
 
 msgid "Pottery"
 msgstr "陶艺"
 
 msgid "Key cutter"
-msgstr ""
+msgstr "配锁"
 
 msgid "Caterer"
-msgstr ""
+msgstr "熟食"
 
 msgid "Roofer"
-msgstr ""
+msgstr "屋顶工"
 
 msgid "Beekeeper"
-msgstr ""
+msgstr "养蜂"
 
 msgid "Blacksmith"
 msgstr "铁匠"
@@ -22687,13 +22761,13 @@ msgid "Locksmith"
 msgstr "锁匠"
 
 msgid "Window construction"
-msgstr ""
+msgstr "窗工"
 
 msgid "Upholsterer"
-msgstr ""
+msgstr "家具"
 
 msgid "Tiler"
-msgstr ""
+msgstr "瓦匠"
 
 msgid "Geography"
 msgstr "地理"
@@ -22720,7 +22794,7 @@ msgid "canton"
 msgstr ""
 
 msgid "linguistic_community"
-msgstr ""
+msgstr "语言区"
 
 msgid "ward"
 msgstr ""
@@ -22735,7 +22809,7 @@ msgid "Protected Area"
 msgstr "保护区"
 
 msgid "Protect Class"
-msgstr ""
+msgstr "保护等级"
 
 msgid "Title or type of protection"
 msgstr ""
@@ -22811,13 +22885,13 @@ msgid "Peak"
 msgstr "山峰"
 
 msgid "The top (summit) of a mountain or hill."
-msgstr "山脉或山丘的顶峰"
+msgstr "山脉或山丘的顶峰。"
 
 msgid "Saddle"
 msgstr "鞍部"
 
 msgid "A saddle point between mountains or hills."
-msgstr ""
+msgstr "山脉或山丘的鞍点。"
 
 msgid "Glacier"
 msgstr "冰川"
@@ -22831,25 +22905,25 @@ msgid "Volcano"
 msgstr "火山"
 
 msgid "A volcano, either dormant, extinct or active."
-msgstr "活火山、死火山或休眠火山"
+msgstr "活火山、死火山或休眠火山。"
 
 msgid "Current Status"
-msgstr ""
+msgstr "当前状态"
 
 msgid "dormant"
-msgstr ""
+msgstr "活"
 
 msgid "extinct"
-msgstr ""
+msgstr "死"
 
 msgid "stratovolcano"
-msgstr ""
+msgstr "复式"
 
 msgid "shield"
-msgstr ""
+msgstr "盾状"
 
 msgid "scoria"
-msgstr ""
+msgstr "火山渣"
 
 msgid "Ridge"
 msgstr "山脊"
@@ -22892,9 +22966,6 @@ msgstr "树"
 msgid "A single tree."
 msgstr "单独一棵树。"
 
-msgid "Botanical Name"
-msgstr "植物学名"
-
 msgid "Tree Row"
 msgstr "树排"
 
@@ -22911,15 +22982,15 @@ msgid "Forest"
 msgstr "森林"
 
 msgid "Cutline"
-msgstr "森林内带状的无树区域,如防火带"
+msgstr "无树带"
 
 msgctxt "cutline"
 msgid "border"
-msgstr ""
+msgstr "边界"
 
 msgctxt "cutline"
 msgid "firebreak"
-msgstr "防火隔离带"
+msgstr "防火带"
 
 msgctxt "cutline"
 msgid "hunting"
@@ -22927,15 +22998,15 @@ msgstr ""
 
 msgctxt "cutline"
 msgid "loggingmachine"
-msgstr ""
+msgstr "伐木机"
 
 msgctxt "cutline"
 msgid "pipeline"
-msgstr ""
+msgstr "管道"
 
 msgctxt "cutline"
 msgid "piste"
-msgstr ""
+msgstr "滑雪"
 
 msgctxt "cutline"
 msgid "section"
@@ -23015,26 +23086,26 @@ msgid ""
 msgstr "由裸露的岩石覆盖的区域,植被稀疏或没有植被覆盖"
 
 msgid "Rock"
-msgstr ""
+msgstr "岩体"
 
 msgid ""
 "A notable rock or group of rocks, with at least one of them firmly attached "
 "to the underlying bedrock."
-msgstr ""
+msgstr "单个或一系列巨大的岩块,其中至少有一部分同基岩紧密连接。"
 
 msgid "Tourism attraction"
 msgstr "景点"
 
 msgid "Stone"
-msgstr ""
+msgstr "岩块"
 
 msgid ""
 "A single notable free-standing rock, which may differ from the composition "
 "of the terrain it lies in."
-msgstr ""
+msgstr "单个、独立的岩石,形态可能因地形不同而存在差异。"
 
 msgid "Land use"
-msgstr "土地利用"
+msgstr "土地用途"
 
 msgid "Farmyard"
 msgstr "农家庭院"
@@ -23087,7 +23158,7 @@ msgid "orange_trees"
 msgstr "柑橘"
 
 msgid "almond_trees"
-msgstr ""
+msgstr "扁桃"
 
 msgid "banana_plants"
 msgstr "香蕉"
@@ -23465,7 +23536,7 @@ msgstr ""
 
 msgctxt "note=*, fixme=*, description=*"
 msgid "Similar but different tags:"
-msgstr ""
+msgstr "相似但不同的标签:"
 
 msgctxt "the tag note=*"
 msgid "Note"
@@ -23473,7 +23544,7 @@ msgstr "注释"
 
 msgctxt "note=*"
 msgid "An important hint for other mappers (not for the end user)."
-msgstr "针对其他编辑者的注释(而非浏览地图的终端用户)"
+msgstr "针对其他编辑者的注释(而非浏览地图的终端用户)"
 
 msgid "Fixme"
 msgstr "需修正"
@@ -23482,7 +23553,7 @@ msgctxt "fixme=*"
 msgid ""
 "A hint for other mappers (not for the end user), that an object needs an "
 "improvement."
-msgstr "针对其他编辑者的注释(而非浏览地图的终端用户),表示该对象需要进一步改进"
+msgstr "针对其他编辑者的注释(而非浏览地图的终端用户),表示该对象需要进一步改进"
 
 msgid "outer segment"
 msgstr "外围"
@@ -23662,10 +23733,10 @@ msgid "natural"
 msgstr "自然"
 
 msgid "Walking Route"
-msgstr ""
+msgstr "步行路线"
 
 msgid "Riding Route"
-msgstr ""
+msgstr "骑行路线"
 
 msgid "ihn"
 msgstr ""
@@ -23746,7 +23817,7 @@ msgid "anything related to the street"
 msgstr "任何与街道相关"
 
 msgid "Destination Sign"
-msgstr ""
+msgstr "目的地标志"
 
 msgid "Destination written on sign (w/o distance)"
 msgstr "写于标志上的目的地(和/或距离)"
@@ -23863,40 +23934,40 @@ msgid "Test"
 msgstr "测试"
 
 msgid "Even housenumber in odd address interpolation."
-msgstr ""
+msgstr "奇地址插值中的偶门牌号。"
 
 msgid "Odd housenumber in even address interpolation."
-msgstr ""
+msgstr "偶地址插值中的奇门牌号。"
 
 msgid "Way with {0}. Tag each housenumber separately if possible."
 msgstr ""
 
 msgid "{0} without {1}"
-msgstr ""
+msgstr "{0} 没有 {1}"
 
 msgid "{0} without {1} or {2}"
-msgstr ""
+msgstr "{0} 没有 {1} 或 {2}"
 
 msgid "{0} without {1}, {2} or {3}"
-msgstr ""
+msgstr "{0} 没有 {1}、{2} 或 {3}"
 
 msgid "{0} together with {1}"
-msgstr ""
+msgstr "{0} 带有 {1}"
 
 msgid "incomplete object: only {0}"
-msgstr ""
+msgstr "不完整的对象:只有 {0}"
 
 msgid "incomplete object: only {0} and {1}"
-msgstr ""
+msgstr "不完整的对象:只有 {0} 和 {1}"
 
 msgid "{0} together with addr:*"
-msgstr ""
+msgstr "{0} 带有 addr:*"
 
 msgid "{0} together with {1} and conflicting values"
 msgstr ""
 
 msgid "{0} on suspicious object"
-msgstr ""
+msgstr "{0} 在可疑对象上"
 
 msgid "restaurant without name"
 msgstr "没有名称的餐厅"
@@ -23931,6 +24002,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} 已过时"
 
@@ -23972,7 +24058,7 @@ msgid "{0}={1} is unspecific. Please replace ''{1}'' by a specific value."
 msgstr ""
 
 msgid "{0} should be replaced with {1}"
-msgstr ""
+msgstr "{0} 应替换为 {1}"
 
 msgid "{0} = {1}; remove {0}"
 msgstr ""
@@ -23983,7 +24069,7 @@ msgid ""
 msgstr ""
 
 msgid "Unspecific tag {0}"
-msgstr ""
+msgstr "不具体的标签 {0}"
 
 msgid "Definition of {0} is unclear"
 msgstr ""
@@ -23993,19 +24079,19 @@ msgid ""
 msgstr ""
 
 msgid "key with uncommon character"
-msgstr ""
+msgstr "键值中的生僻字符"
 
 msgid "uncommon short key"
 msgstr ""
 
 msgid "{0} is inaccurate"
-msgstr ""
+msgstr "{0} 不准确"
 
 msgid "{0} is deprecated for {1}"
-msgstr ""
+msgstr "{0} 已被 {1} 取代"
 
 msgid "{0} is deprecated. Use the {1}: key prefix instead."
-msgstr ""
+msgstr "{0} 已过时。应使用 {1}: 键值前缀。"
 
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
@@ -24014,25 +24100,25 @@ msgid "The key {0} has an uncommon value."
 msgstr ""
 
 msgid "{0} on a node. Should be used on a way."
-msgstr ""
+msgstr "{0} 在节点上。应用于路径上。"
 
 msgid "{0} on a node. Should be drawn as an area."
-msgstr ""
+msgstr "{0} 在节点上。应绘为区域。"
 
 msgid "{0}=* on a node. Should be used in a relation"
-msgstr ""
+msgstr "{0}=* 在节点上。应用于关系中。"
 
 msgid "{0} on a way. Should be used on a node."
-msgstr ""
+msgstr "{0} 在路径上。应用于节点上。"
 
 msgid "{0} on a way. Should be used in a relation"
-msgstr ""
+msgstr "{0} 在路径上。应用于关系中。"
 
 msgid "{0} together with {1} on a node. Remove {0}."
 msgstr ""
 
 msgid "{0} on a node"
-msgstr ""
+msgstr "{0} 在节点上"
 
 msgid "Building inside building"
 msgstr "建筑物内的建筑物"
@@ -24044,16 +24130,16 @@ msgid "Overlapping Areas"
 msgstr "重叠的区域"
 
 msgid "{0} inside {1}"
-msgstr ""
+msgstr "{1} 中的 {0}"
 
 msgid "Overlapping Identical Natural Areas"
 msgstr ""
 
 msgid "Overlapping Identical Landuses"
-msgstr ""
+msgstr "重叠的相同土地用途"
 
 msgid "{0} must be connected to a way"
-msgstr ""
+msgstr "{0} 必须与路径相连"
 
 msgid "node connects waterway and bridge"
 msgstr ""
@@ -24071,7 +24157,7 @@ msgid "{0} on a small area"
 msgstr ""
 
 msgid "Too large building"
-msgstr ""
+msgstr "过大的建筑"
 
 msgid ""
 "Node connects a power line or cable with an object which is not related to "
@@ -24083,6 +24169,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "缩写的街道名称"
 
@@ -24102,7 +24191,7 @@ msgid "temporary highway type"
 msgstr "临时公路类型"
 
 msgid "street name contains ss"
-msgstr ""
+msgstr "街道名称中含有 ss"
 
 msgid ""
 "Value of ''{0}'' should either be ''{1}'' or ''{2}''. For sidewalks use "
@@ -24177,16 +24266,16 @@ msgid "{0} relation without {0} tag"
 msgstr ""
 
 msgid "religion without denomination"
-msgstr ""
+msgstr "没有教派的宗教"
 
 msgid "unknown christian denomination"
-msgstr ""
+msgstr "未知基督教教派"
 
 msgid "unknown muslim denomination"
-msgstr ""
+msgstr "未知穆斯林教派"
 
 msgid "unknown jewish denomination"
-msgstr ""
+msgstr "未知犹太教教派"
 
 msgid "{0} is unnecessary"
 msgstr ""
@@ -24195,7 +24284,7 @@ msgid "{0} is unnecessary for {1}"
 msgstr ""
 
 msgid "{0}={1} makes no sense"
-msgstr ""
+msgstr "{0}={1} 无意义"
 
 msgid "Nodes duplicating parent way tags"
 msgstr "节点重复父路径的标签"
@@ -24458,6 +24547,9 @@ msgstr "显示海拔网格图层"
 msgid "Elevation Grid"
 msgstr "海拔网格"
 
+msgid "increase zoom level to see more detail"
+msgstr "缩小以查看更多信息"
+
 msgid "No SRTM data"
 msgstr "无 SRTM 数据"
 
@@ -24741,7 +24833,7 @@ msgid "Selects all addresses with incomplete data."
 msgstr "选择有不完整数据的所有地址。"
 
 msgid "Use tag ''addr:street'' or ''addr:place''"
-msgstr ""
+msgstr "使用标签“addr:street”或“addr:place”"
 
 msgid "House Number Editor"
 msgstr "门牌号编辑器"
@@ -24772,7 +24864,7 @@ msgid "Layer Properties"
 msgstr "图层属性"
 
 msgid "Error while creating image layer: {0}"
-msgstr ""
+msgstr "创建图像图层时发生错误:{0}"
 
 msgid "Import image"
 msgstr "导入图像"
@@ -24781,7 +24873,7 @@ msgid "Import georeferenced image"
 msgstr "导入地理参照图像"
 
 msgid "Error while creating image layer: "
-msgstr "创建图层时发生错误: "
+msgstr "创建图像图层时发生错误: "
 
 msgid "NanoLog"
 msgstr ""
@@ -24793,7 +24885,7 @@ msgid "NanoLog of {0} lines, {1} of them with coordinates."
 msgstr ""
 
 msgid "Correlate with GPX..."
-msgstr ""
+msgstr "与 GPX 关联..."
 
 msgid "Put on GPX..."
 msgstr ""
@@ -24802,22 +24894,22 @@ msgid "Correlate entries with GPS trace"
 msgstr ""
 
 msgid "Save layer..."
-msgstr ""
+msgstr "保存图层..."
 
 msgid "Save NanoLog layer"
-msgstr ""
+msgstr "保存 NanoLog 图层"
 
 msgid "Open NanoLog panel"
 msgstr ""
 
 msgid "Open NanoLog file..."
-msgstr ""
+msgstr "打开 NanoLog 文件..."
 
 msgid "Could not read NanoLog file:"
-msgstr ""
+msgstr "无法读取 NanoLog 文件:"
 
 msgid "OSM Recommendation"
-msgstr ""
+msgstr "OSM 建议"
 
 msgid "Recommend categories to your newly created instances."
 msgstr ""
@@ -24826,22 +24918,22 @@ msgid "Training process configuration"
 msgstr ""
 
 msgid "Model Settings"
-msgstr ""
+msgstr "模型设置"
 
 msgid "Select objects or create new objects and get recommendation."
 msgstr ""
 
 msgid "Add Recommendation"
-msgstr ""
+msgstr "添加建议"
 
 msgid "Add a recommended key/value pair to your object"
-msgstr ""
+msgstr "添加建议的键/值对到您的对象"
 
 msgid "Train a Model"
-msgstr ""
+msgstr "训练模型"
 
 msgid "Start the training engine!"
-msgstr ""
+msgstr "启动训练机!"
 
 msgid "Edit opening hours"
 msgstr "编辑开放时间"
@@ -24880,13 +24972,13 @@ msgid "open end"
 msgstr "开放结束"
 
 msgid "Import Osm Inspector Bugs..."
-msgstr ""
+msgstr "导入 OSM 检查器错误..."
 
 msgid "OsmInspector"
-msgstr ""
+msgstr "OSM 检查器"
 
 msgid "Open OsmInspector"
-msgstr ""
+msgstr "打开 OSM 检查器"
 
 msgid "OsmBugInfo"
 msgstr "OsmBugInfo"
@@ -24904,10 +24996,10 @@ msgid "Next OSMI bug"
 msgstr "后一 OSMI 错误"
 
 msgid "OSM Inspector Bugs"
-msgstr ""
+msgstr "OSM 检查器错误"
 
 msgid "Selected Bug Info"
-msgstr ""
+msgstr "选定错误的信息"
 
 msgid "Handy Address Interpolation Functions"
 msgstr "简便的地址编排函数"
@@ -25332,19 +25424,19 @@ msgid "Building address"
 msgstr "建筑地址"
 
 msgid "empty"
-msgstr ""
+msgstr "空"
 
 msgid "skip"
-msgstr ""
+msgstr "跳过"
 
 msgid "House number:"
 msgstr "门牌号码:"
 
 msgid "Street:"
-msgstr ""
+msgstr "街道:"
 
 msgid "Post code:"
-msgstr ""
+msgstr "邮编:"
 
 msgid "Building:"
 msgstr ""
@@ -25386,10 +25478,10 @@ msgid "Unable to detect a polygon where you clicked."
 msgstr ""
 
 msgid "Error Report"
-msgstr ""
+msgstr "错误报告"
 
 msgid "Something went wrong!"
-msgstr ""
+msgstr "出现问题!"
 
 msgid "Please file a bug report on the github project page under"
 msgstr ""
@@ -25417,7 +25509,7 @@ msgid ""
 msgstr ""
 
 msgid "Algorithm"
-msgstr ""
+msgstr "算法"
 
 msgid ""
 "Maximum pixels a point can be away from a line and still be considered as a "
@@ -25425,7 +25517,7 @@ msgid ""
 msgstr ""
 
 msgid "Distance Tolerance"
-msgstr ""
+msgstr "距离容差"
 
 msgid ""
 "Lines with a smaller angle (degrees) than this will be combined to one line "
@@ -25433,7 +25525,7 @@ msgid ""
 msgstr ""
 
 msgid "Angle Tolerance"
-msgstr ""
+msgstr "角度容差"
 
 msgid ""
 "The color threshold defines how much a color may differ from the selected "
@@ -25442,10 +25534,10 @@ msgid ""
 msgstr ""
 
 msgid "Color Threshold"
-msgstr ""
+msgstr "颜色阈值"
 
 msgid "Use HSV based algorithm"
-msgstr ""
+msgstr "使用基于 HSV 算法"
 
 msgid ""
 "Use hue and saturation instead of RGB distinction to select matching colors."
@@ -25458,19 +25550,19 @@ msgid "Thinning Iterations"
 msgstr ""
 
 msgid "show address dialog"
-msgstr ""
+msgstr "显示地址对话框"
 
 msgid "Show Address Dialog after mapping an area"
-msgstr ""
+msgstr "在绘制一个区域后显示地址对话框"
 
 msgid "merge nodes"
-msgstr ""
+msgstr "合并节点"
 
 msgid "Merge nodes with existing nodes"
-msgstr ""
+msgstr "将节点合并至既有节点"
 
 msgid "Debug"
-msgstr ""
+msgstr "调试"
 
 msgid "Debugging mode will write images for each processing step."
 msgstr ""
@@ -25530,7 +25622,7 @@ msgid "Set width of the building"
 msgstr "设置建筑物的宽度"
 
 msgid "Merge address points"
-msgstr ""
+msgstr "合并地址点"
 
 msgid "Move tags from address nodes inside buildings to building ways"
 msgstr ""
@@ -25738,7 +25830,7 @@ msgid ""
 "http://www.cadastre.gouv.fr/scpc/html/CU_01_ConditionsGenerales_fr.html</a> "
 "<BR>before any upload of data created by this plugin."
 msgstr ""
-"在 www.cadastre.gouv.fr 的法国土地利用 wms<BR><BR>请先在这里阅读使用的条件与条款:<br><a "
+"在 www.cadastre.gouv.fr 的法国土地用途 wms<BR><BR>请先在这里阅读使用的条件与条款:<br><a "
 "href=\"http://www.cadastre.gouv.fr/scpc/html/CU_01_ConditionsGenerales_fr.htm"
 "l\"> "
 "http://www.cadastre.gouv.fr/scpc/html/CU_01_ConditionsGenerales_fr.html</a> "
@@ -25809,7 +25901,7 @@ msgid "Layers:"
 msgstr "图层:"
 
 msgid "Sea, rivers, swimming pools."
-msgstr ""
+msgstr "海洋、河流、游泳池。"
 
 msgid "Buildings, covers, underground constructions."
 msgstr "建筑、遮蔽物、地下建筑物。"
@@ -26252,10 +26344,10 @@ msgid "Generate matches"
 msgstr ""
 
 msgid "Layer:"
-msgstr ""
+msgstr "图层:"
 
 msgid "{0}: 0 / {1}: 0 / {2}: 0"
-msgstr ""
+msgstr "{0}: 0 / {1}: 0 / {2}: 0"
 
 msgid "Subject"
 msgstr ""
@@ -26291,31 +26383,31 @@ msgid "Freeze reference selection"
 msgstr ""
 
 msgid "{0}: {1} / {2}: {3} / {4}: {5}"
-msgstr ""
+msgstr "{0}: {1} / {2}: {3} / {4}: {5}"
 
 msgid "Invalid reference or subject"
 msgstr ""
 
 msgid "Download OSM data continuously"
-msgstr ""
+msgstr "连续下载 OSM 数据"
 
 msgid "Download map data continuously when paning and zooming."
-msgstr ""
+msgstr "平移和缩放时连续下载地图数据。"
 
 msgid "Toggle the continuous download on/off"
-msgstr ""
+msgstr "切换连续下载"
 
 msgid "Activate continuous downloads at startup."
-msgstr ""
+msgstr "启动时激活连续下载。"
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
 msgid "Download Settings"
-msgstr ""
+msgstr "下载设置"
 
 msgid "Settings for the continuous download."
-msgstr ""
+msgstr "连续下载设置。"
 
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
@@ -26328,10 +26420,10 @@ msgid ""
 msgstr ""
 
 msgid "Requires restart"
-msgstr ""
+msgstr "需要重启"
 
 msgid "Max threads"
-msgstr ""
+msgstr "最大线程数"
 
 msgid "Maximum number of boxes to download for each pan/zoom."
 msgstr ""
@@ -26345,7 +26437,7 @@ msgid ""
 msgstr ""
 
 msgid "Wait time (milliseconds)"
-msgstr ""
+msgstr "等待时间(毫秒)"
 
 msgid ""
 "How much extra area around the viewport is it going to download. Setting "
@@ -26361,13 +26453,13 @@ msgid ""
 msgstr ""
 
 msgid "Max download area"
-msgstr ""
+msgstr "最大下载区域"
 
 msgid "The strategy for finding what areas to request from the server."
 msgstr ""
 
 msgid "Download strategy"
-msgstr ""
+msgstr "下载策略"
 
 msgid ""
 "Suppress the progress monitor that is shown when downloading. If this option "
@@ -26434,15 +26526,15 @@ msgstr "在 {0} {1} 和 {2} {3} 之间"
 msgid "  adding {0} {1}"
 msgstr "  正在添加 {0} {1}"
 
+msgid "EditGpx"
+msgstr "编辑Gpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "编辑 GPX 轨迹的图层"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "转换为没有时间的 GPX 图层"
 
-msgid "EditGpx"
-msgstr "编辑Gpx"
-
 msgid "edit gpx tracks"
 msgstr "编辑 gpx 轨迹"
 
@@ -26564,6 +26656,18 @@ msgstr "清空日志"
 msgid "Show users on map"
 msgstr "在地图上显示用户"
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "只有位置"
 
@@ -27270,9 +27374,6 @@ msgstr "显示无地理标记的相片"
 msgid "Imported Images"
 msgstr "输入的图片"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "图片文件(*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "导入矢量图形"
 
@@ -27313,7 +27414,7 @@ msgid "POWER"
 msgstr ""
 
 msgid "Activates the plug-in"
-msgstr ""
+msgstr "激活插件"
 
 msgid "Working Level"
 msgstr ""
@@ -27748,10 +27849,10 @@ msgid "Mapillary layer"
 msgstr ""
 
 msgid "Total images:"
-msgstr ""
+msgstr "总图像:"
 
 msgid "images"
-msgstr ""
+msgstr "图像"
 
 msgid "Traffic sign font at ''{0}'' has wrong format"
 msgstr ""
@@ -27772,25 +27873,25 @@ msgid "Download Mapillary images in current view"
 msgstr ""
 
 msgid "Export pictures"
-msgstr ""
+msgstr "导出图片"
 
 msgid "Export Mapillary pictures"
 msgstr ""
 
 msgid "Export images"
-msgstr ""
+msgstr "导出图像"
 
 msgid "Import pictures"
-msgstr ""
+msgstr "导入图片"
 
 msgid "Import local pictures"
-msgstr ""
+msgstr "导入本地图片"
 
 msgid "Import pictures into Mapillary layer"
 msgstr ""
 
 msgid "Select pictures"
-msgstr ""
+msgstr "选择图片"
 
 msgid "Import pictures into sequence"
 msgstr ""
@@ -27807,14 +27908,23 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
-msgid "Upload pictures"
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
 msgstr ""
 
+msgid "Upload pictures"
+msgstr "上传图片"
+
 msgid "Upload Mapillary pictures"
 msgstr ""
 
 msgid "Upload pictures."
-msgstr ""
+msgstr "上传图片。"
 
 msgid "Walk mode"
 msgstr ""
@@ -27823,13 +27933,13 @@ msgid "Start walk mode"
 msgstr ""
 
 msgid "Zoom to selected image"
-msgstr ""
+msgstr "缩放至选定图片"
 
 msgid "Zoom to the currently selected Mapillary image"
 msgstr ""
 
 msgid "Uploaded {0} images"
-msgstr ""
+msgstr "已上传 {0} 张图片"
 
 msgid "Approve upload on the website"
 msgstr ""
@@ -27844,19 +27954,31 @@ msgid "Copy key tag"
 msgstr ""
 
 msgid "Edit on website"
+msgstr "在网站上编辑"
+
+msgid "Current Mapillary changeset"
 msgstr ""
 
-msgid "Export all images"
+msgid "Open Mapillary changeset dialog"
 msgstr ""
 
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
+msgid "Export all images"
+msgstr "导出所有图像"
+
 msgid "Export selected sequence"
 msgstr ""
 
 msgid "Export selected images"
-msgstr ""
+msgstr "导出选定图像"
 
 msgid "Rewrite imported images"
-msgstr ""
+msgstr "重写已导入图像"
 
 msgid "Select a folder"
 msgstr ""
@@ -27865,10 +27987,10 @@ msgid "Explore"
 msgstr ""
 
 msgid "Select a directory"
-msgstr ""
+msgstr "选择文件夹"
 
 msgid "Speed limit"
-msgstr ""
+msgstr "限速"
 
 msgid "Give way"
 msgstr ""
@@ -27907,7 +28029,7 @@ msgid "Days"
 msgstr ""
 
 msgid "Imported images"
-msgstr ""
+msgstr "已导入图像"
 
 msgid "Mapillary filter"
 msgstr ""
@@ -27919,7 +28041,7 @@ msgid "Not older than: "
 msgstr ""
 
 msgid "Downloaded images"
-msgstr ""
+msgstr "已下载图像"
 
 msgid "Only images with signs"
 msgstr ""
@@ -27946,13 +28068,13 @@ msgid "Open Mapillary main dialog"
 msgstr ""
 
 msgid "Next picture"
-msgstr ""
+msgstr "前一图片"
 
 msgid "Shows the next picture in the sequence"
 msgstr ""
 
 msgid "Previous picture"
-msgstr ""
+msgstr "后一图片"
 
 msgid "Shows the previous picture in the sequence"
 msgstr ""
@@ -27973,20 +28095,17 @@ msgid "Stops the walk."
 msgstr ""
 
 msgid "Play"
-msgstr ""
+msgstr "播放"
 
 msgid "Continues with the paused walk."
 msgstr ""
 
 msgid "Pause"
-msgstr ""
+msgstr "暂停"
 
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -28003,10 +28122,10 @@ msgid "Download mode"
 msgstr ""
 
 msgid "You are logged in as ''{0}''."
-msgstr ""
+msgstr "您已登录为“{0}”。"
 
 msgid "You are currently not logged in."
-msgstr ""
+msgstr "您尚未登录。"
 
 msgid "Go to setting and log in to Mapillary before uploading."
 msgstr ""
@@ -28015,7 +28134,7 @@ msgid "Upload selected sequence"
 msgstr ""
 
 msgid "Delete after upload"
-msgstr ""
+msgstr "上传后删除"
 
 msgid "Wait for full quality pictures"
 msgstr ""
@@ -28028,21 +28147,18 @@ msgstr ""
 
 msgid "Deleted {0} image"
 msgid_plural "Deleted {0} images"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "已删除 {0} 张图像"
 
 msgid "Imported {0} image"
 msgid_plural "Imported {0} images"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "已导入 {0} 张图像"
 
 msgid "2 images joined"
 msgstr ""
 
 msgid "Moved {0} image"
 msgid_plural "Moved {0} images"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "已移动 {0} 张图像"
 
 msgid "Turned {0} image"
 msgid_plural "Turned {0} images"
@@ -28058,7 +28174,7 @@ msgid ""
 msgstr ""
 
 msgid "Downloading"
-msgstr ""
+msgstr "正在下载"
 
 msgid "Select mode"
 msgstr ""
@@ -28067,7 +28183,7 @@ msgid "Mapillary login"
 msgstr ""
 
 msgid "Login successful, return to JOSM."
-msgstr ""
+msgstr "登录成功,返回 JOSM。"
 
 msgid "Supported image formats (JPG and PNG)"
 msgstr ""
@@ -28078,12 +28194,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
-msgid "No images found"
+msgid "Submitting Mapillary Changeset"
 msgstr ""
 
+msgid "No images found"
+msgstr "没有找到图像"
+
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29435,33 +29560,81 @@ msgstr ""
 msgid "Code"
 msgstr "代码"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid "PT_Assistant Fetch Request"
+msgstr ""
+
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "PT: Stop_position is not part of a way"
+msgstr ""
+
+msgid "PT: Platform should not be part of a way"
+msgstr ""
+
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29861,6 +30034,12 @@ msgstr "修正选定关系成员的角色"
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -30427,7 +30606,7 @@ msgid "unexpected column number {0}"
 msgstr "意外的栏号 {0}"
 
 msgid "Tagging Preset Tester"
-msgstr "标签预设组合测试程序"
+msgstr "标签预设组合测试器"
 
 msgid ""
 "Open the tagging preset test tool for previewing tagging preset dialogs."
@@ -31549,12 +31728,6 @@ msgstr "从转弯限制删除成员"
 msgid "Change to the Basic Editor and select a way"
 msgstr "转到基本编辑器并选择一条路径"
 
-msgid "Undelete object..."
-msgstr "取消删除对象..."
-
-msgid "Undelete object by id"
-msgstr "依 ID 取消删除对象"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -31564,6 +31737,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "取消删除对象..."
+
+msgid "Undelete object by id"
+msgstr "依 ID 取消删除对象"
+
 msgid "Undelete Object"
 msgstr "取消删除对象"
 
@@ -32211,16 +32390,16 @@ msgid "Search after waypoint. Click and move the map view to the waypoint."
 msgstr "在路点后搜索。点击并移动地图查看路点。"
 
 msgid "Fetch Wikidata IDs"
-msgstr ""
+msgstr "获取 Wikidata ID"
 
 msgid "Fetch Wikidata IDs using the ''wikipedia'' tag"
 msgstr ""
 
 msgid "Fetching Wikidata IDs"
-msgstr ""
+msgstr "正在获取 Wikidata ID"
 
 msgid "Add Wikidata"
-msgstr ""
+msgstr "添加 Wikidata"
 
 msgid "No Wikidata ID found for: {0}"
 msgstr ""
@@ -32231,13 +32410,19 @@ msgstr[0] ""
 msgstr[1] ""
 
 msgid "Add Wikidata for language ''{0}''"
-msgstr "添加{0}语言的维基数据(Wikidata)"
+msgstr "添加语言“{0}”的 Wikidata"
 
 msgid "Overwrite ''{0}'' tag {1} from {2} with new value ''{3}''?"
 msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "添加维基百科的名称"
 
@@ -32270,11 +32455,14 @@ msgstr "在本地数据中可用"
 msgid "Not linked yet"
 msgstr "尚未链接"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org:{1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "从维基百科获取所有当前视图中的坐标"
diff --git a/i18n/po/zh_TW.po b/i18n/po/zh_TW.po
index e5a02e1..6b42ed2 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: 2016-06-04 17:38+0200\n"
+"POT-Creation-Date: 2016-07-12 03:36+0200\n"
 "PO-Revision-Date: 2016-06-06 03:51+0000\n"
 "Last-Translator: Rex Tsai <rex.tsai at canonical.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: 2016-06-06 04:32+0000\n"
-"X-Generator: Launchpad (build 18086)\n"
+"X-Launchpad-Export-Date: 2016-07-12 05:11+0000\n"
+"X-Generator: Launchpad (build 18115)\n"
 "Language: zh_TW\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -2611,14 +2611,6 @@ msgstr "已下載區域中的物件"
 msgid "objects (and all its way nodes / relation members) in downloaded area"
 msgstr ""
 
-msgid "Searching"
-msgstr "正在搜尋"
-
-msgid "Searching in {0} object"
-msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "No match found for ''{0}''"
 msgstr "找不到「{0}」的符合項"
 
@@ -2634,6 +2626,14 @@ msgstr "在選擇區域中搜尋不到「{0}」"
 msgid "Found {0} matches"
 msgstr "找到 {0} 個符合項"
 
+msgid "Searching"
+msgstr "正在搜尋"
+
+msgid "Searching in {0} object"
+msgid_plural "Searching in {0} objects"
+msgstr[0] ""
+msgstr[1] ""
+
 msgctxt "search"
 msgid "CS"
 msgstr "CS"
@@ -3896,9 +3896,6 @@ msgstr ""
 msgid "Checks for errors in internet-related tags."
 msgstr ""
 
-msgid " URL cannot be converted to ASCII: {0}"
-msgstr ""
-
 msgid "''{0}'': {1}"
 msgstr ""
 
@@ -8991,8 +8988,8 @@ msgstr "拉近以讀取任何拼貼"
 msgid "zoom in to load more tiles"
 msgstr "拉近以讀取更多拼貼"
 
-msgid "increase zoom level to see more detail"
-msgstr "增加縮放等級以查看更多詳細資料"
+msgid "increase tiles zoom level (change resolution) to see more detail"
+msgstr ""
 
 msgid "No tiles at this zoom level"
 msgstr "這個縮放等級沒有拼貼"
@@ -14608,6 +14605,9 @@ msgstr "Strava單車熱力圖"
 msgid "Strava running heatmap"
 msgstr "Strava跑步熱力圖"
 
+msgid "Strava both heatmap"
+msgstr ""
+
 msgid "Locator Overlay"
 msgstr ""
 
@@ -14848,7 +14848,7 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
-msgid "BD Ortho"
+msgid "BDOrtho IGN"
 msgstr ""
 
 msgid "Bordeaux - 2012"
@@ -15826,6 +15826,9 @@ msgid ""
 "Talk with users editing the map nearby, be notified when someone comes close."
 msgstr ""
 
+msgid "Allows you to view a GeoJSON file as a layer."
+msgstr ""
+
 msgid ""
 "Provides parts of the GeoTools library for other JOSM plugins. Not meant to "
 "be installed directly by users, but rather as a dependency for other plugins."
@@ -17611,18 +17614,33 @@ msgstr "產業道路類型"
 msgid "grade1"
 msgstr "第一級"
 
+msgid "Solid: paved or heavily compacted hardcore surface"
+msgstr ""
+
 msgid "grade2"
 msgstr "第二級"
 
+msgid "Mostly Solid: gravel/rock with some soft material mixed in"
+msgstr ""
+
 msgid "grade3"
 msgstr "第三級"
 
+msgid "Even mixture of hard and soft materials"
+msgstr ""
+
 msgid "grade4"
 msgstr "第四級"
 
+msgid "Mostly Soft: soil/sand/grass with some hard material mixed in"
+msgstr ""
+
 msgid "grade5"
 msgstr "第五級"
 
+msgid "Soft: soil/sand/grass"
+msgstr ""
+
 msgid "MTB Scale"
 msgstr "MTB 比例"
 
@@ -18812,6 +18830,72 @@ msgstr "電壓"
 msgid "Amperage"
 msgstr ""
 
+msgid "Types of vehicles which can be charged:"
+msgstr ""
+
+msgid "Scooter"
+msgstr ""
+
+msgid "Truck"
+msgstr ""
+
+msgid "Number of Sockets:"
+msgstr ""
+
+msgid "Type 1 (Yazaki)"
+msgstr ""
+
+msgid "Type 1 Combo"
+msgstr ""
+
+msgid "Type 2 (Mennekes)"
+msgstr ""
+
+msgid "Type 2 Combo"
+msgstr ""
+
+msgid "Type 3 (SCAME)"
+msgstr ""
+
+msgid "CHAdeMO"
+msgstr ""
+
+msgid "Tesla Supercharger"
+msgstr ""
+
+msgid "Schuko"
+msgstr ""
+
+msgid "CEE blue"
+msgstr ""
+
+msgid "CEE red 16A"
+msgstr ""
+
+msgid "CEE red 32A"
+msgstr ""
+
+msgid "NEMA 5-15"
+msgstr ""
+
+msgid "NEMA 5-20"
+msgstr ""
+
+msgid "Authentication:"
+msgstr ""
+
+msgid "Phone call"
+msgstr ""
+
+msgid "Short message"
+msgstr ""
+
+msgid "NFC"
+msgstr ""
+
+msgid "Membership card"
+msgstr ""
+
 msgid "Wash"
 msgstr "洗車場"
 
@@ -19016,9 +19100,6 @@ msgstr ""
 msgid "Train"
 msgstr ""
 
-msgid "Railway station (legacy)"
-msgstr ""
-
 msgid "Railway halt (legacy)"
 msgstr ""
 
@@ -19043,15 +19124,6 @@ msgstr "涼亭"
 msgid "Waste Basket/Trash Can"
 msgstr ""
 
-msgid "Highway platform (legacy)"
-msgstr "公路月台(傳統)"
-
-msgid "Railway platform (legacy)"
-msgstr "鐵路月台(傳統)"
-
-msgid "funicular"
-msgstr ""
-
 msgctxt "railway"
 msgid "Station"
 msgstr "火車站"
@@ -22838,9 +22910,6 @@ msgstr "樹"
 msgid "A single tree."
 msgstr "單獨一棵樹"
 
-msgid "Botanical Name"
-msgstr "植物學名"
-
 msgid "Tree Row"
 msgstr "一排樹"
 
@@ -23877,6 +23946,21 @@ msgstr ""
 msgid "Suspicious tag combination: {0} and {1}"
 msgstr ""
 
+msgid "{0} on a relation without {1}"
+msgstr ""
+
+msgid ""
+"Long waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
+msgid ""
+"Short waterway with {0} but without a tag which defines it as tunnel or "
+"underground. Remove {1} or add a tunnel tag if applicable. Also check "
+"crossing bridges and their {1} tags."
+msgstr ""
+
 msgid "{0} is deprecated"
 msgstr "{0} 已經廢棄"
 
@@ -24029,6 +24113,9 @@ msgid ""
 "the waterway is wrong."
 msgstr ""
 
+msgid "Coastline inside {1}"
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -24401,6 +24488,9 @@ msgstr ""
 msgid "Elevation Grid"
 msgstr ""
 
+msgid "increase zoom level to see more detail"
+msgstr "增加縮放等級以查看更多詳細資料"
+
 msgid "No SRTM data"
 msgstr ""
 
@@ -26332,15 +26422,15 @@ msgstr "在 {0} {1} 和 {2} {3} 之間"
 msgid "  adding {0} {1}"
 msgstr "  正在加入 {0} {1}"
 
+msgid "EditGpx"
+msgstr "編輯Gpx"
+
 msgid "Layer for editing GPX tracks"
 msgstr "編輯 GPX 軌跡的圖層"
 
 msgid "Convert to GPX layer with anonymised time"
 msgstr "轉換為沒有時刻的 GPX 圖層"
 
-msgid "EditGpx"
-msgstr "編輯Gpx"
-
 msgid "edit gpx tracks"
 msgstr "編輯 gpx 軌跡"
 
@@ -26463,6 +26553,18 @@ msgstr ""
 msgid "Show users on map"
 msgstr ""
 
+msgid "GeoJSON file"
+msgstr ""
+
+msgid "Loading json file..."
+msgstr ""
+
+msgid "Data Layer from GeoJSON: "
+msgstr ""
+
+msgid "Error loading geojson file {0}"
+msgstr ""
+
 msgid "Position only"
 msgstr "只有位置"
 
@@ -27163,9 +27265,6 @@ msgstr "顯示無 geotag 的相片"
 msgid "Imported Images"
 msgstr "匯入的圖片"
 
-msgid "Image files (*.jpg, *.jpeg, *.png, *.gif)"
-msgstr "圖片檔案 (*.jpg, *.jpeg, *.png, *.gif)"
-
 msgid "Import vector graphics"
 msgstr "匯入向量圖形"
 
@@ -27700,6 +27799,15 @@ msgstr ""
 msgid "Join Mapillary pictures"
 msgstr ""
 
+msgid "Submit changeset"
+msgstr ""
+
+msgid "Submit the current changeset"
+msgstr ""
+
+msgid "Submit the current changeset to Mapillary"
+msgstr ""
+
 msgid "Upload pictures"
 msgstr ""
 
@@ -27739,6 +27847,18 @@ msgstr ""
 msgid "Edit on website"
 msgstr ""
 
+msgid "Current Mapillary changeset"
+msgstr ""
+
+msgid "Open Mapillary changeset dialog"
+msgstr ""
+
+msgid "Mapillary changeset"
+msgstr ""
+
+msgid "Submit"
+msgstr ""
+
 msgid "Export all images"
 msgstr ""
 
@@ -27877,9 +27997,6 @@ msgstr ""
 msgid "Pauses the walk."
 msgstr ""
 
-msgid "Reverse buttons position when displaying images."
-msgstr ""
-
 msgid "Display hour when the picture was taken"
 msgstr ""
 
@@ -27971,12 +28088,21 @@ msgstr ""
 msgid "Total Mapillary images: {0}"
 msgstr ""
 
+msgid "Submitting Mapillary Changeset"
+msgstr ""
+
 msgid "No images found"
 msgstr ""
 
 msgid "Finished upload"
 msgstr ""
 
+msgid "You are not logged in, please log in to Mapillary in the preferences"
+msgstr ""
+
+msgid "Not Logged in to Mapillary"
+msgstr ""
+
 msgid "Uploading: {0}"
 msgstr ""
 
@@ -29333,33 +29459,81 @@ msgstr ""
 msgid "Code"
 msgstr "代碼"
 
-msgid "Gaps"
+msgid "Add stop position"
 msgstr ""
 
-msgid "Checks if there are gaps in the route relation."
+msgid "Do you want to download referrers of platforms and stop positions?"
 msgstr ""
 
-msgid "PT: Route contains a gap that can be fixed by sorting"
+msgid "Remember my choice and do not ask me again in this session"
+msgstr ""
+
+msgid "PT_Assistant Fetch Request"
 msgstr ""
 
-msgid "PT: Route contains an overshoot"
+msgid ""
+"Route relations have incomplete members.\n"
+"They need to be downloaded to proceed with validation.\n"
+"Do you want to download them?"
+msgstr ""
+
+msgid "PT_Assistant plugin found that this relation (id={0}) has errors:"
+msgstr ""
+
+msgid "{0} direction error"
+msgid_plural "{0} direction errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "{0} road type error"
+msgid_plural "{0} road type errors"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "How do you want to proceed?"
 msgstr ""
 
-msgid "PT: Route contains a gap that cannot be fixed by sorting the ways"
+msgid "PT_Assistant Proceed Request"
 msgstr ""
 
-msgid "Fix gaps in public transport route"
+msgid "PT: Stop_position is not part of a way"
 msgstr ""
 
-msgid "Platforms first"
+msgid "PT: Platform should not be part of a way"
 msgstr ""
 
-msgid "Checks if platforms are listed before ways in the route relation."
+msgid "Public Transport Assistant tests"
 msgstr ""
 
 msgid ""
-"PT: route relation(s) contain(s) way(s) before platform(s) in the members "
-"list"
+"Check if route relations are compatible with public transport version 2"
+msgstr ""
+
+msgid "Fix error"
+msgstr ""
+
+msgid "PT: dummy test warning"
+msgstr ""
+
+msgid "PT: Route contains a gap that can be fixed by sorting"
+msgstr ""
+
+msgid "PT: Relation member roles do not match tags"
+msgstr ""
+
+msgid "PT: Route should start and end with a stop_position"
+msgstr ""
+
+msgid "PT: First or last way needs to be split"
+msgstr ""
+
+msgid "PT: Route type does not match the type of the road it passes on"
+msgstr ""
+
+msgid "PT: Road is under construction"
+msgstr ""
+
+msgid "PT: Route passes a oneway road in the wrong direction"
 msgstr ""
 
 msgid "Can''t parse a time from this string."
@@ -29759,6 +29933,12 @@ msgstr "修正選取關係成員的角色"
 msgid "Complete multipolygon for way {0}"
 msgstr ""
 
+msgid "Two rings are equal, and this must not be."
+msgstr ""
+
+msgid "Multipolygon from rings"
+msgstr ""
+
 msgid "Node without ''house'' role found"
 msgstr ""
 
@@ -31434,12 +31614,6 @@ msgstr "從轉彎限制刪除成員"
 msgid "Change to the Basic Editor and select a way"
 msgstr "改變為基本編輯器並選擇路徑"
 
-msgid "Undelete object..."
-msgstr "取消刪除物件..."
-
-msgid "Undelete object by id"
-msgstr "依 ID 取消刪除物件"
-
 msgid "Unable to undelete node {0}. Object has likely been redacted"
 msgstr ""
 
@@ -31449,6 +31623,12 @@ msgstr ""
 msgid "Unable to undelete relation {0}. Object has likely been redacted"
 msgstr ""
 
+msgid "Undelete object..."
+msgstr "取消刪除物件..."
+
+msgid "Undelete object by id"
+msgstr "依 ID 取消刪除物件"
+
 msgid "Undelete Object"
 msgstr "取消刪除物件"
 
@@ -32103,6 +32283,12 @@ msgid_plural "Overwrite ''{0}'' tags {1} from {2} with new value ''{3}''?"
 msgstr[0] ""
 msgstr[1] ""
 
+msgid "Search Wikidata items"
+msgstr ""
+
+msgid "Target key: "
+msgstr ""
+
 msgid "Add names from Wikipedia"
 msgstr "從維基百科加入名稱"
 
@@ -32135,11 +32321,14 @@ msgstr "可供本地數據資料庫利用"
 msgid "Not linked yet"
 msgstr "尚未連結"
 
-msgid "{0}.Wikipedia.org"
-msgstr "{0}.Wikipedia.org"
+msgid "{0}: {1}"
+msgstr ""
+
+msgid "Wikidata"
+msgstr ""
 
-msgid "{0}.Wikipedia.org: {1}"
-msgstr "{0}.Wikipedia.org:{1}"
+msgid "Fetches all coordinates from Wikidata in the current view"
+msgstr ""
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
 msgstr "自維基百科取得目前檢視區域之坐標"
diff --git a/images/presets/ferry.png b/images/presets/ferry.png
deleted file mode 100644
index 7023198..0000000
Binary files a/images/presets/ferry.png and /dev/null differ
diff --git a/images/presets/station16.png b/images/presets/station16.png
new file mode 100644
index 0000000..cef6770
Binary files /dev/null and b/images/presets/station16.png differ
diff --git a/linux/latest/etc/default/josm-latest b/linux/latest/etc/default/josm-latest
new file mode 100644
index 0000000..1b13192
--- /dev/null
+++ b/linux/latest/etc/default/josm-latest
@@ -0,0 +1,9 @@
+# Options to pass to java when starting JOSM.
+# Uncomment the JAVA_OPTS lines to enable their use by /usr/bin/josm-latest
+
+# Increase usable memory
+#JAVA_OPTS="${JAVA_OPTS} -Xmx1024m"
+
+# Enable OpenGL pipeline (2D graphic accelerators)
+#JAVA_OPTS="${JAVA_OPTS} -Dsun.java2d.opengl=True"
+
diff --git a/linux/latest/usr/bin/josm-latest b/linux/latest/usr/bin/josm-latest
index 9b08c74..862fa21 100755
--- a/linux/latest/usr/bin/josm-latest
+++ b/linux/latest/usr/bin/josm-latest
@@ -20,6 +20,10 @@ else
 	JAVA_CMDS="${JAVA_CMDS} /usr/lib/jvm/java-9-oracle/bin/java"
 fi
 
+if [ -f /etc/default/josm-latest ]; then
+    . /etc/default/josm-latest
+fi
+
 JAVA_OPTS="-Djosm.restart=true -Djosm.home=$HOME/.josm-latest -Djava.net.useSystemProxies=true $JAVA_OPTS"
 
 if [ -z "${JAVACMD}" ]; then
diff --git a/linux/tested/etc/default/josm b/linux/tested/etc/default/josm
new file mode 100644
index 0000000..354726b
--- /dev/null
+++ b/linux/tested/etc/default/josm
@@ -0,0 +1,9 @@
+# Options to pass to java when starting JOSM.
+# Uncomment the JAVA_OPTS lines to enable their use by /usr/bin/josm
+
+# Increase usable memory
+#JAVA_OPTS="${JAVA_OPTS} -Xmx1024m"
+
+# Enable OpenGL pipeline (2D graphic accelerators)
+#JAVA_OPTS="${JAVA_OPTS} -Dsun.java2d.opengl=True"
+
diff --git a/linux/tested/usr/bin/josm b/linux/tested/usr/bin/josm
index cbe7ebc..6812d96 100755
--- a/linux/tested/usr/bin/josm
+++ b/linux/tested/usr/bin/josm
@@ -20,6 +20,10 @@ else
 	JAVA_CMDS="${JAVA_CMDS} /usr/lib/jvm/java-9-oracle/bin/java"
 fi
 
+if [ -f /etc/default/josm ]; then
+    . /etc/default/josm
+fi
+
 JAVA_OPTS="-Djosm.restart=true -Djava.net.useSystemProxies=true $JAVA_OPTS"
 
 if [ -z "${JAVACMD}" ]; then
diff --git a/patches/javacc.patch b/patches/javacc.patch
new file mode 100644
index 0000000..0fffe7b
--- /dev/null
+++ b/patches/javacc.patch
@@ -0,0 +1,13 @@
+Index: src/main/resources/templates/TokenMgrError.template
+===================================================================
+--- src/main/resources/templates/TokenMgrError.template	(revision 765)
++++ src/main/resources/templates/TokenMgrError.template	(working copy)
+@@ -103,7 +103,7 @@
+     return("Lexical error at line " +
+           errorLine + ", column " +
+           errorColumn + ".  Encountered: " +
+-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar1)) + "\"") + " (" + (int)curChar + "), ") +
++          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar1)) + "\"") + " (" + curChar + "), ") +
+           "after : \"" + addEscapes(errorAfter) + "\"");
+   }
+ 
diff --git a/scripts/SyncEditorImageryIndex.groovy b/scripts/SyncEditorImageryIndex.groovy
index 88bf350..dc485d2 100644
--- a/scripts/SyncEditorImageryIndex.groovy
+++ b/scripts/SyncEditorImageryIndex.groovy
@@ -24,8 +24,6 @@ import javax.json.JsonReader
 import org.openstreetmap.josm.data.imagery.ImageryInfo
 import org.openstreetmap.josm.io.imagery.ImageryReader
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings
-
 class SyncEditorImageryIndex {
 
     List<ImageryInfo> josmEntries;
@@ -38,8 +36,8 @@ class SyncEditorImageryIndex {
     static String josmInputFile = 'maps.xml'
     static FileWriter outputFile = null
     static BufferedWriter outputStream = null
-    static int skipCount = 0;
-    static def skipEntries = [:]
+    int skipCount = 0;
+    def skipEntries = [:]
 
     static def options
 
@@ -98,36 +96,42 @@ class SyncEditorImageryIndex {
 
     void loadSkip() {
         /* TMS proxies for our wms */
-        skipEntries["-  Czech CUZK:KM tiles proxy - http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png"] = 1
         skipEntries["-  [CH] Stadt Zürich Luftbild 2011 - http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["-  [CH] Übersichtsplan Zürich - http://mapproxy.sosm.ch:8080/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["-  [CH] Kanton Solothurn 25cm (SOGIS 2011-2014) - http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         /* URL style mismatch */
+        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://{switch:a,b,c,d}.tile.stamen.com/terrain-background/{z}/{x}/{y}.jpg"] = 1
+        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://whoots.mapwarper.net/tms/{z}/{x}/{y}/MD_SixInchImagery/http://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer"] = 1
+        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://whoots.mapwarper.net/tms/{z}/{x}/{y}/Infrared2015/http://geodata.state.nj.us/imagerywms/Infrared2015"] = 1
+        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://whoots.mapwarper.net/tms/{z}/{x}/{y}/Natural2015/http://geodata.state.nj.us/imagerywms/Natural2015"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://tms.cadastre.openstreetmap.fr/*/tout/{z}/{x}/{y}.png"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.osm.ch:8080/tiles/AGIS2014/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.osm.ch:8080/tiles/sogis2014/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.openmap.lt/ort10lt/g/{z}/{x}/{y}.jpeg"] = 1
-        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.openstreetmap.lu/tiles/ortho2010/EPSG900913/{z}/{x}/{y}.jpeg"] = 1
-        skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.openstreetmap.lu/tiles/ortho2013/EPSG900913/{z}/{x}/{y}.jpeg"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.sosm.ch:8080/tiles/zh_luftbild2011/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.openmap.lt/ort10lt/g/{z}/{x}/{y}.jpeg"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://mapproxy.osm.ch:8080/tiles/KTZUERICH2015/EPSG900913/{z}/{x}/{y}.png?origin=nw"] = 1
         skipEntries["+++ EII-URL uses {z} instead of {zoom}: http://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{z}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg"] = 1
 
         skipEntries["+++ EII-URL is not unique: http://geolittoral.application.equipement.gouv.fr/wms/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortholittorale&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
+        skipEntries["-  OpenStreetMap (German Language) - http://toolserver.org/tiles/osm-locale-de/{zoom}/{x}/{y}.png"] = 1
+        skipEntries["-  OpenStreetMap (Sorbian Language) - http://toolserver.org/tiles/osm-locale-hsb/{zoom}/{x}/{y}.png"] = 1
+        skipEntries["-  OpenStreetMap (Standard Black & White) - http://{switch:a,b,c}.www.toolserver.org/tiles/bw-mapnik/{zoom}/{x}/{y}.png"] = 1
+        skipEntries["-  OpenStreetMap (Standard) - http://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png"] = 1
         skipEntries["-  Streets NRW Geofabrik.de - http://tools.geofabrik.de/osmi/view/strassennrw/wxs?REQUEST=GetMap&SERVICE=wms&VERSION=1.1.1&FORMAT=image/png&SRS={proj}&STYLES=&LAYERS=unzugeordnete_strassen,kreisstrassen_ast,kreisstrassen,landesstrassen_ast,landesstrassen,bundesstrassen_ast,bundesstrassen,autobahnen_ast,autobahnen,endpunkte&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
-        skipEntries["-  Czech UHUL:ORTOFOTO - http://geoportal2.uhul.cz/cgi-bin/oprl.asp?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=Ortofoto_cb&STYLES=default&FORMAT=image/jpeg&TRANSPARENT=TRUE&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
-        skipEntries["-  Czech ÚHUL:ORTOFOTO tiles proxy - http://osm-{switch:a,b,c}.zby.cz/tiles_uhul.php/{zoom}/{x}/{y}.jpg"] = 1
         skipEntries["-  [CH] Kanton Solothurn 25cm (SOGIS 2011-2014) - http://www.sogis1.so.ch/cgi-bin/sogis/sogis_orthofoto.wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [CH] Kanton Solothurn Infrarot 12.5cm (SOGIS 2011) - http://www.sogis1.so.ch/cgi-bin/sogis/sogis_ortho.wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Orthofoto11_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [CH] Stadt Bern 10cm/25cm (2008) - http://map.bern.ch/arcgis/services/Orthofoto_2008/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0,1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
+        skipEntries["-  [CZ] Czech CUZK:KM tiles proxy - http://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png"] = 1
+        skipEntries["-  [CZ] Czech UHUL:ORTOFOTO - http://geoportal2.uhul.cz/cgi-bin/oprl.asp?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=Ortofoto_cb&STYLES=default&FORMAT=image/jpeg&TRANSPARENT=TRUE&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
+        skipEntries["-  [CZ] Czech ÚHUL:ORTOFOTO tiles proxy - http://osm-{switch:a,b,c}.zby.cz/tiles_uhul.php/{zoom}/{x}/{y}.jpg"] = 1
+        skipEntries["-  [DE] Hamburg (40 cm) - http://gateway.hamburg.de/OGCFassade/HH_WMS_DOP40.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
+        skipEntries["-  [DE] Hamburg (DK5) - http://gateway.hamburg.de/OGCFassade/HH_WMS_Geobasisdaten.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [EE] Estonia Basemap (Maaamet) - http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [EE] Estonia Forestry (Maaamet) - http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [EE] Estonia Hillshading (Maaamet) - http://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["-  [EE] Estonia Ortho (Maaamet) - http://kaart.maaamet.ee/wms/alus-geo?VERSION=1.1.1&REQUEST=GetMap&LAYERS=of10000&SRS={proj}&FORMAT=image/jpeg&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
-        skipEntries["-  Hamburg (DK5) - http://gateway.hamburg.de/OGCFassade/HH_WMS_Geobasisdaten.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
-        skipEntries["-  Hamburg (40 cm) - http://gateway.hamburg.de/OGCFassade/HH_WMS_DOP40.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 1
         skipEntries["  name differs: http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}"] = 3
         skipEntries["  name differs: http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}"] = 3
         skipEntries["  name differs: https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
@@ -142,12 +146,12 @@ class SyncEditorImageryIndex {
         skipEntries["  name differs: http://geoserver.infobex.hu/Budapest2014/IST/{zoom}/{x}/{y}.jpg"] = 3
         skipEntries["  name differs: http://mapproxy.openmap.lt/ort10lt/g/{zoom}/{x}/{y}.jpeg"] = 3
         skipEntries["  name differs: http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg"] = 3
-        skipEntries["  name differs: http://gis3.stuttgart.de/wss/service/wms_Luftbilder2011_jpg_internet/guest?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&Layers=0,1,2,3,4,5,6,7,8&STYLES=default,default,default,default,default,default,default,default,default&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
         skipEntries["  name differs: http://tools.geofabrik.de/osmi/tiles/routing/{zoom}/{x}/{y}.png"] = 3
         skipEntries["  name differs: http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg"] = 3
+        skipEntries["  name differs: http://gis3.stuttgart.de/wss/service/wms_Luftbilder2011_jpg_internet/guest?FORMAT=image/jpeg&VERSION=1.3.0&SERVICE=WMS&REQUEST=GetMap&Layers=0,1,2,3,4,5,6,7,8&STYLES=default,default,default,default,default,default,default,default,default&CRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
         skipEntries["  name differs: https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/bmp&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
         skipEntries["  name differs: http://tools.geofabrik.de/osmi/tiles/addresses/{zoom}/{x}/{y}.png"] = 3
-        skipEntries["  name differs: http://{switch:a,b,c}.www.toolserver.org/tiles/bw-mapnik/{zoom}/{x}/{y}.png"] = 3
+        skipEntries["  name differs: http://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png"] = 3
         skipEntries["  maxzoom differs: [DE] Bavaria (2 m) - http://geodaten.bayern.de/ogc/ogc_dop200_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=adv_dop200c&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
         skipEntries["  minzoom differs: [AU] LPI NSW Administrative Boundaries County - http://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=County&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE"] = 3
         skipEntries["  minzoom differs: [AU] LPI NSW Administrative Boundaries NPWS Reserve - http://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=NPWSReserve&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE"] = 3
@@ -159,14 +163,7 @@ class SyncEditorImageryIndex {
         skipEntries["  minzoom differs: [AU] LPI NSW Administrative Boundaries LGA - http://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=LocalGovernmentArea&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE"] = 3
         skipEntries["  minzoom differs: [AU] LPI NSW Base Map - http://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}"] = 3
         skipEntries["  country code differs: [EU] OSM Inspector: Boundaries (EU) - http://tools.geofabrik.de/osmi/tiles/boundaries/{zoom}/{x}/{y}.png"] = 3
-        skipEntries["  country code differs: [LT] ORT10LT (Lithuania) - http://mapproxy.openmap.lt/ort10lt/g/{zoom}/{x}/{y}.jpeg"] = 3
         skipEntries["  country code differs: [TH] Cambodia, Laos, Thailand, Vietnam bilingual - http://{switch:a,b,c,d}.tile.osm-tools.org/osm_then/{zoom}/{x}/{y}.png"] = 3
-        skipEntries["  country code differs: [HU] Szeged ortophoto 2011 - http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png"] = 3
-        skipEntries["  country code differs: [HU] Danube flood ortophoto 2013 - http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg"] = 3
-        skipEntries["  country code differs: [HU] Budapest district XII ortophoto 2013 - http://turistautak.openstreetmap.hu/kolesar/wms/Budapest-XII/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortofot%C3%B3%202013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
-        skipEntries["  country code differs: [HU] Törökbálint ortophoto 2013 - http://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}"] = 3
-
-
     }
 
     void myprintlnfinal(String s) {
@@ -178,7 +175,6 @@ class SyncEditorImageryIndex {
         }
     }
 
-    @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     void myprintln(String s) {
         if(skipEntries.containsKey(s)) {
             skipCount = skipEntries.get(s)
@@ -377,7 +373,7 @@ class SyncEditorImageryIndex {
         return e.getString("url")
     }
     static String getName(Object e) {
-        if (e instanceof ImageryInfo) return e.name
+        if (e instanceof ImageryInfo) return e.getOriginalName()
         return e.getString("name")
     }
     static String getType(Object e) {
diff --git a/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java b/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
index 1ba89a8..2b7219f 100644
--- a/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
+++ b/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDisk.java
@@ -210,7 +210,7 @@ public class BlockDisk
 
             ByteBuffer dataBuffer = ByteBuffer.wrap(data, offset, length);
 
-            long position = calculateByteOffsetForBlock(blocks[i]);
+            long position = calculateByteOffsetForBlockAsLong(blocks[i]);
             // write the header
             headerBuffer.flip();
             int written = fc.write(headerBuffer, position);
@@ -323,7 +323,7 @@ public class BlockDisk
         boolean corrupted = false;
         long fileLength = fc.size();
 
-        int position = calculateByteOffsetForBlock( block );
+        long position = calculateByteOffsetForBlockAsLong( block );
 //        if ( position > fileLength )
 //        {
 //            corrupted = true;
@@ -374,15 +374,29 @@ public class BlockDisk
     /**
      * Calculates the file offset for a particular block.
      * <p>
-     * @param block
-     * @return the offset for this block
+     * @param block number
+     * @return the byte offset for this block in the file as an int; may overflow
+     * @deprecated (since 2.0) use {@link #calculateByteOffsetForBlockAsLong(int)} instead
      */
+    @Deprecated
     protected int calculateByteOffsetForBlock( int block )
     {
         return block * blockSizeBytes;
     }
 
     /**
+     * Calculates the file offset for a particular block.
+     * <p>
+     * @param block number
+     * @return the byte offset for this block in the file as a long
+     * @since 2.0
+     */
+    protected long calculateByteOffsetForBlockAsLong( int block )
+    {
+        return (long) block * blockSizeBytes;
+    }
+
+    /**
      * The number of blocks needed.
      * <p>
      * @param data
diff --git a/src/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java b/src/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
index 174d6ea..b39117c 100644
--- a/src/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
+++ b/src/org/apache/commons/jcs/auxiliary/disk/indexed/IndexedDiskCache.java
@@ -90,16 +90,16 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
     private File rafDir;
 
     /** Should we keep adding to the recycle bin. False during optimization. */
-    boolean doRecycle = true;
+    private boolean doRecycle = true;
 
     /** Should we optimize real time */
-    boolean isRealTimeOptimizationEnabled = true;
+    private boolean isRealTimeOptimizationEnabled = true;
 
     /** Should we optimize on shutdown. */
-    boolean isShutdownOptimizationEnabled = true;
+    private boolean isShutdownOptimizationEnabled = true;
 
     /** are we currently optimizing the files */
-    boolean isOptimizing = false;
+    private boolean isOptimizing = false;
 
     /** The number of times the file has been optimized. */
     private int timesOptimized = 0;
diff --git a/src/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java b/src/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java
index d3708f4..761efe9 100644
--- a/src/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java
+++ b/src/org/apache/commons/jcs/auxiliary/remote/http/server/RemoteHttpCacheServlet.java
@@ -346,7 +346,7 @@ public class RemoteHttpCacheServlet
     }
 
     /**
-     * @param remoteCacheService the remoteCacheService to set
+     * @param rcs the remoteCacheService to set
      */
     protected void setRemoteCacheService(ICacheServiceNonLocal<Serializable, Serializable> rcs)
     {
diff --git a/src/org/apache/commons/jcs/auxiliary/remote/util/RemoteCacheRequestFactory.java b/src/org/apache/commons/jcs/auxiliary/remote/util/RemoteCacheRequestFactory.java
index 261105a..fc90ca9 100644
--- a/src/org/apache/commons/jcs/auxiliary/remote/util/RemoteCacheRequestFactory.java
+++ b/src/org/apache/commons/jcs/auxiliary/remote/util/RemoteCacheRequestFactory.java
@@ -41,7 +41,7 @@ public class RemoteCacheRequestFactory
      * @param cacheName cache name
      * @param requestType type of request
      * @param requesterId id of requester
-     * @return
+     * @return the request
      */
     private static <K, V> RemoteCacheRequest<K, V> createRequest(String cacheName, RemoteRequestType requestType, long requesterId)
     {
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 a24413c..ea80d2f 100644
--- a/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
+++ b/src/org/apache/commons/jcs/engine/memory/soft/SoftReferenceMemoryCache.java
@@ -46,9 +46,9 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 /**
- * A JCS {@link MemoryCache} that has {@link SoftReference} too all its values.
+ * A JCS IMemoryCache that has {@link SoftReference} to all its values.
  * This cache does not respect {@link ICompositeCacheAttributes#getMaxObjects()}
- * as overflowing is handled by java gc.
+ * as overflowing is handled by Java GC.
  * <p>
  * The cache also has strong references to a maximum number of objects given by
  * the maxObjects parameter
diff --git a/src/org/apache/commons/jcs/utils/timing/SleepUtil.java b/src/org/apache/commons/jcs/utils/timing/SleepUtil.java
deleted file mode 100644
index e1c09cd..0000000
--- a/src/org/apache/commons/jcs/utils/timing/SleepUtil.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.apache.commons.jcs.utils.timing;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Utility methods to help deal with thread issues.
- */
-public class SleepUtil
-{
-    /**
-     * Sleep for a specified duration in milliseconds. This method is a
-     * platform-specific workaround for Windows due to its inability to resolve
-     * durations of time less than approximately 10 - 16 ms.
-     * <p>
-     * @param milliseconds the number of milliseconds to sleep
-     */
-    public static void sleepAtLeast( long milliseconds )
-    {
-        long endTime = System.currentTimeMillis() + milliseconds;
-
-        while ( System.currentTimeMillis() <= endTime )
-        {
-            try
-            {
-                Thread.sleep( milliseconds );
-            }
-            catch ( InterruptedException e )
-            {
-                // TODO - Do something here?
-            }
-        }
-    }
-}
diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index ac883f4..09e5a10 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -8,8 +8,6 @@ import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Window;
-import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
 import java.awt.event.KeyEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
@@ -46,7 +44,6 @@ import java.util.logging.Logger;
 import javax.swing.Action;
 import javax.swing.InputMap;
 import javax.swing.JComponent;
-import javax.swing.JFrame;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
@@ -64,7 +61,6 @@ import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.actions.mapmode.DrawAction;
-import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
@@ -77,16 +73,16 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveDeepCopy;
-import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.gui.GettingStarted;
 import org.openstreetmap.josm.gui.MainApplication.Option;
+import org.openstreetmap.josm.gui.MainFrame;
 import org.openstreetmap.josm.gui.MainMenu;
+import org.openstreetmap.josm.gui.MainPanel;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrameListener;
-import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.SaveLayersDialog;
 import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
@@ -101,6 +97,7 @@ import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitorExecutor;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.FileWatcher;
@@ -120,7 +117,6 @@ import org.openstreetmap.josm.tools.PlatformHookUnixoid;
 import org.openstreetmap.josm.tools.PlatformHookWindows;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
-import org.openstreetmap.josm.tools.WindowGeometry;
 
 /**
  * Abstract class holding various static global variables and methods used in large parts of JOSM application.
@@ -193,6 +189,8 @@ public abstract class Main {
      * The MapFrame. Use {@link Main#setMapFrame} to set or clear it.
      * <p>
      * There should be no need to access this to access any map data. Use {@link #layerManager} instead.
+     *
+     * @see MainPanel
      */
     public static MapFrame map;
 
@@ -234,10 +232,10 @@ public abstract class Main {
 
     /**
      * The MOTD Layer.
+     * @deprecated Do not access this. It will be removed soon. You should not need to access the GettingStarted panel.
      */
-    public final GettingStarted gettingStarted = new GettingStarted();
-
-    private static final Collection<MapFrameListener> mapFrameListeners = new ArrayList<>();
+    @Deprecated
+    public final GettingStarted gettingStarted = mainPanel.getGettingStarted();
 
     protected static final Map<String, Throwable> NETWORK_ERRORS = new HashMap<>();
 
@@ -252,6 +250,12 @@ public abstract class Main {
      */
     public static int logLevel = 3;
 
+    /**
+     * The real main panel. This field may be removed any time and made private to {@link MainFrame}
+     * @see #panel
+     */
+    protected static final MainPanel mainPanel = new MainPanel(getLayerManager());
+
     private static void rememberWarnErrorMsg(String msg) {
         // Only remember first line of message
         int idx = msg.indexOf('\n');
@@ -260,8 +264,8 @@ public abstract class Main {
         } else {
             ERRORS_AND_WARNINGS.add(msg);
         }
-        // Only keep 5 lines to avoid memory leak and incomplete stacktraces in bug reports
-        while (ERRORS_AND_WARNINGS.size() > 5) {
+        // Only keep 10 lines to avoid memory leak
+        while (ERRORS_AND_WARNINGS.size() > 10) {
             ERRORS_AND_WARNINGS.remove(0);
         }
     }
@@ -437,6 +441,24 @@ public abstract class Main {
     }
 
     /**
+     * Prints a debug message for the given Throwable. Useful for exceptions usually ignored
+     * @param t The throwable object causing the error
+     * @since 10420
+     */
+    public static void debug(Throwable t) {
+        debug(getErrorMessage(t));
+    }
+
+    /**
+     * Prints a trace message for the given Throwable. Useful for exceptions usually ignored
+     * @param t The throwable object causing the error
+     * @since 10420
+     */
+    public static void trace(Throwable t) {
+        trace(getErrorMessage(t));
+    }
+
+    /**
      * Prints an error message for the given Throwable.
      * @param t The throwable object causing the error
      * @param stackTrace {@code true}, if the stacktrace should be displayed
@@ -450,6 +472,16 @@ public abstract class Main {
     }
 
     /**
+     * Prints an error message for the given Throwable.
+     * @param t The throwable object causing the error
+     * @param message additional error message
+     * @since 10420
+     */
+    public static void error(Throwable t, String message) {
+        warn(message + ' ' + getErrorMessage(t));
+    }
+
+    /**
      * Prints a warning message for the given Throwable.
      * @param t The throwable object causing the error
      * @param stackTrace {@code true}, if the stacktrace should be displayed
@@ -463,6 +495,16 @@ public abstract class Main {
     }
 
     /**
+     * Prints a warning message for the given Throwable.
+     * @param t The throwable object causing the error
+     * @param message additional error message
+     * @since 10420
+     */
+    public static void warn(Throwable t, String message) {
+        warn(message + ' ' + getErrorMessage(t));
+    }
+
+    /**
      * Returns a human-readable message of error, also usable for developers.
      * @param t The error
      * @return The human-readable error message
@@ -508,42 +550,28 @@ public abstract class Main {
 
     /**
      * Set or clear (if passed <code>null</code>) the map.
+     * <p>
+     * To be removed any time
      * @param map The map to set {@link Main#map} to. Can be null.
+     * @deprecated This is done automatically by {@link MainPanel}
      */
+    @Deprecated
     public final void setMapFrame(final MapFrame map) {
-        MapFrame old = Main.map;
-        panel.setVisible(false);
-        panel.removeAll();
-        if (map != null) {
-            map.fillPanel(panel);
-        } else {
-            old.destroy();
-            panel.add(gettingStarted, BorderLayout.CENTER);
-        }
-        panel.setVisible(true);
-        redoUndoListener.commandChanged(0, 0);
-
-        Main.map = map;
-
-        for (MapFrameListener listener : mapFrameListeners) {
-            listener.mapFrameInitialized(old, map);
-        }
-        if (map == null && currentProgressMonitor != null) {
-            currentProgressMonitor.showForegroundDialog();
-        }
+        Main.warn("setMapFrame call was ignored.");
     }
 
     /**
      * Remove the specified layer from the map. If it is the last layer,
      * remove the map as well.
+     * <p>
+     * To be removed end of 2016
      * @param layer The layer to remove
+     * @deprecated You can remove the layer using {@link #getLayerManager()}
      */
+    @Deprecated
     public final synchronized void removeLayer(final Layer layer) {
         if (map != null) {
             getLayerManager().removeLayer(layer);
-            if (isDisplayingMapView() && getLayerManager().getLayers().isEmpty()) {
-                setMapFrame(null);
-            }
         }
     }
 
@@ -562,10 +590,24 @@ public abstract class Main {
     }
 
     /**
-     * Constructs new {@code Main} object. A lot of global variables are initialized here.
+     * Constructs new {@code Main} object.
+     * @see #initialize()
      */
     public Main() {
         main = this;
+        mainPanel.addMapFrameListener(new MapFrameListener() {
+            @Override
+            public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
+                redoUndoListener.commandChanged(0, 0);
+            }
+        });
+    }
+
+    /**
+     * Initializes the main object. A lot of global variables are initialized here.
+     * @since 10340
+     */
+    public void initialize() {
         isOpenjdk = System.getProperty("java.vm.name").toUpperCase(Locale.ENGLISH).indexOf("OPENJDK") != -1;
         fileWatcher.start();
 
@@ -580,9 +622,7 @@ public abstract class Main {
 
             @Override
             public void initialize() {
-                contentPanePrivate.add(panel, BorderLayout.CENTER);
-                panel.add(gettingStarted, BorderLayout.CENTER);
-                menu = new MainMenu();
+                initializeMainWindow();
             }
         }.call();
 
@@ -617,7 +657,6 @@ public abstract class Main {
             @Override
             public void initialize() {
                 validator = new OsmValidator();
-                getLayerManager().addLayerChangeListener(validator);
             }
         });
 
@@ -714,6 +753,14 @@ public abstract class Main {
         }.call();
     }
 
+    /**
+     * Called once at startup to initialize the main window content.
+     * Should set {@link #menu}
+     */
+    protected void initializeMainWindow() {
+        // can be implementd by subclasses
+    }
+
     private abstract static class InitializationTask implements Callable<Void> {
 
         private final String name;
@@ -751,16 +798,18 @@ public abstract class Main {
      * Add a new layer to the map.
      *
      * If no map exists, create one.
+     * <p>
+     * To be removed end of 2016
      *
      * @param layer the layer
      *
      * @see #addLayer(Layer, ProjectionBounds)
      * @see #addLayer(Layer, ViewportData)
+     * @deprecated You can add the layer to the layer manager: {@link #getLayerManager()}
      */
+    @Deprecated
     public final void addLayer(final Layer layer) {
-        BoundingXYVisitor v = new BoundingXYVisitor();
-        layer.visitBoundingBox(v);
-        addLayer(layer, v.getBounds());
+        addLayer(layer, (ViewportData) null);
     }
 
     /**
@@ -772,7 +821,7 @@ public abstract class Main {
      * @param bounds the bounds of the layer (target zoom area); can be null, then
      * the viewport isn't changed
      */
-    public final synchronized void addLayer(final Layer layer, ProjectionBounds bounds) {
+    public final void addLayer(Layer layer, ProjectionBounds bounds) {
         addLayer(layer, bounds == null ? null : new ViewportData(bounds));
     }
 
@@ -782,43 +831,39 @@ public abstract class Main {
      * If no map exists, create one.
      *
      * @param layer the layer
-     * @param viewport the viewport to zoom to; can be null, then the viewport
-     * isn't changed
+     * @param viewport the viewport to zoom to; can be null, then the viewport isn't changed
      */
-    public final synchronized void addLayer(final Layer layer, ViewportData viewport) {
-        boolean noMap = map == null;
-        if (noMap) {
-            createMapFrame(layer, viewport);
-        }
-        layer.hookUpMapView();
+    public final void addLayer(Layer layer, ViewportData viewport) {
         getLayerManager().addLayer(layer);
-        if (noMap) {
-            Main.map.setVisible(true);
-        } else if (viewport != null) {
-            Main.map.mapView.zoomTo(viewport);
+        if (viewport != null && Main.map.mapView != null) {
+            // MapView may be null in headless mode here.
+            Main.map.mapView.scheduleZoomTo(viewport);
         }
     }
 
+    /**
+     * Creates the map frame. Call only in EDT Thread.
+     * <p>
+     * To be removed any time
+     * @param firstLayer The first layer that was added.
+     * @param viewportData The initial viewport. Can be <code>null</code> to be automatically computed.
+     * @deprecated Not supported. MainPanel does this automatically.
+     */
+    @Deprecated
     public synchronized void createMapFrame(Layer firstLayer, ViewportData viewportData) {
-        MapFrame mapFrame = new MapFrame(contentPanePrivate, viewportData);
-        setMapFrame(mapFrame);
-        if (firstLayer != null) {
-            mapFrame.selectMapMode((MapMode) mapFrame.getDefaultButtonAction(), firstLayer);
-        }
-        mapFrame.initializeDialogsPane();
-        // bootstrapping problem: make sure the layer list dialog is going to
-        // listen to change events of the very first layer
-        //
-        if (firstLayer != null) {
-            firstLayer.addPropertyChangeListener(LayerListDialog.getInstance().getModel());
-        }
+        GuiHelper.assertCallFromEdt();
+        Main.error("createMapFrame() not supported any more.");
     }
 
     /**
      * Replies <code>true</code> if there is an edit layer
+     * <p>
+     * To be removed end of 2016
      *
      * @return <code>true</code> if there is an edit layer
+     * @deprecated You can get the edit layer using the layer manager and then check if it is not null: {@link #getLayerManager()}
      */
+    @Deprecated
     public boolean hasEditLayer() {
         if (getEditLayer() == null) return false;
         return true;
@@ -826,22 +871,28 @@ public abstract class Main {
 
     /**
      * Replies the current edit layer
+     * <p>
+     * To be removed end of 2016
      *
      * @return the current edit layer. <code>null</code>, if no current edit layer exists
+     * @deprecated You can get the edit layer using the layer manager: {@link #getLayerManager()}
      */
+    @Deprecated
     public OsmDataLayer getEditLayer() {
-        if (!isDisplayingMapView()) return null;
         return getLayerManager().getEditLayer();
     }
 
     /**
      * Replies the current data set.
+     * <p>
+     * To be removed end of 2016
      *
      * @return the current data set. <code>null</code>, if no current data set exists
+     * @deprecated You can get the data set using the layer manager: {@link #getLayerManager()}
      */
+    @Deprecated
     public DataSet getCurrentDataSet() {
-        if (!hasEditLayer()) return null;
-        return getEditLayer().data;
+        return getLayerManager().getEditDataSet();
     }
 
     /**
@@ -865,11 +916,14 @@ public abstract class Main {
 
     /**
      * Returns the currently active  layer
+     * <p>
+     * To be removed end of 2016
      *
      * @return the currently active layer. <code>null</code>, if currently no active layer exists
+     * @deprecated You can get the layer using the layer manager: {@link #getLayerManager()}
      */
+    @Deprecated
     public Layer getActiveLayer() {
-        if (!isDisplayingMapView()) return null;
         return getLayerManager().getActiveLayer();
     }
 
@@ -934,10 +988,7 @@ public abstract class Main {
     /**
      * Global panel.
      */
-    public static final JPanel panel = new JPanel(new BorderLayout());
-
-    protected static volatile WindowGeometry geometry;
-    protected static int windowState = JFrame.NORMAL;
+    public static final JPanel panel = mainPanel;
 
     private final CommandQueueListener redoUndoListener = new CommandQueueListener() {
         @Override
@@ -960,25 +1011,25 @@ public abstract class Main {
             UIManager.setLookAndFeel(laf);
         } catch (final NoClassDefFoundError | ClassNotFoundException e) {
             // Try to find look and feel in plugin classloaders
+            Main.trace(e);
             Class<?> klass = null;
             for (ClassLoader cl : PluginHandler.getResourceClassLoaders()) {
                 try {
                     klass = cl.loadClass(laf);
                     break;
                 } catch (ClassNotFoundException ex) {
-                    if (Main.isTraceEnabled()) {
-                        Main.trace(ex.getMessage());
-                    }
+                    Main.trace(ex);
                 }
             }
             if (klass != null && LookAndFeel.class.isAssignableFrom(klass)) {
                 try {
                     UIManager.setLookAndFeel((LookAndFeel) klass.getConstructor().newInstance());
                 } catch (ReflectiveOperationException ex) {
-                    warn("Cannot set Look and Feel: " + laf + ": "+ex.getMessage());
+                    warn(ex, "Cannot set Look and Feel: " + laf + ": "+ex.getMessage());
                 } catch (UnsupportedLookAndFeelException ex) {
                     info("Look and Feel not supported: " + laf);
                     Main.pref.put("laf", defaultlaf);
+                    trace(ex);
                 }
             } else {
                 info("Look and Feel not found: " + laf);
@@ -987,6 +1038,7 @@ public abstract class Main {
         } catch (UnsupportedLookAndFeelException e) {
             info("Look and Feel not supported: " + laf);
             Main.pref.put("laf", defaultlaf);
+            trace(e);
         } catch (InstantiationException | IllegalAccessException e) {
             error(e);
         }
@@ -1012,12 +1064,9 @@ public abstract class Main {
         try {
             CoordinateFormat.setCoordinateFormat(CoordinateFormat.valueOf(Main.pref.get("coordinates")));
         } catch (IllegalArgumentException iae) {
+            Main.trace(iae);
             CoordinateFormat.setCoordinateFormat(CoordinateFormat.DECIMAL_DEGREES);
         }
-
-        geometry = WindowGeometry.mainWindow("gui.geometry",
-            args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null,
-            !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
     }
 
     protected static void postConstructorProcessCmdLine(Map<Option, Collection<String>> args) {
@@ -1106,30 +1155,9 @@ public abstract class Main {
      */
     public static boolean exitJosm(boolean exit, int exitCode) {
         if (Main.saveUnsavedModifications()) {
-            worker.shutdown();
-            ImageProvider.shutdown(false);
-            JCSCacheManager.shutdown();
-            if (geometry != null) {
-                geometry.remember("gui.geometry");
+            if (Main.main != null) {
+                Main.main.shutdown();
             }
-            if (map != null) {
-                map.rememberToggleDialogWidth();
-            }
-            pref.put("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
-            // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask)
-            if (Main.isDisplayingMapView()) {
-                Collection<Layer> layers = new ArrayList<>(getLayerManager().getLayers());
-                for (Layer l: layers) {
-                    Main.main.removeLayer(l);
-                }
-            }
-            try {
-                pref.saveDefaults();
-            } catch (IOException ex) {
-                Main.warn(tr("Failed to save default preferences."));
-            }
-            worker.shutdownNow();
-            ImageProvider.shutdown(true);
 
             if (exit) {
                 System.exit(exitCode);
@@ -1139,6 +1167,24 @@ public abstract class Main {
         return false;
     }
 
+    protected void shutdown() {
+        worker.shutdown();
+        ImageProvider.shutdown(false);
+        JCSCacheManager.shutdown();
+        if (map != null) {
+            map.rememberToggleDialogWidth();
+        }
+        // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask)
+        getLayerManager().resetState();
+        try {
+            pref.saveDefaults();
+        } catch (IOException ex) {
+            Main.warn(ex, tr("Failed to save default preferences."));
+        }
+        worker.shutdownNow();
+        ImageProvider.shutdown(true);
+    }
+
     /**
      * The type of a command line parameter, to be used in switch statements.
      * @see #paramType
@@ -1171,6 +1217,7 @@ public abstract class Main {
                 try {
                     f = new File(new URI(s));
                 } catch (URISyntaxException e) {
+                    Main.warn(e);
                     JOptionPane.showMessageDialog(
                             Main.parent,
                             tr("Ignoring malformed file URL: \"{0}\"", s),
@@ -1288,49 +1335,6 @@ public abstract class Main {
         }
     }
 
-    private static class WindowPositionSizeListener extends WindowAdapter implements ComponentListener {
-        @Override
-        public void windowStateChanged(WindowEvent e) {
-            Main.windowState = e.getNewState();
-        }
-
-        @Override
-        public void componentHidden(ComponentEvent e) {
-            // Do nothing
-        }
-
-        @Override
-        public void componentMoved(ComponentEvent e) {
-            handleComponentEvent(e);
-        }
-
-        @Override
-        public void componentResized(ComponentEvent e) {
-            handleComponentEvent(e);
-        }
-
-        @Override
-        public void componentShown(ComponentEvent e) {
-            // Do nothing
-        }
-
-        private static void handleComponentEvent(ComponentEvent e) {
-            Component c = e.getComponent();
-            if (c instanceof JFrame && c.isVisible()) {
-                if (Main.windowState == JFrame.NORMAL) {
-                    Main.geometry = new WindowGeometry((JFrame) c);
-                } else {
-                    Main.geometry.fixScreen((JFrame) c);
-                }
-            }
-        }
-    }
-
-    protected static void addListener() {
-        parent.addComponentListener(new WindowPositionSizeListener());
-        ((JFrame) parent).addWindowStateListener(new WindowPositionSizeListener());
-    }
-
     /**
      * Determines if JOSM currently runs with Java 8 or later.
      * @return {@code true} if the current JVM is at least Java 8, {@code false} otherwise
@@ -1425,7 +1429,10 @@ public abstract class Main {
     private static void fireProjectionChanged(Projection oldValue, Projection newValue, Bounds oldBounds) {
         if (newValue == null ^ oldValue == null
                 || (newValue != null && oldValue != null && !Objects.equals(newValue.toCode(), oldValue.toCode()))) {
-
+            if (Main.map != null) {
+                // This needs to be called first
+                Main.map.mapView.fixProjection();
+            }
             synchronized (Main.class) {
                 Iterator<WeakReference<ProjectionChangeListener>> it = listeners.iterator();
                 while (it.hasNext()) {
@@ -1658,11 +1665,11 @@ public abstract class Main {
      * @return {@code true} if the listeners collection changed as a result of the call
      */
     public static boolean addMapFrameListener(MapFrameListener listener, boolean fireWhenMapViewPresent) {
-        boolean changed = listener != null && mapFrameListeners.add(listener);
-        if (fireWhenMapViewPresent && changed && map != null) {
-            listener.mapFrameInitialized(null, map);
+        if (fireWhenMapViewPresent) {
+            return mainPanel.addAndFireMapFrameListener(listener);
+        } else {
+            return mainPanel.addMapFrameListener(listener);
         }
-        return changed;
     }
 
     /**
@@ -1672,7 +1679,7 @@ public abstract class Main {
      * @since 5957
      */
     public static boolean addMapFrameListener(MapFrameListener listener) {
-        return addMapFrameListener(listener, false);
+        return mainPanel.addMapFrameListener(listener);
     }
 
     /**
@@ -1682,7 +1689,7 @@ public abstract class Main {
      * @since 5957
      */
     public static boolean removeMapFrameListener(MapFrameListener listener) {
-        return listener != null && mapFrameListeners.remove(listener);
+        return mainPanel.removeMapFrameListener(listener);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/AboutAction.java b/src/org/openstreetmap/josm/actions/AboutAction.java
index 0f29a57..e45fea5 100644
--- a/src/org/openstreetmap/josm/actions/AboutAction.java
+++ b/src/org/openstreetmap/josm/actions/AboutAction.java
@@ -6,7 +6,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.io.BufferedReader;
@@ -15,7 +14,6 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 
 import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
@@ -104,7 +102,7 @@ public final class AboutAction extends JosmAction {
         // Intermediate panel to allow proper optionPane resizing
         JPanel panel = new JPanel(new GridBagLayout());
         panel.setPreferredSize(new Dimension(890, 300));
-        panel.add(new JLabel("", new ImageIcon(ImageProvider.get("logo.svg").getImage().getScaledInstance(256, 258, Image.SCALE_SMOOTH)),
+        panel.add(new JLabel("", ImageProvider.get("logo.svg", ImageProvider.ImageSizes.ABOUT_LOGO),
                 JLabel.CENTER), GBC.std().insets(0, 5, 0, 0));
         panel.add(about, GBC.std().fill());
 
diff --git a/src/org/openstreetmap/josm/actions/AbstractInfoAction.java b/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
index 99731e0..181ae2b 100644
--- a/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
@@ -14,6 +14,7 @@ import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.notes.Note;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
@@ -61,7 +62,7 @@ public abstract class AbstractInfoAction extends JosmAction {
      * @return {@code true} if the user confirms, {@code false} otherwise
      */
     public static boolean confirmLaunchMultiple(int numBrowsers) {
-        String msg  = /* for correct i18n of plural forms - see #9110 */ trn(
+        String msg = /* for correct i18n of plural forms - see #9110 */ trn(
                 "You are about to launch {0} browser window.<br>"
                         + "This may both clutter your screen with browser windows<br>"
                         + "and take some time to finish.",
@@ -98,8 +99,9 @@ public abstract class AbstractInfoAction extends JosmAction {
 
     protected void launchInfoBrowsersForSelectedPrimitivesAndNote() {
         List<OsmPrimitive> primitivesToShow = new ArrayList<>();
-        if (getCurrentDataSet() != null) {
-            primitivesToShow.addAll(getCurrentDataSet().getAllSelected());
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds != null) {
+            primitivesToShow.addAll(ds.getAllSelected());
         }
 
         Note noteToShow = Main.isDisplayingMapView() ? Main.map.noteDialog.getSelectedNote() : null;
@@ -156,7 +158,8 @@ public abstract class AbstractInfoAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        DataSet ds = getLayerManager().getEditDataSet();
+        setEnabled(ds != null && !ds.selectionEmpty());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/AbstractSelectAction.java b/src/org/openstreetmap/josm/actions/AbstractSelectAction.java
index a975073..224d35e 100644
--- a/src/org/openstreetmap/josm/actions/AbstractSelectAction.java
+++ b/src/org/openstreetmap/josm/actions/AbstractSelectAction.java
@@ -18,7 +18,7 @@ public abstract class AbstractSelectAction extends AbstractAction {
      */
     public AbstractSelectAction() {
         putValue(NAME, tr("Select"));
-        putValue(SHORT_DESCRIPTION,  tr("Set the selected elements on the map to the selected items in the list above."));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+        putValue(SHORT_DESCRIPTION, tr("Set the selected elements on the map to the selected items in the list above."));
+        new ImageProvider("dialogs", "select").getResource().attachImageIcon(this, true);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index f857d65..0c36f82 100644
--- a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
@@ -28,6 +28,7 @@ import org.openstreetmap.josm.gui.preferences.imagery.WMSLayerTree;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.imagery.WMSImagery;
 import org.openstreetmap.josm.io.imagery.WMSImagery.LayerDetails;
+import org.openstreetmap.josm.io.imagery.WMSImagery.WMSGetCapabilitiesException;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ImageProvider.ImageResourceCallback;
@@ -62,7 +63,7 @@ public class AddImageryLayerAction extends JosmAction implements AdaptableAction
                                 GuiHelper.runInEDT(new Runnable() {
                                     @Override
                                     public void run() {
-                                        result.getImageIcon(AddImageryLayerAction.this);
+                                        result.attachImageIcon(AddImageryLayerAction.this);
                                     }
                                 });
                             }
@@ -78,7 +79,7 @@ public class AddImageryLayerAction extends JosmAction implements AdaptableAction
             final ImageryInfo infoToAdd = ImageryType.WMS_ENDPOINT.equals(info.getImageryType())
                     ? getWMSLayerInfo() : info;
             if (infoToAdd != null) {
-                Main.main.addLayer(ImageryLayer.create(infoToAdd));
+                Main.getLayerManager().addLayer(ImageryLayer.create(infoToAdd));
                 AlignImageryPanel.addNagPanelIfNeeded(infoToAdd);
             }
         } catch (IllegalArgumentException ex) {
@@ -150,12 +151,12 @@ public class AddImageryLayerAction extends JosmAction implements AdaptableAction
                         tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
             }
             Main.error(ex, false);
-        } catch (WMSImagery.WMSGetCapabilitiesException ex) {
+        } catch (WMSGetCapabilitiesException ex) {
             if (!GraphicsEnvironment.isHeadless()) {
                 JOptionPane.showMessageDialog(Main.parent, tr("Could not parse WMS layer list."),
                         tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
             }
-            Main.error("Could not parse WMS layer list. Incoming data:\n"+ex.getIncomingData());
+            Main.error(ex, "Could not parse WMS layer list. Incoming data:\n"+ex.getIncomingData());
         }
         return null;
     }
diff --git a/src/org/openstreetmap/josm/actions/AddNodeAction.java b/src/org/openstreetmap/josm/actions/AddNodeAction.java
index 4d59411..5cc050f 100644
--- a/src/org/openstreetmap/josm/actions/AddNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/AddNodeAction.java
@@ -64,16 +64,18 @@ public final class AddNodeAction extends JosmAction {
 
         // add the node
         Main.main.undoRedo.add(new AddCommand(nnew));
-        getCurrentDataSet().setSelected(nnew);
-        if (Main.map.mapView.getRealBounds().contains(nnew.getCoor())) {
-            Main.map.mapView.repaint();
-        } else {
-            AutoScaleAction.zoomTo(Collections.<OsmPrimitive>singleton(nnew));
+        getLayerManager().getEditDataSet().setSelected(nnew);
+        if (Main.map.mapView != null) {
+            if (Main.map.mapView.getRealBounds().contains(nnew.getCoor())) {
+                Main.map.mapView.repaint();
+            } else {
+                AutoScaleAction.zoomTo(Collections.<OsmPrimitive>singleton(nnew));
+            }
         }
     }
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
index 0cc39f5..a0a1302 100644
--- a/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
@@ -21,6 +21,7 @@ import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -130,7 +131,7 @@ public final class AlignInCircleAction extends JosmAction {
         if (!isEnabled())
             return;
 
-        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
         List<Node> nodes = new LinkedList<>();
         // fixNodes: All nodes for which the angle relative to center should not be modified
         Set<Node> fixNodes = new HashSet<>();
@@ -270,7 +271,7 @@ public final class AlignInCircleAction extends JosmAction {
                     PolarCoor pcLast = new PolarCoor(nodes.get(j % nodeCount).getEastNorth(), center, 0);
                     delta = pcLast.angle - pcFirst.angle;
                     if (delta < 0) // Assume each PolarCoor.angle is in range ]-pi; pi]
-                        delta +=  2*Math.PI;
+                        delta += 2*Math.PI;
                     delta /= j - i;
                 }
                 for (int k = i+1; k < j; k++) {
@@ -282,7 +283,6 @@ public final class AlignInCircleAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Align Nodes in Circle"), cmds));
-        Main.map.repaint();
     }
 
     /**
@@ -373,7 +373,8 @@ public final class AlignInCircleAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        DataSet ds = getLayerManager().getEditDataSet();
+        setEnabled(ds != null && !ds.selectionEmpty());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/AlignInLineAction.java b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
index 6124979..daa848d 100644
--- a/src/org/openstreetmap/josm/actions/AlignInLineAction.java
+++ b/src/org/openstreetmap/josm/actions/AlignInLineAction.java
@@ -21,6 +21,7 @@ import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -55,9 +56,9 @@ public final class AlignInLineAction extends JosmAction {
     }
 
     /**
-     * InvalidSelection exception has to be raised when action can't be perform
+     * InvalidSelection exception has to be raised when action can't be performed
      */
-    private static class InvalidSelection extends Exception {
+    static class InvalidSelection extends Exception {
 
         /**
          * Create an InvalidSelection exception with default message
@@ -68,7 +69,7 @@ public final class AlignInLineAction extends JosmAction {
 
         /**
          * Create an InvalidSelection exception with specific message
-         * @param msg Message that will be display to the user
+         * @param msg Message that will be displayed to the user
          */
         InvalidSelection(String msg) {
             super(msg);
@@ -168,8 +169,9 @@ public final class AlignInLineAction extends JosmAction {
         if (!isEnabled())
             return;
 
-        List<Node> selectedNodes = new ArrayList<>(getCurrentDataSet().getSelectedNodes());
-        List<Way> selectedWays = new ArrayList<>(getCurrentDataSet().getSelectedWays());
+        DataSet ds = getLayerManager().getEditDataSet();
+        List<Node> selectedNodes = new ArrayList<>(ds.getSelectedNodes());
+        List<Way> selectedWays = new ArrayList<>(ds.getSelectedWays());
 
         try {
             Command cmd;
@@ -202,9 +204,9 @@ public final class AlignInLineAction extends JosmAction {
 
             // Do it!
             Main.main.undoRedo.add(cmd);
-            Main.map.repaint();
 
         } catch (InvalidSelection except) {
+            Main.debug(except);
             new Notification(except.getMessage())
                 .setIcon(JOptionPane.INFORMATION_MESSAGE)
                 .show();
@@ -335,14 +337,14 @@ public final class AlignInLineAction extends JosmAction {
         if (lines.size() == 1)
             return lines.get(0).projectionCommand(node);
         else if (lines.size() == 2)
-            return lines.get(0).intersectionCommand(node,  lines.get(1));
+            return lines.get(0).intersectionCommand(node, lines.get(1));
         throw new InvalidSelection();
     }
 
     /**
      * Class that represent a line
      */
-    private static class Line {
+    static class Line {
 
         /**
          * Line equation ax + by + c = 0
@@ -414,7 +416,8 @@ public final class AlignInLineAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        DataSet ds = getLayerManager().getEditDataSet();
+        setEnabled(ds != null && !ds.selectionEmpty());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/AutoScaleAction.java b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
index ba02d71..fd8fcf8 100644
--- a/src/org/openstreetmap/josm/actions/AutoScaleAction.java
+++ b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
@@ -73,9 +73,11 @@ public class AutoScaleAction extends JosmAction {
      *
      */
     public static void zoomToSelection() {
-        if (Main.main == null || !Main.main.hasEditLayer())
+        DataSet dataSet = Main.getLayerManager().getEditDataSet();
+        if (dataSet == null) {
             return;
-        Collection<OsmPrimitive> sel = Main.main.getEditLayer().data.getSelected();
+        }
+        Collection<OsmPrimitive> sel = dataSet.getSelected();
         if (sel.isEmpty()) {
             JOptionPane.showMessageDialog(
                     Main.parent,
@@ -219,7 +221,7 @@ public class AutoScaleAction extends JosmAction {
      * @return the first selected layer in the layer list dialog
      */
     protected Layer getFirstSelectedLayer() {
-        if (Main.main.getActiveLayer() == null) {
+        if (Main.getLayerManager().getActiveLayer() == null) {
             return null;
         }
         List<Layer> layers = LayerListDialog.getInstance().getModel().getSelectedLayers();
@@ -278,7 +280,10 @@ public class AutoScaleAction extends JosmAction {
     private BoundingXYVisitor modeSelectionOrConflict(BoundingXYVisitor v) {
         Collection<OsmPrimitive> sel = new HashSet<>();
         if ("selection".equals(mode)) {
-            sel = getCurrentDataSet().getSelected();
+            DataSet dataSet = getLayerManager().getEditDataSet();
+            if (dataSet != null) {
+                sel = dataSet.getSelected();
+            }
         } else {
             Conflict<? extends OsmPrimitive> c = Main.map.conflictDialog.getSelectedConflict();
             if (c != null) {
@@ -311,7 +316,7 @@ public class AutoScaleAction extends JosmAction {
         if (lastZoomTime > 0 && System.currentTimeMillis() - lastZoomTime > Main.pref.getLong("zoom.bounds.reset.time", 10L*1000L)) {
             lastZoomTime = -1;
         }
-        final DataSet dataset = getCurrentDataSet();
+        final DataSet dataset = getLayerManager().getEditDataSet();
         if (dataset != null) {
             List<DataSource> dataSources = new ArrayList<>(dataset.getDataSources());
             int s = dataSources.size();
@@ -324,7 +329,7 @@ public class AutoScaleAction extends JosmAction {
                     v.visit(dataSources.get(lastZoomArea).bounds);
                 } else {
                     lastZoomArea = -1;
-                    Area sourceArea = Main.main.getCurrentDataSet().getDataSourceArea();
+                    Area sourceArea = Main.getLayerManager().getEditDataSet().getDataSourceArea();
                     if (sourceArea != null) {
                         v.visit(new Bounds(sourceArea.getBounds2D()));
                     }
@@ -340,9 +345,10 @@ public class AutoScaleAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
+        DataSet ds = getLayerManager().getEditDataSet();
         switch (mode) {
         case "selection":
-            setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+            setEnabled(ds != null && !ds.selectionEmpty());
             break;
         case "layer":
             setEnabled(getFirstSelectedLayer() != null);
@@ -351,7 +357,7 @@ public class AutoScaleAction extends JosmAction {
             setEnabled(Main.map != null && Main.map.conflictDialog.getSelectedConflict() != null);
             break;
         case "download":
-            setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getDataSources().isEmpty());
+            setEnabled(ds != null && !ds.getDataSources().isEmpty());
             break;
         case "problem":
             setEnabled(Main.map != null && Main.map.validatorDialog.getSelectedError() != null);
@@ -363,7 +369,7 @@ public class AutoScaleAction extends JosmAction {
             setEnabled(Main.isDisplayingMapView() && Main.map.mapView.hasZoomRedoEntries());
             break;
         default:
-            setEnabled(!Main.getLayerManager().getLayers().isEmpty());
+            setEnabled(!getLayerManager().getLayers().isEmpty());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/CombineWayAction.java b/src/org/openstreetmap/josm/actions/CombineWayAction.java
index 5176a03..cfcec2d 100644
--- a/src/org/openstreetmap/josm/actions/CombineWayAction.java
+++ b/src/org/openstreetmap/josm/actions/CombineWayAction.java
@@ -27,6 +27,7 @@ import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.TagCollection;
@@ -204,9 +205,10 @@ public class CombineWayAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent event) {
-        if (getCurrentDataSet() == null)
+        final DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null)
             return;
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = ds.getSelected();
         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(selection, Way.class);
         if (selectedWays.size() < 2) {
             new Notification(
@@ -221,6 +223,7 @@ public class CombineWayAction extends JosmAction {
         try {
             combineResult = combineWaysWorker(selectedWays);
         } catch (UserCancelException ex) {
+            Main.trace(ex);
             return;
         }
 
@@ -232,7 +235,7 @@ public class CombineWayAction extends JosmAction {
             Runnable guiTask = new Runnable() {
                 @Override
                 public void run() {
-                    getCurrentDataSet().setSelected(selectedWay);
+                    ds.setSelected(selectedWay);
                 }
             };
             GuiHelper.runInEDT(guiTask);
@@ -241,12 +244,12 @@ public class CombineWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
             return;
         }
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
-        updateEnabledState(selection);
+        updateEnabledState(ds.getSelected());
     }
 
     @Override
@@ -568,7 +571,7 @@ public class CombineWayAction extends JosmAction {
             if (startNode == null)
                 return null;
             Stack<NodePair> path = new Stack<>();
-            Stack<NodePair> nextPairs  = new Stack<>();
+            Stack<NodePair> nextPairs = new Stack<>();
             nextPairs.addAll(getOutboundPairs(startNode));
             while (!nextPairs.isEmpty()) {
                 NodePair cur = nextPairs.pop();
diff --git a/src/org/openstreetmap/josm/actions/CopyAction.java b/src/org/openstreetmap/josm/actions/CopyAction.java
index cc6cb5b..6db64bf 100644
--- a/src/org/openstreetmap/josm/actions/CopyAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyAction.java
@@ -24,7 +24,7 @@ import org.openstreetmap.josm.tools.Utils;
  */
 public final class CopyAction extends JosmAction {
 
-    // regular expression that matches text clipboard contents after copying
+    /** regular expression that matches text clipboard contents after copying */
     public static final String CLIPBOARD_REGEXP = "((node|way|relation)\\s\\d+,)*(node|way|relation)\\s\\d+";
 
     /**
@@ -43,9 +43,9 @@ public final class CopyAction extends JosmAction {
     @Override
     public void actionPerformed(ActionEvent e) {
         if (isEmptySelection()) return;
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
-        copy(getEditLayer(), selection);
+        copy(getLayerManager().getEditLayer(), selection);
     }
 
     /**
@@ -55,7 +55,7 @@ public final class CopyAction extends JosmAction {
      * @param primitives The OSM primitives to copy
      */
     public static void copy(OsmDataLayer source, Collection<OsmPrimitive> primitives) {
-        /* copy ids to the clipboard */
+        // copy ids to the clipboard
         String ids = getCopyString(primitives);
         Utils.copyToClipboard(ids);
 
@@ -63,7 +63,7 @@ public final class CopyAction extends JosmAction {
         Main.pasteSource = source;
     }
 
-    public static String getCopyString(Collection<? extends OsmPrimitive> primitives) {
+    static String getCopyString(Collection<? extends OsmPrimitive> primitives) {
         StringBuilder idsBuilder = new StringBuilder();
         for (OsmPrimitive p : primitives) {
             idsBuilder.append(OsmPrimitiveType.from(p).getAPIName()).append(' ').append(p.getId()).append(',');
@@ -73,11 +73,7 @@ public final class CopyAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
@@ -85,8 +81,8 @@ public final class CopyAction extends JosmAction {
         setEnabled(selection != null && !selection.isEmpty());
     }
 
-    private static boolean isEmptySelection() {
-        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+    private boolean isEmptySelection() {
+        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
         if (sel.isEmpty()) {
             JOptionPane.showMessageDialog(
                     Main.parent,
diff --git a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
index 0656f5b..2394349 100644
--- a/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
+++ b/src/org/openstreetmap/josm/actions/CopyCoordinatesAction.java
@@ -8,6 +8,7 @@ import java.awt.event.KeyEvent;
 import java.util.Collection;
 import java.util.Collections;
 
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -46,11 +47,12 @@ public class CopyCoordinatesAction extends JosmAction {
         updateEnabledState();
     }
 
-    private static Collection<Node> getSelectedNodes() {
-        if (getCurrentDataSet() == null || getCurrentDataSet().getSelected() == null) {
+    private Collection<Node> getSelectedNodes() {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null || ds.getSelected() == null) {
             return Collections.emptyList();
         } else {
-            return Utils.filteredCollection(getCurrentDataSet().getSelected(), Node.class);
+            return Utils.filteredCollection(ds.getSelected(), Node.class);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/CreateCircleAction.java b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
index 490c598..2978476 100644
--- a/src/org/openstreetmap/josm/actions/CreateCircleAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateCircleAction.java
@@ -135,7 +135,7 @@ public final class CreateCircleAction extends JosmAction {
             numberOfNodesInCircle = 100;
         }
 
-        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
         List<Node> nodes = OsmPrimitive.getFilteredList(sel, Node.class);
         List<Way> ways = OsmPrimitive.getFilteredList(sel, Way.class);
 
@@ -165,10 +165,10 @@ public final class CreateCircleAction extends JosmAction {
 
         if (nodes.size() == 2) {
             // diameter: two single nodes needed or a way with two nodes
-            Node   n1 = nodes.get(0);
+            Node n1 = nodes.get(0);
             double x1 = n1.getEastNorth().east();
             double y1 = n1.getEastNorth().north();
-            Node   n2 = nodes.get(1);
+            Node n2 = nodes.get(1);
             double x2 = n2.getEastNorth().east();
             double y2 = n2.getEastNorth().north();
 
@@ -240,7 +240,6 @@ public final class CreateCircleAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Create Circle"), cmds));
-        Main.map.repaint();
     }
 
     /**
@@ -288,11 +287,7 @@ public final class CreateCircleAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
index b7694e8..1ff34ab 100644
--- a/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
+++ b/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
@@ -27,6 +27,7 @@ import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder;
 import org.openstreetmap.josm.data.osm.MultipolygonBuilder.JoinedPolygon;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -69,10 +70,10 @@ public class CreateMultipolygonAction extends JosmAction {
     public CreateMultipolygonAction(final boolean update) {
         super(getName(update), /* ICON */ "multipoly_create", getName(update),
                 /* atleast three lines for each shortcut or the server extractor fails */
-                update  ? Shortcut.registerShortcut("tools:multipoly_update",
+                update ? Shortcut.registerShortcut("tools:multipoly_update",
                             tr("Tool: {0}", getName(true)),
                             KeyEvent.VK_B, Shortcut.CTRL_SHIFT)
-                        : Shortcut.registerShortcut("tools:multipoly_create",
+                       : Shortcut.registerShortcut("tools:multipoly_create",
                             tr("Tool: {0}", getName(false)),
                             KeyEvent.VK_B, Shortcut.CTRL),
                 true, update ? "multipoly_update" : "multipoly_create", true);
@@ -117,12 +118,12 @@ public class CreateMultipolygonAction extends JosmAction {
                             Main.map.relationListDialog.selectRelation(relation);
                             if (Main.pref.getBoolean("multipoly.show-relation-editor", false)) {
                                 //Open relation edit window, if set up in preferences
-                                RelationEditor editor = RelationEditor.getEditor(Main.main.getEditLayer(), relation, null);
+                                RelationEditor editor = RelationEditor.getEditor(Main.getLayerManager().getEditLayer(), relation, null);
 
                                 editor.setModal(true);
                                 editor.setVisible(true);
                             } else {
-                                Main.main.getEditLayer().setRecentRelation(relation);
+                                Main.getLayerManager().getEditLayer().setRecentRelation(relation);
                             }
                         }
                     });
@@ -133,7 +134,8 @@ public class CreateMultipolygonAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!Main.main.hasEditLayer()) {
+        DataSet dataSet = Main.getLayerManager().getEditDataSet();
+        if (dataSet == null) {
             new Notification(
                     tr("No data loaded."))
                     .setIcon(JOptionPane.WARNING_MESSAGE)
@@ -142,7 +144,7 @@ public class CreateMultipolygonAction extends JosmAction {
             return;
         }
 
-        final Collection<Way> selectedWays = Main.main.getCurrentDataSet().getSelectedWays();
+        final Collection<Way> selectedWays = dataSet.getSelectedWays();
 
         if (selectedWays.isEmpty()) {
             // Sometimes it make sense creating multipoly of only one way (so it will form outer way)
@@ -155,7 +157,7 @@ public class CreateMultipolygonAction extends JosmAction {
             return;
         }
 
-        final Collection<Relation> selectedRelations = Main.main.getCurrentDataSet().getSelectedRelations();
+        final Collection<Relation> selectedRelations = dataSet.getSelectedRelations();
         final Relation multipolygonRelation = update
                 ? getSelectedMultipolygonRelation(selectedWays, selectedRelations)
                 : null;
@@ -163,19 +165,20 @@ public class CreateMultipolygonAction extends JosmAction {
         // download incomplete relation or incomplete members if necessary
         if (multipolygonRelation != null) {
             if (!multipolygonRelation.isNew() && multipolygonRelation.isIncomplete()) {
-                Main.worker.submit(new DownloadRelationTask(Collections.singleton(multipolygonRelation), Main.main.getEditLayer()));
+                Main.worker.submit(new DownloadRelationTask(Collections.singleton(multipolygonRelation), Main.getLayerManager().getEditLayer()));
             } else if (multipolygonRelation.hasIncompleteMembers()) {
                 Main.worker.submit(new DownloadRelationMemberTask(multipolygonRelation,
                         DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(Collections.singleton(multipolygonRelation)),
-                        Main.main.getEditLayer()));
+                        Main.getLayerManager().getEditLayer()));
             }
         }
         // create/update multipolygon relation
         Main.worker.submit(new CreateUpdateMultipolygonTask(selectedWays, multipolygonRelation));
     }
 
-    private static Relation getSelectedMultipolygonRelation() {
-        return getSelectedMultipolygonRelation(getCurrentDataSet().getSelectedWays(), getCurrentDataSet().getSelectedRelations());
+    private Relation getSelectedMultipolygonRelation() {
+        DataSet ds = getLayerManager().getEditDataSet();
+        return getSelectedMultipolygonRelation(ds.getSelectedWays(), ds.getSelectedRelations());
     }
 
     private static Relation getSelectedMultipolygonRelation(Collection<Way> selectedWays, Collection<Relation> selectedRelations) {
@@ -259,10 +262,11 @@ public class CreateMultipolygonAction extends JosmAction {
     /** Enable this action only if something is selected */
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
+            updateEnabledState(ds.getSelected());
         }
     }
 
@@ -273,12 +277,13 @@ public class CreateMultipolygonAction extends JosmAction {
       */
     @Override
     protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else if (update) {
             setEnabled(getSelectedMultipolygonRelation() != null);
         } else {
-            setEnabled(!getCurrentDataSet().getSelectedWays().isEmpty());
+            setEnabled(!getLayerManager().getEditDataSet().getSelectedWays().isEmpty());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/DeleteAction.java b/src/org/openstreetmap/josm/actions/DeleteAction.java
index 6b5f4b4..78c1852 100644
--- a/src/org/openstreetmap/josm/actions/DeleteAction.java
+++ b/src/org/openstreetmap/josm/actions/DeleteAction.java
@@ -36,11 +36,7 @@ public final class DeleteAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DeleteLayerAction.java b/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
index 23bcdd8..e7a58b5 100644
--- a/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/DeleteLayerAction.java
@@ -29,14 +29,14 @@ public final class DeleteLayerAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Layer activeLayer = Main.main.getActiveLayer();
+        Layer activeLayer = Main.getLayerManager().getActiveLayer();
         if (activeLayer == null) {
             return;
         }
         if (!Main.saveUnsavedModifications(Collections.singletonList(activeLayer), false)) {
             return;
         }
-        Main.main.removeLayer(activeLayer);
+        Main.getLayerManager().removeLayer(activeLayer);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DistributeAction.java b/src/org/openstreetmap/josm/actions/DistributeAction.java
index cb16e86..10945d7 100644
--- a/src/org/openstreetmap/josm/actions/DistributeAction.java
+++ b/src/org/openstreetmap/josm/actions/DistributeAction.java
@@ -57,7 +57,7 @@ public final class DistributeAction extends JosmAction {
             return;
 
         // Collect user selected objects
-        Collection<OsmPrimitive> selected = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selected = getLayerManager().getEditDataSet().getSelected();
         Collection<Way> ways = new LinkedList<>();
         Collection<Node> nodes = new HashSet<>();
         for (OsmPrimitive osm : selected) {
@@ -97,7 +97,6 @@ public final class DistributeAction extends JosmAction {
 
         // Do it!
         Main.main.undoRedo.add(new SequenceCommand(tr("Distribute Nodes"), cmds));
-        Main.map.repaint();
     }
 
     /**
@@ -299,11 +298,7 @@ public final class DistributeAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java b/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
index 506a5d8..d4cd662 100644
--- a/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
@@ -60,7 +60,7 @@ public class DownloadPrimitiveAction extends JosmAction {
                     GuiHelper.runInEDT(new Runnable() {
                         @Override
                         public void run() {
-                            Main.main.getCurrentDataSet().setSelected(downloaded);
+                            Main.getLayerManager().getEditDataSet().setSelected(downloaded);
                         }
                     });
                 }
diff --git a/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java b/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
index 1e02123..ee536ce 100644
--- a/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
+++ b/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java
@@ -51,7 +51,7 @@ public class DownloadReferrersAction extends JosmAction {
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
             return;
-        OsmDataLayer layer = Main.main.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         if (layer == null)
             return;
         Collection<OsmPrimitive> primitives = layer.data.getSelected();
@@ -60,11 +60,7 @@ public class DownloadReferrersAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/DuplicateAction.java b/src/org/openstreetmap/josm/actions/DuplicateAction.java
index 6c0d1d9..488b119 100644
--- a/src/org/openstreetmap/josm/actions/DuplicateAction.java
+++ b/src/org/openstreetmap/josm/actions/DuplicateAction.java
@@ -28,16 +28,13 @@ public final class DuplicateAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Main.main.menu.paste.pasteData(new PrimitiveDeepCopy(getCurrentDataSet().getSelected()), getEditLayer(), e);
+        Main.main.menu.paste.pasteData(
+                new PrimitiveDeepCopy(getLayerManager().getEditDataSet().getSelected()), getLayerManager().getEditLayer(), e);
     }
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
index fcd933e..c1b144a 100644
--- a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
+++ b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
@@ -16,7 +16,6 @@ import java.util.ServiceConfigurationError;
 import javax.swing.filechooser.FileFilter;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.io.AllFormatsImporter;
 import org.openstreetmap.josm.io.FileExporter;
@@ -34,13 +33,13 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
      * List of supported formats for import.
      * @since 4869
      */
-    public static final ArrayList<FileImporter> importers;
+    private static final ArrayList<FileImporter> importers;
 
     /**
      * List of supported formats for export.
      * @since 4869
      */
-    public static final ArrayList<FileExporter> exporters;
+    private static final ArrayList<FileExporter> exporters;
 
     // add some file types only if the relevant classes are there.
     // this gives us the option to painlessly drop them from the .jar
@@ -66,11 +65,8 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
             try {
                 FileImporter importer = importerClass.getConstructor().newInstance();
                 importers.add(importer);
-                MapView.addLayerChangeListener(importer);
             } catch (ReflectiveOperationException e) {
-                if (Main.isDebugEnabled()) {
-                    Main.debug(e.getMessage());
-                }
+                Main.debug(e);
             } catch (ServiceConfigurationError e) {
                 // error seen while initializing WMSLayerImporter in plugin unit tests:
                 // -
@@ -107,11 +103,9 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
             try {
                 FileExporter exporter = exporterClass.getConstructor().newInstance();
                 exporters.add(exporter);
-                MapView.addLayerChangeListener(exporter);
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(exporter);
             } catch (ReflectiveOperationException e) {
-                if (Main.isDebugEnabled()) {
-                    Main.debug(e.getMessage());
-                }
+                Main.debug(e);
             } catch (ServiceConfigurationError e) {
                 // see above in importers initialization
                 Main.error(e);
@@ -141,6 +135,68 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
     public enum AddArchiveExtension { NONE, BASE, ALL }
 
     /**
+     * Adds a new file importer at the end of the global list. This importer will be evaluated after core ones.
+     * @param importer new file importer
+     * @since 10407
+     */
+    public static void addImporter(FileImporter importer) {
+        if (importer != null) {
+            importers.add(importer);
+        }
+    }
+
+    /**
+     * Adds a new file importer at the beginning of the global list. This importer will be evaluated before core ones.
+     * @param importer new file importer
+     * @since 10407
+     */
+    public static void addImporterFirst(FileImporter importer) {
+        if (importer != null) {
+            importers.add(0, importer);
+        }
+    }
+
+    /**
+     * Adds a new file exporter at the end of the global list. This exporter will be evaluated after core ones.
+     * @param exporter new file exporter
+     * @since 10407
+     */
+    public static void addExporter(FileExporter exporter) {
+        if (exporter != null) {
+            exporters.add(exporter);
+        }
+    }
+
+    /**
+     * Adds a new file exporter at the beginning of the global list. This exporter will be evaluated before core ones.
+     * @param exporter new file exporter
+     * @since 10407
+     */
+    public static void addExporterFirst(FileExporter exporter) {
+        if (exporter != null) {
+            exporters.add(0, exporter);
+        }
+    }
+
+    /**
+     * Returns the list of file importers.
+     * @return unmodifiable list of file importers
+     * @since 10407
+     */
+    public static List<FileImporter> getImporters() {
+        return Collections.unmodifiableList(importers);
+    }
+
+    /**
+     * Returns the list of file exporters.
+     * @return unmodifiable list of file exporters
+     * @since 10407
+     */
+    public static List<FileExporter> getExporters() {
+        return Collections.unmodifiableList(exporters);
+    }
+
+    /**
      * Updates the {@link AllFormatsImporter} that is contained in the importers list. If
      * you do not use the importers variable directly, you don’t need to call this.
      * <p>
diff --git a/src/org/openstreetmap/josm/actions/FollowLineAction.java b/src/org/openstreetmap/josm/actions/FollowLineAction.java
index fd61edc..32aa4f3 100644
--- a/src/org/openstreetmap/josm/actions/FollowLineAction.java
+++ b/src/org/openstreetmap/josm/actions/FollowLineAction.java
@@ -34,6 +34,9 @@ import org.openstreetmap.josm.tools.Utils;
  */
 public class FollowLineAction extends JosmAction {
 
+    /**
+     * Constructs a new {@code FollowLineAction}.
+     */
     public FollowLineAction() {
         super(
                 tr("Follow line"),
@@ -46,11 +49,7 @@ public class FollowLineAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
@@ -60,7 +59,7 @@ public class FollowLineAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent evt) {
-        OsmDataLayer osmLayer = Main.main.getEditLayer();
+        OsmDataLayer osmLayer = Main.getLayerManager().getEditLayer();
         if (osmLayer == null)
             return;
         if (!(Main.map.mapMode instanceof DrawAction)) return; // We are not on draw mode
diff --git a/src/org/openstreetmap/josm/actions/GpxExportAction.java b/src/org/openstreetmap/josm/actions/GpxExportAction.java
index 0fd1650..c23a35f 100644
--- a/src/org/openstreetmap/josm/actions/GpxExportAction.java
+++ b/src/org/openstreetmap/josm/actions/GpxExportAction.java
@@ -84,7 +84,7 @@ public class GpxExportAction extends DiskAccessAction {
         if (file == null)
             return;
 
-        for (FileExporter exporter : ExtensionFileFilter.exporters) {
+        for (FileExporter exporter : ExtensionFileFilter.getExporters()) {
             if (exporter.acceptFile(file, layer)) {
                 try {
                     exporter.exportData(file, layer);
diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
index 6d8f3c5..c22d1fc 100644
--- a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
+++ b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
@@ -36,8 +36,8 @@ public class HistoryInfoAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent ae) {
-        DataSet set = getCurrentDataSet();
-        if (set != null && !set.getAllSelected().isEmpty()) {
+        DataSet set = getLayerManager().getEditDataSet();
+        if (set != null && !set.selectionEmpty()) {
             HistoryBrowserDialogManager.getInstance().showHistory(set.getAllSelected());
         } else {
             HistoryObjectIDDialog dialog = new HistoryObjectIDDialog();
diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
index c282141..a5a65ee 100644
--- a/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
+++ b/src/org/openstreetmap/josm/actions/HistoryInfoWebAction.java
@@ -30,7 +30,7 @@ public class HistoryInfoWebAction extends AbstractInfoAction {
     }
 
     @Override
-    protected  String createInfoUrl(Object infoObject) {
+    protected String createInfoUrl(Object infoObject) {
         if (infoObject instanceof OsmPrimitive) {
             OsmPrimitive primitive = (OsmPrimitive) infoObject;
             return Main.getBaseBrowseUrl() + '/' + OsmPrimitiveType.from(primitive).getAPIName() + '/' + primitive.getId() + "/history";
diff --git a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
index d444d45..a35cac3 100644
--- a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
+++ b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
@@ -136,7 +136,6 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
                 Main.debug(getClass().getName()+" consuming event "+kev);
             }
             kev.consume();
-            Main.map.repaint();
         }
     }
 
@@ -163,7 +162,6 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
         if (offsetDialog != null) {
             offsetDialog.updateOffset();
         }
-        Main.map.repaint();
         prevEastNorth = eastNorth;
     }
 
diff --git a/src/org/openstreetmap/josm/actions/InfoAction.java b/src/org/openstreetmap/josm/actions/InfoAction.java
index 01fc939..05bc692 100644
--- a/src/org/openstreetmap/josm/actions/InfoAction.java
+++ b/src/org/openstreetmap/josm/actions/InfoAction.java
@@ -34,18 +34,19 @@ public class InfoAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent ae) {
-        DataSet set = getCurrentDataSet();
+        DataSet set = getLayerManager().getEditDataSet();
         if (set != null) {
-            new InspectPrimitiveDialog(set.getAllSelected(), Main.main.getEditLayer()).showDialog();
+            new InspectPrimitiveDialog(set.getAllSelected(), Main.getLayerManager().getEditLayer()).showDialog();
         }
     }
 
     @Override
     public void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getAllSelected());
+            updateEnabledState(ds.getAllSelected());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index 86b76f3..9b853c0 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -290,7 +290,7 @@ public class JoinAreasAction extends JosmAction {
          * Get the next way creating a clockwise path, ensure it is the most right way. #7959
          * @return The next way.
          */
-        public  WayInPolygon walk() {
+        public WayInPolygon walk() {
             Node headNode = getHeadNode();
             Node prevNode = getPrevNode();
 
@@ -412,7 +412,7 @@ public class JoinAreasAction extends JosmAction {
      */
     @Override
     public void actionPerformed(ActionEvent e) {
-        join(Main.main.getCurrentDataSet().getSelectedWays());
+        join(Main.getLayerManager().getEditDataSet().getSelectedWays());
     }
 
     /**
@@ -499,7 +499,6 @@ public class JoinAreasAction extends JosmAction {
                 }
                 if (ds != null) {
                     ds.setSelected(allWays);
-                    Main.map.mapView.repaint();
                 }
             } else {
                 new Notification(
@@ -508,6 +507,7 @@ public class JoinAreasAction extends JosmAction {
                         .show();
             }
         } catch (UserCancelException exception) {
+            Main.trace(exception);
             //revert changes
             //FIXME: this is dirty hack
             makeCommitsOneAction(tr("Reverting changes"));
@@ -635,7 +635,7 @@ public class JoinAreasAction extends JosmAction {
 
         // Delete the discarded inner ways
         if (!discardedWays.isEmpty()) {
-            Command deleteCmd = DeleteCommand.delete(Main.main.getEditLayer(), discardedWays, true);
+            Command deleteCmd = DeleteCommand.delete(Main.getLayerManager().getEditLayer(), discardedWays, true);
             if (deleteCmd != null) {
                 cmds.add(deleteCmd);
                 commitCommands(marktr("Delete Ways that are not part of an inner multipolygon"));
@@ -681,6 +681,7 @@ public class JoinAreasAction extends JosmAction {
             commitCommands(marktr("Fix tag conflicts"));
             return true;
         } catch (UserCancelException ex) {
+            Main.trace(ex);
             return false;
         }
     }
@@ -954,7 +955,7 @@ public class JoinAreasAction extends JosmAction {
         List<List<Node>> chunks = buildNodeChunks(way, nodes);
 
         if (chunks.size() > 1) {
-            SplitWayResult split = SplitWayAction.splitWay(getEditLayer(), way, chunks,
+            SplitWayResult split = SplitWayAction.splitWay(getLayerManager().getEditLayer(), way, chunks,
                     Collections.<OsmPrimitive>emptyList(), SplitWayAction.Strategy.keepFirstChunk());
 
             if (split != null) {
@@ -1216,7 +1217,7 @@ public class JoinAreasAction extends JosmAction {
      * @return The newly created outer way
      * @throws UserCancelException if user cancels the operation
      */
-    private Multipolygon  joinPolygon(AssembledMultipolygon polygon) throws UserCancelException {
+    private Multipolygon joinPolygon(AssembledMultipolygon polygon) throws UserCancelException {
         Multipolygon result = new Multipolygon(joinWays(polygon.outerWay.ways));
 
         for (AssembledPolygon pol : polygon.innerWays) {
@@ -1424,7 +1425,7 @@ public class JoinAreasAction extends JosmAction {
     private List<RelationRole> removeFromAllRelations(OsmPrimitive osm) {
         List<RelationRole> result = new ArrayList<>();
 
-        for (Relation r : Main.main.getCurrentDataSet().getRelations()) {
+        for (Relation r : Main.getLayerManager().getEditDataSet().getRelations()) {
             if (r.isDeleted()) {
                 continue;
             }
@@ -1439,7 +1440,7 @@ public class JoinAreasAction extends JosmAction {
                 newRel.setMembers(members);
 
                 cmds.add(new ChangeCommand(r, newRel));
-                RelationRole saverel =  new RelationRole(r, rm.getRole());
+                RelationRole saverel = new RelationRole(r, rm.getRole());
                 if (!result.contains(saverel)) {
                     result.add(saverel);
                 }
@@ -1547,11 +1548,7 @@ public class JoinAreasAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
index 02f6e8d..ab3d135 100644
--- a/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java
@@ -82,13 +82,13 @@ public class JoinNodeWayAction extends JosmAction {
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
             return;
-        Collection<Node> selectedNodes = getCurrentDataSet().getSelectedNodes();
+        Collection<Node> selectedNodes = getLayerManager().getEditDataSet().getSelectedNodes();
         Collection<Command> cmds = new LinkedList<>();
         Map<Way, MultiMap<Integer, Node>> data = new HashMap<>();
 
         // If the user has selected some ways, only join the node to these.
         boolean restrictToSelectedWays =
-                !getCurrentDataSet().getSelectedWays().isEmpty();
+                !getLayerManager().getEditDataSet().getSelectedWays().isEmpty();
 
         // Planning phase: decide where we'll insert the nodes and put it all in "data"
         for (Node node : selectedNodes) {
@@ -159,7 +159,6 @@ public class JoinNodeWayAction extends JosmAction {
 
         if (cmds.isEmpty()) return;
         Main.main.undoRedo.add(new SequenceCommand(getValue(NAME).toString(), cmds));
-        Main.map.repaint();
     }
 
     private static SortedSet<Integer> pruneSuccs(Collection<Integer> is) {
@@ -207,11 +206,7 @@ public class JoinNodeWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/JosmAction.java b/src/org/openstreetmap/josm/actions/JosmAction.java
index 5e450aa..b321ca7 100644
--- a/src/org/openstreetmap/josm/actions/JosmAction.java
+++ b/src/org/openstreetmap/josm/actions/JosmAction.java
@@ -15,12 +15,15 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -28,7 +31,10 @@ import org.openstreetmap.josm.tools.Shortcut;
 /**
  * Base class helper for all Actions in JOSM. Just to make the life easier.
  *
- * A JosmAction is a {@link LayerChangeListener} and a {@link SelectionChangedListener}. Upon
+ * This action allows you to set up an icon, a tooltip text, a globally registered shortcut, register it in the main toolbar and set up
+ * layer/selection listeners that call {@link #updateEnabledState()} whenever the global context is changed.
+ *
+ * A JosmAction can register a {@link LayerChangeListener} and a {@link SelectionChangedListener}. Upon
  * a layer change event or a selection change event it invokes {@link #updateEnabledState()}.
  * Subclasses can override {@link #updateEnabledState()} in order to update the {@link #isEnabled()}-state
  * of a JosmAction depending on the {@link #getCurrentDataSet()} and the current layers
@@ -44,23 +50,10 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
 
     protected transient Shortcut sc;
     private transient LayerChangeAdapter layerChangeAdapter;
+    private transient ActiveLayerChangeAdapter activeLayerChangeAdapter;
     private transient SelectionChangeAdapter selectionChangeAdapter;
 
     /**
-     * Returns the shortcut for this action.
-     * @return the shortcut for this action, or "No shortcut" if none is defined
-     */
-    public Shortcut getShortcut() {
-        if (sc == null) {
-            sc = Shortcut.registerShortcut("core:none", tr("No Shortcut"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
-            // as this shortcut is shared by all action that don't want to have a shortcut,
-            // we shouldn't allow the user to change it...
-            // this is handled by special name "core:none"
-        }
-        return sc;
-    }
-
-    /**
      * Constructs a {@code JosmAction}.
      *
      * @param name the action's text as displayed on the menu (if it is added to a menu)
@@ -79,7 +72,7 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
             String toolbarId, boolean installAdapters) {
         super(name);
         if (icon != null)
-            icon.getResource().getImageIcon(this);
+            icon.getResource().attachImageIcon(this, true);
         setHelpId();
         sc = shortcut;
         if (sc != null) {
@@ -178,13 +171,58 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
         }
     }
 
+    /**
+     * Installs the listeners to this action.
+     * <p>
+     * This should either never be called or only called in the constructor of this action.
+     * <p>
+     * All registered adapters should be removed in {@link #destroy()}
+     */
+    protected void installAdapters() {
+        // make this action listen to layer change and selection change events
+        if (listenToLayerChange()) {
+            layerChangeAdapter = new LayerChangeAdapter();
+            activeLayerChangeAdapter = new ActiveLayerChangeAdapter();
+            getLayerManager().addLayerChangeListener(layerChangeAdapter);
+            getLayerManager().addActiveLayerChangeListener(activeLayerChangeAdapter);
+        }
+        if (listenToSelectionChange()) {
+            selectionChangeAdapter = new SelectionChangeAdapter();
+            DataSet.addSelectionListener(selectionChangeAdapter);
+        }
+        initEnabledState();
+    }
+
+    /**
+     * Overwrite this if {@link #updateEnabledState()} should be called when the active / availabe layers change. Default is true.
+     * @return <code>true</code> if a {@link LayerChangeListener} and a {@link ActiveLayerChangeListener} should be registered.
+     * @since 10353
+     */
+    protected boolean listenToLayerChange() {
+        return true;
+    }
+
+    /**
+     * Overwrite this if {@link #updateEnabledState()} should be called when the selection changed. Default is true.
+     * @return <code>true</code> if a {@link SelectionChangedListener} should be registered.
+     * @since 10353
+     */
+    protected boolean listenToSelectionChange() {
+        return true;
+    }
+
     @Override
     public void destroy() {
         if (sc != null) {
             Main.unregisterActionShortcut(this);
         }
-        MapView.removeLayerChangeListener(layerChangeAdapter);
-        DataSet.removeSelectionListener(selectionChangeAdapter);
+        if (layerChangeAdapter != null) {
+            getLayerManager().removeLayerChangeListener(layerChangeAdapter);
+            getLayerManager().removeActiveLayerChangeListener(activeLayerChangeAdapter);
+        }
+        if (selectionChangeAdapter != null) {
+            DataSet.removeSelectionListener(selectionChangeAdapter);
+        }
     }
 
     private void setHelpId() {
@@ -196,6 +234,20 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
     }
 
     /**
+     * Returns the shortcut for this action.
+     * @return the shortcut for this action, or "No shortcut" if none is defined
+     */
+    public Shortcut getShortcut() {
+        if (sc == null) {
+            sc = Shortcut.registerShortcut("core:none", tr("No Shortcut"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE);
+            // as this shortcut is shared by all action that don't want to have a shortcut,
+            // we shouldn't allow the user to change it...
+            // this is handled by special name "core:none"
+        }
+        return sc;
+    }
+
+    /**
      * Sets the tooltip text of this action.
      * @param tooltip The text to display in tooltip. Can be {@code null}
      */
@@ -206,31 +258,37 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
     }
 
     /**
+     * Gets the layer manager used for this action. Defaults to the main layer manager but you can overwrite this.
+     * <p>
+     * The layer manager must be available when {@link #installAdapters()} is called and must not change.
+     *
+     * @return The layer manager.
+     * @since 10353
+     */
+    public MainLayerManager getLayerManager() {
+        return Main.getLayerManager();
+    }
+
+    /**
      * Replies the current edit layer
      *
      * @return the current edit layer. null, if no edit layer exists
+     * @deprecated Use {@link #getLayerManager()}.getEditLayer() instead. To be removed in end of 2016.
      */
+    @Deprecated
     public static OsmDataLayer getEditLayer() {
-        return Main.main != null ? Main.main.getEditLayer() : null;
+        return Main.getLayerManager().getEditLayer();
     }
 
     /**
      * Replies the current dataset.
      *
      * @return the current dataset. null, if no current dataset exists
+     * @deprecated Use {@link #getLayerManager()}.getEditDataSet() instead. To be removed in end of 2016.
      */
+    @Deprecated
     public static DataSet getCurrentDataSet() {
-        return Main.main != null ? Main.main.getCurrentDataSet() : null;
-    }
-
-    protected void installAdapters() {
-        // make this action listen to layer change and selection change events
-        //
-        layerChangeAdapter = new LayerChangeAdapter();
-        selectionChangeAdapter = new SelectionChangeAdapter();
-        MapView.addLayerChangeListener(layerChangeAdapter);
-        DataSet.addSelectionListener(selectionChangeAdapter);
-        initEnabledState();
+        return Main.getLayerManager().getEditDataSet();
     }
 
     protected static void waitFuture(final Future<?> future, final PleaseWaitProgressMonitor monitor) {
@@ -272,6 +330,7 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
      *
      * @see #updateEnabledState(Collection)
      * @see #initEnabledState()
+     * @see #listenToLayerChange()
      */
     protected void updateEnabledState() {
     }
@@ -285,46 +344,77 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
      *
      * @see #updateEnabledState()
      * @see #initEnabledState()
+     * @see #listenToSelectionChange()
      */
     protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
     }
 
     /**
-     * Adapter for layer change events
-     *
+     * Updates enabled state according to primitives currently selected in edit data set, if any.
+     * Can be called in {@link #updateEnabledState()} implementations.
+     * @since 10409
      */
-    protected class LayerChangeAdapter implements MapView.LayerChangeListener {
-        private void updateEnabledStateInEDT() {
-            GuiHelper.runInEDT(new Runnable() {
-                @Override public void run() {
-                    updateEnabledState();
-                }
-            });
+    protected final void updateEnabledStateOnCurrentSelection() {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
+            setEnabled(false);
+        } else {
+            updateEnabledState(ds.getSelected());
+        }
+    }
+
+    /**
+     * Adapter for layer change events. Runs updateEnabledState() whenever the active layer changed.
+     */
+    protected class LayerChangeAdapter implements LayerChangeListener {
+        @Override
+        public void layerAdded(LayerAddEvent e) {
+            updateEnabledState();
         }
 
         @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-            updateEnabledStateInEDT();
+        public void layerRemoving(LayerRemoveEvent e) {
+            updateEnabledState();
         }
 
         @Override
-        public void layerAdded(Layer newLayer) {
-            updateEnabledStateInEDT();
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            updateEnabledState();
         }
 
         @Override
-        public void layerRemoved(Layer oldLayer) {
-            updateEnabledStateInEDT();
+        public String toString() {
+            return "LayerChangeAdapter [" + JosmAction.this.toString() + ']';
         }
     }
 
     /**
-     * Adapter for selection change events
+     * Adapter for layer change events. Runs updateEnabledState() whenever the active layer changed.
+     */
+    protected class ActiveLayerChangeAdapter implements ActiveLayerChangeListener {
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            updateEnabledState();
+        }
+
+        @Override
+        public String toString() {
+            return "ActiveLayerChangeAdapter [" + JosmAction.this.toString() + ']';
+        }
+    }
+
+    /**
+     * Adapter for selection change events. Runs updateEnabledState() whenever the selection changed.
      */
     protected class SelectionChangeAdapter implements SelectionChangedListener {
         @Override
         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
             updateEnabledState(newSelection);
         }
+
+        @Override
+        public String toString() {
+            return "SelectionChangeAdapter [" + JosmAction.this.toString() + ']';
+        }
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java b/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
index a57e538..12f5bdb 100644
--- a/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
+++ b/src/org/openstreetmap/josm/actions/MapRectifierWMSmenuAction.java
@@ -190,7 +190,7 @@ public class MapRectifierWMSmenuAction extends JosmAction {
                         addWMSLayer(s.name + " (" + text + ')', text);
                         break outer;
                     } catch (IllegalStateException ex) {
-                        Main.error(ex.getMessage());
+                        Main.error(ex, false);
                     }
                 }
 
@@ -233,7 +233,7 @@ public class MapRectifierWMSmenuAction extends JosmAction {
      */
     private static void addWMSLayer(String title, String url) {
         WMSLayer layer = new WMSLayer(new ImageryInfo(title, url));
-        Main.main.addLayer(layer);
+        Main.getLayerManager().addLayer(layer);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/MergeLayerAction.java b/src/org/openstreetmap/josm/actions/MergeLayerAction.java
index 683285f..85f52ef 100644
--- a/src/org/openstreetmap/josm/actions/MergeLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeLayerAction.java
@@ -56,7 +56,7 @@ public class MergeLayerAction extends AbstractMergeAction {
                         GuiHelper.runInEDTAndWait(new Runnable() {
                             @Override
                             public void run() {
-                                Main.main.removeLayer(sourceLayer);
+                                Main.getLayerManager().removeLayer(sourceLayer);
                             }
                         });
                         layerMerged = true;
@@ -114,7 +114,7 @@ public class MergeLayerAction extends AbstractMergeAction {
     }
 
     protected Layer getSourceLayer() {
-        return Main.map != null ? Main.main.getActiveLayer() : null;
+        return Main.map != null ? Main.getLayerManager().getActiveLayer() : null;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/MergeNodesAction.java b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
index d54dedf..05d0e45 100644
--- a/src/org/openstreetmap/josm/actions/MergeNodesAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeNodesAction.java
@@ -25,6 +25,7 @@ import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 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;
 import org.openstreetmap.josm.data.osm.TagCollection;
@@ -67,7 +68,7 @@ public class MergeNodesAction extends JosmAction {
     public void actionPerformed(ActionEvent event) {
         if (!isEnabled())
             return;
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getAllSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getAllSelected();
         List<Node> selectedNodes = OsmPrimitive.getFilteredList(selection, Node.class);
 
         if (selectedNodes.size() == 1) {
@@ -85,10 +86,10 @@ public class MergeNodesAction extends JosmAction {
 
         Node targetNode = selectTargetNode(selectedNodes);
         Node targetLocationNode = selectTargetLocationNode(selectedNodes);
-        Command cmd = mergeNodes(Main.main.getEditLayer(), selectedNodes, targetNode, targetLocationNode);
+        Command cmd = mergeNodes(Main.getLayerManager().getEditLayer(), selectedNodes, targetNode, targetLocationNode);
         if (cmd != null) {
             Main.main.undoRedo.add(cmd);
-            Main.main.getEditLayer().data.setSelected(targetNode);
+            Main.getLayerManager().getEditLayer().data.setSelected(targetNode);
         }
     }
 
@@ -270,7 +271,7 @@ public class MergeNodesAction extends JosmAction {
         Command cmd = mergeNodes(layer, nodes, target, targetLocationNode);
         if (cmd != null) {
             Main.main.undoRedo.add(cmd);
-            getCurrentDataSet().setSelected(target);
+            layer.data.setSelected(target);
         }
     }
 
@@ -344,16 +345,18 @@ public class MergeNodesAction extends JosmAction {
             return new SequenceCommand(/* for correct i18n of plural forms - see #9110 */
                     trn("Merge {0} node", "Merge {0} nodes", nodes.size(), nodes.size()), cmds);
         } catch (UserCancelException ex) {
+            Main.trace(ex);
             return null;
         }
     }
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getAllSelected());
+            updateEnabledState(ds.getAllSelected());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/MergeSelectionAction.java b/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
index 39647d6..ffea86d 100644
--- a/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/MergeSelectionAction.java
@@ -9,6 +9,7 @@ import java.awt.event.KeyEvent;
 import java.util.Collection;
 import java.util.List;
 
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.MergeSourceBuildingVisitor;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
@@ -40,37 +41,40 @@ public class MergeSelectionAction extends AbstractMergeAction {
      * Merge the currently selected objects into another layer.
      */
     public void mergeSelected() {
-        List<Layer> targetLayers = LayerListDialog.getInstance().getModel().getPossibleMergeTargets(getEditLayer());
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        List<Layer> targetLayers = LayerListDialog.getInstance().getModel().getPossibleMergeTargets(editLayer);
         if (targetLayers.isEmpty()) {
-            warnNoTargetLayersForSourceLayer(getEditLayer());
+            warnNoTargetLayersForSourceLayer(editLayer);
             return;
         }
         Layer targetLayer = askTargetLayer(targetLayers);
         if (targetLayer == null)
             return;
-        if (getEditLayer().isUploadDiscouraged() && targetLayer instanceof OsmDataLayer
+        if (editLayer.isUploadDiscouraged() && targetLayer instanceof OsmDataLayer
                 && !((OsmDataLayer) targetLayer).isUploadDiscouraged()
-                && getEditLayer().data.getAllSelected().size() > 1
+                && editLayer.data.getAllSelected().size() > 1
                 && warnMergingUploadDiscouragedObjects(targetLayer)) {
             return;
         }
-        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(getEditLayer().data);
+        MergeSourceBuildingVisitor builder = new MergeSourceBuildingVisitor(editLayer.data);
         ((OsmDataLayer) targetLayer).mergeFrom(builder.build());
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (getEditLayer() == null || getEditLayer().data.getAllSelected().isEmpty())
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        if (editLayer == null || editLayer.data.selectionEmpty())
             return;
         mergeSelected();
     }
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getAllSelected());
+            updateEnabledState(ds.getAllSelected());
         }
     }
 
@@ -84,14 +88,14 @@ public class MergeSelectionAction extends AbstractMergeAction {
      * @param targetLayer Target layer
      * @return true if the user wants to cancel, false if they want to continue
      */
-    public static final boolean warnMergingUploadDiscouragedObjects(Layer targetLayer) {
+    public final boolean warnMergingUploadDiscouragedObjects(Layer targetLayer) {
         return GuiHelper.warnUser(tr("Merging too many objects with different upload policies"),
                 "<html>" +
                 tr("You are about to merge more than 1 object between layers ''{0}'' and ''{1}''.<br /><br />"+
                         "<b>This is not the recommended way of merging such data</b>.<br />"+
                         "You should instead check and merge each object, <b>one by one</b>.<br /><br />"+
                         "Are you sure you want to continue?",
-                        getEditLayer().getName(), targetLayer.getName(), targetLayer.getName())+
+                        getLayerManager().getEditLayer().getName(), targetLayer.getName(), targetLayer.getName())+
                 "</html>",
                 ImageProvider.get("dialogs", "mergedown"), tr("Ignore this hint and merge anyway"));
     }
diff --git a/src/org/openstreetmap/josm/actions/MirrorAction.java b/src/org/openstreetmap/josm/actions/MirrorAction.java
index 6020e02..379afbd 100644
--- a/src/org/openstreetmap/josm/actions/MirrorAction.java
+++ b/src/org/openstreetmap/josm/actions/MirrorAction.java
@@ -44,7 +44,7 @@ public final class MirrorAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
         Set<Node> nodes = new HashSet<>();
 
         for (OsmPrimitive osm : sel) {
@@ -80,16 +80,11 @@ public final class MirrorAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Mirror"), cmds));
-        Main.map.repaint();
     }
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/MoveAction.java b/src/org/openstreetmap/josm/actions/MoveAction.java
index 5fc4d62..9dcea4a 100644
--- a/src/org/openstreetmap/josm/actions/MoveAction.java
+++ b/src/org/openstreetmap/josm/actions/MoveAction.java
@@ -14,6 +14,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
@@ -33,11 +34,11 @@ public class MoveAction extends JosmAction {
     // any better idea?
     private static String calltosupermustbefirststatementinconstructortext(Direction dir) {
         String directiontext;
-        if        (dir == Direction.UP)   {
+        if (dir == Direction.UP) {
             directiontext = tr("up");
-        } else if (dir == Direction.DOWN)  {
+        } else if (dir == Direction.DOWN) {
             directiontext = tr("down");
-        } else if (dir == Direction.LEFT)  {
+        } else if (dir == Direction.LEFT) {
             directiontext = tr("left");
         } else {
             directiontext = tr("right");
@@ -48,15 +49,17 @@ public class MoveAction extends JosmAction {
     // any better idea?
     private static Shortcut calltosupermustbefirststatementinconstructor(Direction dir) {
         Shortcut sc;
-        if        (dir == Direction.UP)   {
-            sc = Shortcut.registerShortcut("core:moveup",    tr("Move objects {0}", tr("up")), KeyEvent.VK_UP,    Shortcut.SHIFT);
-        } else if (dir == Direction.DOWN)  {
-            sc = Shortcut.registerShortcut("core:movedown",  tr("Move objects {0}", tr("down")), KeyEvent.VK_DOWN,  Shortcut.SHIFT);
-        } else if (dir == Direction.LEFT)  {
-            sc = Shortcut.registerShortcut("core:moveleft",  tr("Move objects {0}", tr("left")), KeyEvent.VK_LEFT,  Shortcut.SHIFT);
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        if (dir == Direction.UP) {
+            sc = Shortcut.registerShortcut("core:moveup",    tr("Move objects {0}", tr("up")),    KeyEvent.VK_UP,    Shortcut.SHIFT);
+        } else if (dir == Direction.DOWN) {
+            sc = Shortcut.registerShortcut("core:movedown",  tr("Move objects {0}", tr("down")),  KeyEvent.VK_DOWN,  Shortcut.SHIFT);
+        } else if (dir == Direction.LEFT) {
+            sc = Shortcut.registerShortcut("core:moveleft",  tr("Move objects {0}", tr("left")),  KeyEvent.VK_LEFT,  Shortcut.SHIFT);
         } else { //dir == Direction.RIGHT
             sc = Shortcut.registerShortcut("core:moveright", tr("Move objects {0}", tr("right")), KeyEvent.VK_RIGHT, Shortcut.SHIFT);
         }
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         return sc;
     }
 
@@ -70,11 +73,11 @@ public class MoveAction extends JosmAction {
                 calltosupermustbefirststatementinconstructor(dir), false);
         myDirection = dir;
         putValue("help", ht("/Action/Move"));
-        if        (dir == Direction.UP)   {
+        if (dir == Direction.UP) {
             putValue("toolbar", "action/move/up");
-        } else if (dir == Direction.DOWN)  {
+        } else if (dir == Direction.DOWN) {
             putValue("toolbar", "action/move/down");
-        } else if (dir == Direction.LEFT)  {
+        } else if (dir == Direction.LEFT) {
             putValue("toolbar", "action/move/left");
         } else { //dir == Direction.RIGHT
             putValue("toolbar", "action/move/right");
@@ -113,20 +116,21 @@ public class MoveAction extends JosmAction {
             disty = 0;
         }
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        DataSet ds = getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> selection = ds.getSelected();
         Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
 
         Command c = !Main.main.undoRedo.commands.isEmpty()
         ? Main.main.undoRedo.commands.getLast() : null;
 
-        getCurrentDataSet().beginUpdate();
+        ds.beginUpdate();
         if (c instanceof MoveCommand && affectedNodes.equals(((MoveCommand) c).getParticipatingPrimitives())) {
             ((MoveCommand) c).moveAgain(distx, disty);
         } else {
             c = new MoveCommand(selection, distx, disty);
             Main.main.undoRedo.add(c);
         }
-        getCurrentDataSet().endUpdate();
+        ds.endUpdate();
 
         for (Node n : affectedNodes) {
             if (n.getCoor().isOutSideWorld()) {
@@ -147,11 +151,7 @@ public class MoveAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/MoveNodeAction.java b/src/org/openstreetmap/josm/actions/MoveNodeAction.java
index 60f900c..1a367f1 100644
--- a/src/org/openstreetmap/josm/actions/MoveNodeAction.java
+++ b/src/org/openstreetmap/josm/actions/MoveNodeAction.java
@@ -10,6 +10,7 @@ import java.util.Collection;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.MoveCommand;
 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;
 import org.openstreetmap.josm.gui.dialogs.LatLonDialog;
@@ -32,11 +33,12 @@ public final class MoveNodeAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || (getCurrentDataSet().getSelectedNodes().size() != 1))
+        Collection<Node> selNodes = getLayerManager().getEditDataSet().getSelectedNodes();
+        if (!isEnabled() || selNodes.size() != 1)
             return;
 
         LatLonDialog dialog = new LatLonDialog(Main.parent, tr("Move Node..."), ht("/Action/MoveNode"));
-        Node n = (Node) getCurrentDataSet().getSelectedNodes().toArray()[0];
+        Node n = (Node) selNodes.toArray()[0];
         dialog.setCoordinates(n.getCoor());
         dialog.showDialog();
         if (dialog.getValue() != 1)
@@ -53,10 +55,11 @@ public final class MoveNodeAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
+            updateEnabledState(ds.getSelected());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/NewAction.java b/src/org/openstreetmap/josm/actions/NewAction.java
index ad7d50f..83df28c 100644
--- a/src/org/openstreetmap/josm/actions/NewAction.java
+++ b/src/org/openstreetmap/josm/actions/NewAction.java
@@ -29,6 +29,6 @@ public class NewAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Main.main.addLayer(new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null));
+        Main.getLayerManager().addLayer(new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null));
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/OpenFileAction.java b/src/org/openstreetmap/josm/actions/OpenFileAction.java
index 3c6feff..9dbb0d7 100644
--- a/src/org/openstreetmap/josm/actions/OpenFileAction.java
+++ b/src/org/openstreetmap/josm/actions/OpenFileAction.java
@@ -237,7 +237,7 @@ public class OpenFileAction extends DiskAccessAction {
              */
             FileImporter chosenImporter = null;
             if (fileFilter != null) {
-                for (FileImporter importer : ExtensionFileFilter.importers) {
+                for (FileImporter importer : ExtensionFileFilter.getImporters()) {
                     if (fileFilter.equals(importer.filter)) {
                         chosenImporter = importer;
                     }
@@ -290,7 +290,7 @@ public class OpenFileAction extends DiskAccessAction {
                 List<File> filesWithUnknownImporter = new LinkedList<>();
                 List<File> urlFiles = new LinkedList<>();
                 FILES: for (File f : files) {
-                    for (FileImporter importer : ExtensionFileFilter.importers) {
+                    for (FileImporter importer : ExtensionFileFilter.getImporters()) {
                         if (importer.acceptFile(f)) {
                             importerMap.put(importer, f);
                             continue FILES;
diff --git a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
index 2f0b7a0..973c492 100644
--- a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
+++ b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
@@ -25,6 +25,7 @@ import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -98,7 +99,7 @@ public final class OrthogonalizeAction extends JosmAction {
             if (!isEnabled())
                 return;
             final Collection<Command> commands = new LinkedList<>();
-            final Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+            final Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
             try {
                 for (OsmPrimitive p : sel) {
                     if (!(p instanceof Node)) throw new InvalidUserInputException("selected object is not a node");
@@ -111,11 +112,11 @@ public final class OrthogonalizeAction extends JosmAction {
                 }
                 if (!commands.isEmpty()) {
                     Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize / Undo"), commands));
-                    Main.map.repaint();
                 } else {
                     throw new InvalidUserInputException("Commands are empty");
                 }
             } catch (InvalidUserInputException ex) {
+                Main.debug(ex);
                 new Notification(
                         tr("Orthogonalize Shape / Undo<br>"+
                         "Please select nodes that were moved by the previous Orthogonalize Shape action!"))
@@ -145,13 +146,13 @@ public final class OrthogonalizeAction extends JosmAction {
                 return;
         }
 
-        final Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        final Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
 
         try {
             final SequenceCommand command = orthogonalize(sel);
             Main.main.undoRedo.add(new SequenceCommand(tr("Orthogonalize"), command));
-            Main.map.repaint();
         } catch (InvalidUserInputException ex) {
+            Main.debug(ex);
             String msg;
             if ("usage".equals(ex.getMessage())) {
                 msg = "<h2>" + tr("Usage") + "</h2>" + USAGE;
@@ -190,7 +191,7 @@ public final class OrthogonalizeAction extends JosmAction {
             return new SequenceCommand(tr("Orthogonalize"), commands);
         } else if (wayDataList.isEmpty()) {
             throw new InvalidUserInputException("usage");
-        } else  {
+        } else {
             if (nodeList.size() == 2 || nodeList.isEmpty()) {
                 OrthogonalizeAction.rememberMovements.clear();
                 final Collection<Command> commands = new LinkedList<>();
@@ -400,7 +401,7 @@ public final class OrthogonalizeAction extends JosmAction {
         for (Node n: allNodes) {
             EastNorth tmp = new EastNorth(nX.get(n), nY.get(n));
             tmp = EN.rotateCC(pivot, tmp, headingAll);
-            final double dx = tmp.east()  - n.getEastNorth().east();
+            final double dx = tmp.east() - n.getEastNorth().east();
             final double dy = tmp.north() - n.getEastNorth().north();
             if (headingNodes.contains(n)) { // The heading nodes should not have changed
                 final double epsilon = 1E-6;
@@ -466,7 +467,7 @@ public final class OrthogonalizeAction extends JosmAction {
             EastNorth v = new EastNorth(0., 0.);
             for (int i = 0; i < nSeg; ++i) {
                 EastNorth segment = EN.diff(en[i+1], en[i]);
-                if      (segDirections[i] == Direction.RIGHT) {
+                if (segDirections[i] == Direction.RIGHT) {
                     h = EN.sum(h, segment);
                 } else if (segDirections[i] == Direction.UP) {
                     v = EN.sum(v, segment);
@@ -543,8 +544,8 @@ public final class OrthogonalizeAction extends JosmAction {
             double sinPhi = Math.sin(angle);
             double x = en.east() - pivot.east();
             double y = en.north() - pivot.north();
-            double nx =  cosPhi * x - sinPhi * y + pivot.east();
-            double ny =  sinPhi * x + cosPhi * y + pivot.north();
+            double nx = cosPhi * x - sinPhi * y + pivot.east();
+            double ny = sinPhi * x + cosPhi * y + pivot.north();
             return new EastNorth(nx, ny);
         }
 
@@ -557,7 +558,7 @@ public final class OrthogonalizeAction extends JosmAction {
         }
 
         public static double polar(EastNorth en1, EastNorth en2) {
-            return Math.atan2(en2.north() - en1.north(), en2.east() -  en1.east());
+            return Math.atan2(en2.north() - en1.north(), en2.east() - en1.east());
         }
     }
 
@@ -571,14 +572,14 @@ public final class OrthogonalizeAction extends JosmAction {
      */
     private static int angleToDirectionChange(double a, double deltaMax) throws RejectedAngleException {
         a = standard_angle_mPI_to_PI(a);
-        double d0   = Math.abs(a);
-        double d90  = Math.abs(a - Math.PI / 2);
+        double d0 = Math.abs(a);
+        double d90 = Math.abs(a - Math.PI / 2);
         double dm90 = Math.abs(a + Math.PI / 2);
         int dirChange;
         if (d0 < deltaMax) {
-            dirChange =  0;
+            dirChange = 0;
         } else if (d90 < deltaMax) {
-            dirChange =  1;
+            dirChange = 1;
         } else if (dm90 < deltaMax) {
             dirChange = -1;
         } else {
@@ -616,7 +617,8 @@ public final class OrthogonalizeAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !getCurrentDataSet().getSelected().isEmpty());
+        DataSet ds = getLayerManager().getEditDataSet();
+        setEnabled(ds != null && !ds.selectionEmpty());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
index 6030f29..d0a1b4b 100644
--- a/src/org/openstreetmap/josm/actions/PasteAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAction.java
@@ -112,7 +112,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
             }
         }
 
-        double offsetEast  = mPosition.east() - (maxEast + minEast)/2.0;
+        double offsetEast = mPosition.east() - (maxEast + minEast)/2.0;
         double offsetNorth = mPosition.north() - (maxNorth + minNorth)/2.0;
 
         // Make a copy of pasteBuffer and map from old id to copied data id
@@ -144,7 +144,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
         for (PrimitiveData data:bufferCopy) {
             if (data instanceof NodeData) {
                 NodeData nodeData = (NodeData) data;
-                if (Main.main.getEditLayer() == source) {
+                if (Main.getLayerManager().getEditLayer() == source) {
                     nodeData.setEastNorth(nodeData.getEastNorth().add(offsetEast, offsetNorth));
                 }
             } else if (data instanceof WayData) {
@@ -200,7 +200,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null || Main.pasteBuffer == null) {
+        if (getLayerManager().getEditDataSet() == null || Main.pasteBuffer == null) {
             setEnabled(false);
             return;
         }
diff --git a/src/org/openstreetmap/josm/actions/PasteTagsAction.java b/src/org/openstreetmap/josm/actions/PasteTagsAction.java
index b4c1ced..18791ce 100644
--- a/src/org/openstreetmap/josm/actions/PasteTagsAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteTagsAction.java
@@ -18,6 +18,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -252,7 +253,7 @@ public final class PasteTagsAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
         if (selection.isEmpty())
             return;
@@ -329,12 +330,13 @@ public final class PasteTagsAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
             return;
         }
         // buffer listening slows down the program and is not very good for arbitrary text in buffer
-        setEnabled(!getCurrentDataSet().getSelected().isEmpty());
+        setEnabled(!ds.selectionEmpty());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/PurgeAction.java b/src/org/openstreetmap/josm/actions/PurgeAction.java
index 86a38a1..dcb1e88 100644
--- a/src/org/openstreetmap/josm/actions/PurgeAction.java
+++ b/src/org/openstreetmap/josm/actions/PurgeAction.java
@@ -32,6 +32,7 @@ import javax.swing.JSeparator;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.PurgeCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -63,7 +64,7 @@ public class PurgeAction extends JosmAction {
      */
     public PurgeAction() {
         /* translator note: other expressions for "purge" might be "forget", "clean", "obliterate", "prune" */
-        super(tr("Purge..."), "purge",  tr("Forget objects but do not delete them on server when uploading."),
+        super(tr("Purge..."), "purge", tr("Forget objects but do not delete them on server when uploading."),
                 Shortcut.registerShortcut("system:purge", tr("Edit: {0}", tr("Purge")),
                 KeyEvent.VK_P, Shortcut.CTRL_SHIFT),
                 true);
@@ -93,8 +94,8 @@ public class PurgeAction extends JosmAction {
         if (!isEnabled())
             return;
 
-        Collection<OsmPrimitive> sel = getCurrentDataSet().getAllSelected();
-        layer = Main.main.getEditLayer();
+        Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getAllSelected();
+        layer = Main.getLayerManager().getEditLayer();
 
         toPurge = new HashSet<>(sel);
         toPurgeAdditionally = new ArrayList<>();
@@ -216,11 +217,11 @@ public class PurgeAction extends JosmAction {
             Main.pref.put("purge.clear_undo_redo", clearUndoRedo);
         }
 
-        Main.main.undoRedo.add(new PurgeCommand(Main.main.getEditLayer(), toPurgeChecked, makeIncomplete));
+        Main.main.undoRedo.add(new PurgeCommand(Main.getLayerManager().getEditLayer(), toPurgeChecked, makeIncomplete));
 
         if (clearUndoRedo) {
             Main.main.undoRedo.clean();
-            getCurrentDataSet().clearSelectionHistory();
+            getLayerManager().getEditDataSet().clearSelectionHistory();
         }
     }
 
@@ -271,7 +272,7 @@ public class PurgeAction extends JosmAction {
 
             JButton addToSelection = new JButton(new AbstractAction() {
                 {
-                    putValue(SHORT_DESCRIPTION,   tr("Add to selection"));
+                    putValue(SHORT_DESCRIPTION, tr("Add to selection"));
                     putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
                 }
 
@@ -302,10 +303,11 @@ public class PurgeAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            setEnabled(!(getCurrentDataSet().selectionEmpty()));
+            setEnabled(!ds.selectionEmpty());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ReverseWayAction.java b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
index 032515c..831bcc3 100644
--- a/src/org/openstreetmap/josm/actions/ReverseWayAction.java
+++ b/src/org/openstreetmap/josm/actions/ReverseWayAction.java
@@ -20,6 +20,7 @@ import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.corrector.ReverseWayNoTagCorrector;
 import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -73,12 +74,11 @@ public final class ReverseWayAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled())
-            return;
-        if (getCurrentDataSet() == null)
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (!isEnabled() || ds == null)
             return;
 
-        final Collection<Way> sel = getCurrentDataSet().getSelectedWays();
+        final Collection<Way> sel = ds.getSelectedWays();
         if (sel.isEmpty()) {
             new Notification(
                     tr("Please select at least one way."))
@@ -95,16 +95,17 @@ public final class ReverseWayAction extends JosmAction {
             try {
                 revResult = reverseWay(w);
             } catch (UserCancelException ex) {
+                Main.trace(ex);
                 return;
             }
             c.addAll(revResult.getCommands());
             propertiesUpdated |= !revResult.getTagCorrectionCommands().isEmpty();
         }
         Main.main.undoRedo.add(new SequenceCommand(tr("Reverse ways"), c));
+        // FIXME: This should be handled by undoRedo.
         if (propertiesUpdated) {
-            getCurrentDataSet().fireSelectionChanged();
+            ds.fireSelectionChanged();
         }
-        Main.map.repaint();
     }
 
     /**
@@ -128,10 +129,11 @@ public final class ReverseWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
+            updateEnabledState(ds.getSelected());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/SaveActionBase.java b/src/org/openstreetmap/josm/actions/SaveActionBase.java
index c812e1c..0b64de4 100644
--- a/src/org/openstreetmap/josm/actions/SaveActionBase.java
+++ b/src/org/openstreetmap/josm/actions/SaveActionBase.java
@@ -92,7 +92,7 @@ public abstract class SaveActionBase extends DiskAccessAction {
         try {
             boolean exported = false;
             boolean canceled = false;
-            for (FileExporter exporter : ExtensionFileFilter.exporters) {
+            for (FileExporter exporter : ExtensionFileFilter.getExporters()) {
                 if (exporter.acceptFile(file, layer)) {
                     exporter.exportData(file, layer);
                     exported = true;
diff --git a/src/org/openstreetmap/josm/actions/SelectAllAction.java b/src/org/openstreetmap/josm/actions/SelectAllAction.java
index 128d119..42c6ca5 100644
--- a/src/org/openstreetmap/josm/actions/SelectAllAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectAllAction.java
@@ -7,6 +7,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.tools.Shortcut;
 
 public class SelectAllAction extends JosmAction {
@@ -24,7 +25,8 @@ public class SelectAllAction extends JosmAction {
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
             return;
-        getCurrentDataSet().setSelected(getCurrentDataSet().allNonDeletedCompletePrimitives());
+        DataSet ds = getLayerManager().getEditDataSet();
+        ds.setSelected(ds.allNonDeletedCompletePrimitives());
     }
 
     /**
@@ -33,6 +35,6 @@ public class SelectAllAction extends JosmAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java b/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
index af3fc98..d9d87d0 100644
--- a/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
@@ -37,7 +37,7 @@ public final class SelectByInternalPointAction {
      * @return the surrounding polygons/multipolygons
      */
     public static Collection<OsmPrimitive> getSurroundingObjects(EastNorth internalPoint) {
-        final DataSet ds = JosmAction.getCurrentDataSet();
+        final DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds == null) {
             return Collections.emptySet();
         }
@@ -86,7 +86,7 @@ public final class SelectByInternalPointAction {
      */
     public static void performSelection(EastNorth internalPoint, boolean doAdd, boolean doRemove) {
         final Collection<OsmPrimitive> surroundingObjects = getSurroundingObjects(internalPoint);
-        final DataSet ds = JosmAction.getCurrentDataSet();
+        final DataSet ds = Main.getLayerManager().getEditDataSet();
         if (surroundingObjects.isEmpty()) {
             return;
         } else if (doRemove) {
diff --git a/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java b/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
index 3495434..2904960 100644
--- a/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
+++ b/src/org/openstreetmap/josm/actions/SelectNonBranchingWaySequencesAction.java
@@ -31,7 +31,7 @@ public class SelectNonBranchingWaySequencesAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent ev) {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         SelectNonBranchingWaySequences ws = new SelectNonBranchingWaySequences(ds.getSelectedWays());
         ws.extend(ds);
     }
@@ -43,6 +43,6 @@ public class SelectNonBranchingWaySequencesAction extends JosmAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main.getCurrentDataSet() != null);
+        setEnabled(Main.getLayerManager().getEditDataSet() != null);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/SessionLoadAction.java b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
index cd390f2..6d2b2ee 100644
--- a/src/org/openstreetmap/josm/actions/SessionLoadAction.java
+++ b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
@@ -124,21 +124,17 @@ public class SessionLoadAction extends DiskAccessAction {
 
         private void addLayers() {
             if (layers != null && !layers.isEmpty()) {
-                Layer firstLayer = layers.get(0);
                 boolean noMap = Main.map == null;
-                if (noMap) {
-                    Main.main.createMapFrame(firstLayer, viewport);
-                }
                 for (Layer l : layers) {
                     if (canceled)
                         return;
-                    Main.main.addLayer(l, (ViewportData) null);
+                    Main.getLayerManager().addLayer(l);
                 }
                 if (active != null) {
                     Main.getLayerManager().setActiveLayer(active);
                 }
                 if (noMap) {
-                    Main.map.setVisible(true);
+                    Main.map.mapView.scheduleZoomTo(viewport);
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java b/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
index 5e16b54..f35d095 100644
--- a/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
+++ b/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java
@@ -80,9 +80,7 @@ public class SessionSaveAsAction extends DiskAccessAction implements MapFrameLis
         try {
             saveSession();
         } catch (UserCancelException ignore) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ignore.getMessage());
-            }
+            Main.trace(ignore);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
index 84844c8..99cf774 100644
--- a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
+++ b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
@@ -135,16 +135,14 @@ public final class ShowStatusReportAction extends JosmAction {
                 text.append("VM arguments: ").append(vmArguments.toString().replace("\\\\", "\\")).append('\n');
             }
         } catch (SecurityException e) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
+            Main.trace(e);
         }
         List<String> commandLineArgs = Main.getCommandLineArgs();
         if (!commandLineArgs.isEmpty()) {
             text.append("Program arguments: ").append(Arrays.toString(paramCleanup(commandLineArgs).toArray())).append('\n');
         }
         if (Main.main != null) {
-            DataSet dataset = Main.main.getCurrentDataSet();
+            DataSet dataset = Main.getLayerManager().getEditDataSet();
             if (dataset != null) {
                 String result = DatasetConsistencyTest.runTests(dataset);
                 if (result.isEmpty()) {
diff --git a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
index 98c128f..8a979c3 100644
--- a/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SimplifyWayAction.java
@@ -93,7 +93,7 @@ public class SimplifyWayAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         ds.beginUpdate();
         try {
             List<Way> ways = OsmPrimitive.getFilteredList(ds.getSelected(), Way.class);
@@ -123,7 +123,6 @@ public class SimplifyWayAction extends JosmAction {
         } finally {
             ds.endUpdate();
         }
-        Main.map.repaint();
     }
 
     /**
@@ -136,7 +135,7 @@ public class SimplifyWayAction extends JosmAction {
      * in order to simplify the way.
      */
     protected boolean isRequiredNode(Way way, Node node) {
-        boolean isRequired =  Collections.frequency(way.getNodes(), node) > 1;
+        boolean isRequired = Collections.frequency(way.getNodes(), node) > 1;
         if (!isRequired) {
             List<OsmPrimitive> parents = new LinkedList<>();
             parents.addAll(node.getReferrers());
@@ -275,11 +274,7 @@ public class SimplifyWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/SplitWayAction.java b/src/org/openstreetmap/josm/actions/SplitWayAction.java
index dc017bf..acd0199 100644
--- a/src/org/openstreetmap/josm/actions/SplitWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SplitWayAction.java
@@ -34,6 +34,7 @@ import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
@@ -138,7 +139,7 @@ public class SplitWayAction extends JosmAction {
             return;
         }
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
         List<Node> selectedNodes = OsmPrimitive.getFilteredList(selection, Node.class);
         List<Way> selectedWays = OsmPrimitive.getFilteredList(selection, Way.class);
@@ -194,8 +195,7 @@ public class SplitWayAction extends JosmAction {
         final Way selectedWay = applicableWays.get(0);
         final List<List<Node>> wayChunks = buildSplitChunks(selectedWay, selectedNodes);
         if (wayChunks != null) {
-            List<Relation> selectedRelations =
-                    OsmPrimitive.getFilteredList(selection, Relation.class);
+            List<Relation> selectedRelations = OsmPrimitive.getFilteredList(selection, Relation.class);
             final List<OsmPrimitive> sel = new ArrayList<>(selectedWays.size() + selectedRelations.size());
             sel.addAll(selectedWays);
             sel.addAll(selectedRelations);
@@ -213,9 +213,9 @@ public class SplitWayAction extends JosmAction {
                 }
             }
             if (wayToKeep != null) {
-                final SplitWayResult result = doSplitWay(getEditLayer(), selectedWay, wayToKeep, newWays, sel);
+                final SplitWayResult result = doSplitWay(getLayerManager().getEditLayer(), selectedWay, wayToKeep, newWays, sel);
                 Main.main.undoRedo.add(result.getCommand());
-                getCurrentDataSet().setSelected(result.getNewSelection());
+                getLayerManager().getEditDataSet().setSelected(result.getNewSelection());
             }
         }
     }
@@ -306,10 +306,10 @@ public class SplitWayAction extends JosmAction {
             super.buttonAction(buttonIndex, evt);
             toggleSaveState(); // necessary since #showDialog() does not handle it due to the non-modal dialog
             if (getValue() == 1) {
-                final Way wayToKeep = list.getSelectedValue();
-                final SplitWayResult result = doSplitWay(getEditLayer(), selectedWay, wayToKeep, newWays, selection);
+                SplitWayResult result = doSplitWay(Main.getLayerManager().getEditLayer(),
+                        selectedWay, list.getSelectedValue(), newWays, selection);
                 Main.main.undoRedo.add(result.getCommand());
-                getCurrentDataSet().setSelected(result.getNewSelection());
+                Main.getLayerManager().getEditDataSet().setSelected(result.getNewSelection());
             }
         }
     }
@@ -750,10 +750,11 @@ public class SplitWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
+            updateEnabledState(ds.getSelected());
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/UnGlueAction.java b/src/org/openstreetmap/josm/actions/UnGlueAction.java
index 2ad71b5..6b096fa 100644
--- a/src/org/openstreetmap/josm/actions/UnGlueAction.java
+++ b/src/org/openstreetmap/josm/actions/UnGlueAction.java
@@ -81,7 +81,7 @@ public class UnGlueAction extends JosmAction {
         try {
             unglue(e);
         } catch (UserCancelException ignore) {
-            Main.debug(ignore.getMessage());
+            Main.trace(ignore);
         } finally {
             cleanup();
         }
@@ -89,7 +89,7 @@ public class UnGlueAction extends JosmAction {
 
     protected void unglue(ActionEvent e) throws UserCancelException {
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
         String errMsg = null;
         int errorTime = Notification.TIME_DEFAULT;
@@ -138,7 +138,7 @@ public class UnGlueAction extends JosmAction {
             }
             if (tmpNodes.isEmpty()) {
                 if (selection.size() > 1) {
-                    errMsg =  tr("None of these nodes are glued to anything else.");
+                    errMsg = tr("None of these nodes are glued to anything else.");
                 } else {
                     errMsg = tr("None of this way''s nodes are glued to anything else.");
                 }
@@ -299,17 +299,17 @@ public class UnGlueAction extends JosmAction {
      * @param e event that trigerred the action
      */
     private void unglueOneNodeAtMostOneWay(ActionEvent e) {
-        List<Command> cmds = new LinkedList<>();
-
         final PropertiesMembershipDialog dialog;
         try {
             dialog = PropertiesMembershipDialog.showIfNecessary(Collections.singleton(selectedNode), true);
-        } catch (UserCancelException e1) {
+        } catch (UserCancelException ex) {
+            Main.trace(ex);
             return;
         }
 
         final Node n = new Node(selectedNode, true);
 
+        List<Command> cmds = new LinkedList<>();
         cmds.add(new AddCommand(n));
         if (dialog != null) {
             dialog.update(selectedNode, Collections.singletonList(n), cmds);
@@ -322,7 +322,7 @@ public class UnGlueAction extends JosmAction {
         }
 
         Main.main.undoRedo.add(new SequenceCommand(tr("Unglued Node"), cmds));
-        getCurrentDataSet().setSelected(n);
+        getLayerManager().getEditDataSet().setSelected(n);
         Main.map.mapView.repaint();
     }
 
@@ -512,16 +512,16 @@ public class UnGlueAction extends JosmAction {
      * dupe a single node once, and put the copy on the selected way
      */
     private void unglueWays() {
-        List<Command> cmds = new LinkedList<>();
-        List<Node> newNodes = new LinkedList<>();
-
         final PropertiesMembershipDialog dialog;
         try {
             dialog = PropertiesMembershipDialog.showIfNecessary(Collections.singleton(selectedNode), false);
         } catch (UserCancelException e) {
+            Main.trace(e);
             return;
         }
 
+        List<Command> cmds = new LinkedList<>();
+        List<Node> newNodes = new LinkedList<>();
         if (selectedWay == null) {
             Way wayWithSelectedNode = null;
             LinkedList<Way> parentWays = new LinkedList<>();
@@ -559,11 +559,11 @@ public class UnGlueAction extends JosmAction {
      * @param cmds Commands to execute
      * @param newNodes New created nodes by this set of command
      */
-    private static void execCommands(List<Command> cmds, List<Node> newNodes) {
+    private void execCommands(List<Command> cmds, List<Node> newNodes) {
         Main.main.undoRedo.add(new SequenceCommand(/* for correct i18n of plural forms - see #9110 */
                 trn("Dupe into {0} node", "Dupe into {0} nodes", newNodes.size() + 1L, newNodes.size() + 1L), cmds));
         // select one of the new nodes
-        getCurrentDataSet().setSelected(newNodes.get(0));
+        getLayerManager().getEditDataSet().setSelected(newNodes.get(0));
     }
 
     /**
@@ -572,7 +572,6 @@ public class UnGlueAction extends JosmAction {
      */
     private boolean unglueSelfCrossingWay() {
         // According to previous check, only one valid way through that node
-        List<Command> cmds = new LinkedList<>();
         Way way = null;
         for (Way w: OsmPrimitive.getFilteredList(selectedNode.getReferrers(), Way.class)) {
             if (w.isUsable() && w.getNodesCount() >= 1) {
@@ -582,6 +581,7 @@ public class UnGlueAction extends JosmAction {
         if (way == null) {
             return false;
         }
+        List<Command> cmds = new LinkedList<>();
         List<Node> oldNodes = way.getNodes();
         List<Node> newNodes = new ArrayList<>(oldNodes.size());
         List<Node> addNodes = new ArrayList<>();
@@ -616,7 +616,7 @@ public class UnGlueAction extends JosmAction {
             execCommands(cmds, addNodes);
             return true;
         } catch (UserCancelException ignore) {
-            Main.debug(ignore.getMessage());
+            Main.trace(ignore);
         }
         return false;
     }
@@ -626,17 +626,18 @@ public class UnGlueAction extends JosmAction {
      *
      */
     private void unglueOneWayAnyNodes() {
-        List<Command> cmds = new LinkedList<>();
-        List<Node> allNewNodes = new LinkedList<>();
         Way tmpWay = selectedWay;
 
         final PropertiesMembershipDialog dialog;
         try {
             dialog = PropertiesMembershipDialog.showIfNecessary(selectedNodes, false);
         } catch (UserCancelException e) {
+            Main.trace(e);
             return;
         }
 
+        List<Command> cmds = new LinkedList<>();
+        List<Node> allNewNodes = new LinkedList<>();
         for (Node n : selectedNodes) {
             List<Node> newNodes = new LinkedList<>();
             tmpWay = modifyWay(n, tmpWay, cmds, newNodes);
@@ -651,16 +652,12 @@ public class UnGlueAction extends JosmAction {
         Main.main.undoRedo.add(new SequenceCommand(
                 trn("Dupe {0} node into {1} nodes", "Dupe {0} nodes into {1} nodes",
                         selectedNodes.size(), selectedNodes.size(), selectedNodes.size()+allNewNodes.size()), cmds));
-        getCurrentDataSet().setSelected(allNewNodes);
+        getLayerManager().getEditDataSet().setSelected(allNewNodes);
     }
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
index 71444da..0e52890 100644
--- a/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
+++ b/src/org/openstreetmap/josm/actions/UnJoinNodeWayAction.java
@@ -46,7 +46,7 @@ public class UnJoinNodeWayAction extends JosmAction {
     @Override
     public void actionPerformed(ActionEvent e) {
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
         List<Node> selectedNodes = OsmPrimitive.getFilteredList(selection, Node.class);
         List<Way> selectedWays = OsmPrimitive.getFilteredList(selection, Way.class);
@@ -90,7 +90,6 @@ public class UnJoinNodeWayAction extends JosmAction {
 
         // I'm sure there's a better way to handle this
         Main.main.undoRedo.add(new RemoveNodesCommand(selectedWay, selectedNodes));
-        Main.map.repaint();
     }
 
     /**
@@ -185,11 +184,7 @@ public class UnJoinNodeWayAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
-            setEnabled(false);
-        } else {
-            updateEnabledState(getCurrentDataSet().getSelected());
-        }
+        updateEnabledStateOnCurrentSelection();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/UnselectAllAction.java b/src/org/openstreetmap/josm/actions/UnselectAllAction.java
index f75ab29..ca8cef4 100644
--- a/src/org/openstreetmap/josm/actions/UnselectAllAction.java
+++ b/src/org/openstreetmap/josm/actions/UnselectAllAction.java
@@ -26,7 +26,7 @@ public class UnselectAllAction extends JosmAction {
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled())
             return;
-        getCurrentDataSet().setSelected();
+        getLayerManager().getEditDataSet().setSelected();
     }
 
     /**
@@ -34,6 +34,6 @@ public class UnselectAllAction extends JosmAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/UpdateDataAction.java b/src/org/openstreetmap/josm/actions/UpdateDataAction.java
index f608448..f36ff4b 100644
--- a/src/org/openstreetmap/josm/actions/UpdateDataAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateDataAction.java
@@ -14,6 +14,7 @@ import java.util.concurrent.Future;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadTaskList;
 import org.openstreetmap.josm.data.DataSource;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -39,25 +40,23 @@ public class UpdateDataAction extends JosmAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null && !Main.isOffline(OnlineResource.OSM_API));
+        setEnabled(getLayerManager().getEditLayer() != null && !Main.isOffline(OnlineResource.OSM_API));
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled())
-            return;
-        if (getEditLayer() == null)
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        if (!isEnabled() || editLayer == null)
             return;
 
         List<Area> areas = new ArrayList<>();
-        for (DataSource ds : getEditLayer().data.dataSources) {
+        for (DataSource ds : editLayer.data.dataSources) {
             areas.add(new Area(ds.bounds.asRect()));
         }
 
         // The next two blocks removes every intersection from every DataSource Area
         // This prevents downloading the same data numerous times at intersections
-        // and also skips smaller bounding boxes that are contained within larger ones
-        // entirely.
+        // and also skips smaller bounding boxes that are contained within larger ones entirely.
         for (int i = 0; i < areas.size(); i++) {
             for (int j = i+1; j < areas.size(); j++) {
                 areas.get(i).subtract(areas.get(j));
@@ -79,13 +78,10 @@ public class UpdateDataAction extends JosmAction {
         }
 
         if (areasToDownload.isEmpty()) {
-            // no bounds defined in the dataset? we update all primitives in the data set
-            // using a series of multi fetch requests
-            //
-            UpdateSelectionAction.updatePrimitives(getEditLayer().data.allPrimitives());
+            // no bounds defined in the dataset? we update all primitives in the data set using a series of multi fetch requests
+            UpdateSelectionAction.updatePrimitives(editLayer.data.allPrimitives());
         } else {
             // bounds defined? => use the bbox downloader
-            //
             final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(tr("Download data"));
             final Future<?> future = new DownloadTaskList().download(false /* no new layer */, areasToDownload, true, false, monitor);
             waitFuture(future, monitor);
diff --git a/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java b/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
index 54dba0d..b8ea708 100644
--- a/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateModifiedAction.java
@@ -9,6 +9,7 @@ import java.util.Collection;
 import java.util.Collections;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -44,7 +45,7 @@ public class UpdateModifiedAction extends UpdateSelectionAction {
     //
     @Override
     protected void updateEnabledState() {
-        setEnabled(getCurrentDataSet() != null && !Main.isOffline(OnlineResource.OSM_API));
+        setEnabled(getLayerManager().getEditDataSet() != null && !Main.isOffline(OnlineResource.OSM_API));
     }
 
     @Override
@@ -54,7 +55,7 @@ public class UpdateModifiedAction extends UpdateSelectionAction {
 
     @Override
     public Collection<OsmPrimitive> getData() {
-        if (getCurrentDataSet() == null) return Collections.emptyList();
-        return getCurrentDataSet().allModifiedPrimitives();
+        DataSet ds = getLayerManager().getEditDataSet();
+        return ds == null ? Collections.<OsmPrimitive>emptyList() : ds.allModifiedPrimitives();
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
index 7159c36..9dbb7ec 100644
--- a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
@@ -40,10 +40,10 @@ public class UpdateSelectionAction extends JosmAction {
      */
     public static void handlePrimitiveGoneException(long id, OsmPrimitiveType type) {
         MultiFetchServerObjectReader reader = MultiFetchServerObjectReader.create();
-        reader.append(getCurrentDataSet(), id, type);
+        reader.append(Main.getLayerManager().getEditDataSet(), id, type);
         try {
             DataSet ds = reader.parseOsm(NullProgressMonitor.INSTANCE);
-            Main.main.getEditLayer().mergeFrom(ds);
+            Main.getLayerManager().getEditLayer().mergeFrom(ds);
         } catch (OsmTransferException e) {
             ExceptionDialogUtil.explainException(e);
         }
@@ -57,8 +57,7 @@ public class UpdateSelectionAction extends JosmAction {
      *
      */
     public static void updatePrimitives(final Collection<OsmPrimitive> selection) {
-        UpdatePrimitivesTask task = new UpdatePrimitivesTask(Main.main.getEditLayer(), selection);
-        Main.worker.submit(task);
+        Main.worker.submit(new UpdatePrimitivesTask(Main.getLayerManager().getEditLayer(), selection));
     }
 
     /**
@@ -72,9 +71,9 @@ public class UpdateSelectionAction extends JosmAction {
      */
     public static void updatePrimitive(PrimitiveId id) {
         ensureParameterNotNull(id, "id");
-        if (getEditLayer() == null)
+        if (Main.getLayerManager().getEditLayer() == null)
             throw new IllegalStateException(tr("No current dataset found"));
-        OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id);
+        OsmPrimitive primitive = Main.getLayerManager().getEditLayer().data.getPrimitiveById(id);
         if (primitive == null)
             throw new IllegalStateException(tr("Did not find an object with id {0} in the current dataset", id));
         updatePrimitives(Collections.singleton(primitive));
@@ -113,10 +112,11 @@ public class UpdateSelectionAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getAllSelected());
+            updateEnabledState(ds.getAllSelected());
         }
     }
 
@@ -147,6 +147,6 @@ public class UpdateSelectionAction extends JosmAction {
      * @return the data on which this action operates
      */
     public Collection<OsmPrimitive> getData() {
-        return getCurrentDataSet().getAllSelected();
+        return getLayerManager().getEditDataSet().getAllSelected();
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/UploadAction.java b/src/org/openstreetmap/josm/actions/UploadAction.java
index af487c4..19d3cc8 100644
--- a/src/org/openstreetmap/josm/actions/UploadAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadAction.java
@@ -125,6 +125,9 @@ public class UploadAction extends JosmAction {
         }
     }
 
+    /**
+     * Constructs a new {@code UploadAction}.
+     */
     public UploadAction() {
         super(tr("Upload data"), "upload", tr("Upload all changes in the active data layer to the OSM server"),
                 Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload data")), KeyEvent.VK_UP, Shortcut.CTRL_SHIFT), true);
@@ -137,7 +140,7 @@ public class UploadAction extends JosmAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 
     public static boolean checkPreUploadConditions(AbstractModifiableLayer layer) {
@@ -264,7 +267,7 @@ public class UploadAction extends JosmAction {
             );
             return;
         }
-        APIDataSet apiData = new APIDataSet(Main.main.getCurrentDataSet());
-        uploadData(Main.main.getEditLayer(), apiData);
+        APIDataSet apiData = new APIDataSet(Main.getLayerManager().getEditDataSet());
+        uploadData(Main.getLayerManager().getEditLayer(), apiData);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/UploadNotesAction.java b/src/org/openstreetmap/josm/actions/UploadNotesAction.java
index 3a2f6d9..f2f6736 100644
--- a/src/org/openstreetmap/josm/actions/UploadNotesAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadNotesAction.java
@@ -25,7 +25,7 @@ public class UploadNotesAction extends JosmAction {
     public UploadNotesAction() {
         putValue(SHORT_DESCRIPTION, tr("Upload note changes to server"));
         putValue(NAME, tr("Upload notes"));
-        putValue(SMALL_ICON, ImageProvider.get("upload"));
+        new ImageProvider("upload").getResource().attachImageIcon(this, true);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
index 8a32702..7257aff 100644
--- a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
@@ -57,10 +57,11 @@ public class UploadSelectionAction extends JosmAction {
 
     @Override
     protected void updateEnabledState() {
-        if (getCurrentDataSet() == null) {
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) {
             setEnabled(false);
         } else {
-            updateEnabledState(getCurrentDataSet().getAllSelected());
+            updateEnabledState(ds.getAllSelected());
         }
     }
 
@@ -93,15 +94,16 @@ public class UploadSelectionAction extends JosmAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
         if (!isEnabled())
             return;
-        if (getEditLayer().isUploadDiscouraged()) {
-            if (UploadAction.warnUploadDiscouraged(getEditLayer())) {
+        if (editLayer.isUploadDiscouraged()) {
+            if (UploadAction.warnUploadDiscouraged(editLayer)) {
                 return;
             }
         }
-        Collection<OsmPrimitive> modifiedCandidates = getModifiedPrimitives(getEditLayer().data.getAllSelected());
-        Collection<OsmPrimitive> deletedCandidates = getDeletedPrimitives(getEditLayer().data);
+        Collection<OsmPrimitive> modifiedCandidates = getModifiedPrimitives(editLayer.data.getAllSelected());
+        Collection<OsmPrimitive> deletedCandidates = getDeletedPrimitives(editLayer.data);
         if (modifiedCandidates.isEmpty() && deletedCandidates.isEmpty()) {
             JOptionPane.showMessageDialog(
                     Main.parent,
@@ -129,7 +131,7 @@ public class UploadSelectionAction extends JosmAction {
             );
             return;
         }
-        uploadPrimitives(getEditLayer(), toUpload);
+        uploadPrimitives(editLayer, toUpload);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/ValidateAction.java b/src/org/openstreetmap/josm/actions/ValidateAction.java
index d3efb22..094af62 100644
--- a/src/org/openstreetmap/josm/actions/ValidateAction.java
+++ b/src/org/openstreetmap/josm/actions/ValidateAction.java
@@ -72,9 +72,9 @@ public class ValidateAction extends JosmAction {
 
         Collection<OsmPrimitive> selection;
         if (getSelectedItems) {
-            selection = Main.main.getCurrentDataSet().getAllSelected();
+            selection = Main.getLayerManager().getEditDataSet().getAllSelected();
             if (selection.isEmpty()) {
-                selection = Main.main.getCurrentDataSet().allNonDeletedPrimitives();
+                selection = Main.getLayerManager().getEditDataSet().allNonDeletedPrimitives();
                 lastSelection = null;
             } else {
                 AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor();
@@ -83,7 +83,7 @@ public class ValidateAction extends JosmAction {
             }
         } else {
             if (lastSelection == null) {
-                selection = Main.main.getCurrentDataSet().allNonDeletedPrimitives();
+                selection = Main.getLayerManager().getEditDataSet().allNonDeletedPrimitives();
             } else {
                 selection = lastSelection;
             }
@@ -95,7 +95,7 @@ public class ValidateAction extends JosmAction {
 
     @Override
     public void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 
     @Override
@@ -125,7 +125,7 @@ public class ValidateAction extends JosmAction {
         ValidationTask(Collection<Test> tests, Collection<OsmPrimitive> validatedPrimitives,
                 Collection<OsmPrimitive> formerValidatedPrimitives) {
             super(tr("Validating"), false /*don't ignore exceptions */);
-            this.validatedPrimitives  = validatedPrimitives;
+            this.validatedPrimitives = validatedPrimitives;
             this.formerValidatedPrimitives = formerValidatedPrimitives;
             this.tests = tests;
         }
@@ -141,12 +141,12 @@ public class ValidateAction extends JosmAction {
 
             // update GUI on Swing EDT
             //
-            GuiHelper.runInEDT(new Runnable()  {
+            GuiHelper.runInEDT(new Runnable() {
                 @Override
                 public void run() {
                     Main.map.validatorDialog.tree.setErrors(errors);
                     Main.map.validatorDialog.unfurlDialog();
-                    Main.main.getCurrentDataSet().fireSelectionChanged();
+                    Main.getLayerManager().getEditDataSet().fireSelectionChanged();
                 }
             });
         }
diff --git a/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java b/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
index 1c96710..13c232a 100644
--- a/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/ViewportFollowToggleAction.java
@@ -41,6 +41,6 @@ public class ViewportFollowToggleAction extends ToggleAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main.hasEditLayer());
+        setEnabled(Main.getLayerManager().getEditDataSet() != null);
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/WireframeToggleAction.java b/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
index 474cb7e..95c7cb8 100644
--- a/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
+++ b/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
@@ -36,7 +36,7 @@ public class WireframeToggleAction extends ToggleAction {
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(Main.main.hasEditLayer());
+        setEnabled(Main.getLayerManager().getEditLayer() != null);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/ZoomToAction.java b/src/org/openstreetmap/josm/actions/ZoomToAction.java
index 42d82ff..12291b3 100644
--- a/src/org/openstreetmap/josm/actions/ZoomToAction.java
+++ b/src/org/openstreetmap/josm/actions/ZoomToAction.java
@@ -11,16 +11,20 @@ import javax.swing.event.ListSelectionListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListTable;
 import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable;
 import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class ZoomToAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+public class ZoomToAction extends AbstractAction implements LayerChangeListener, ActiveLayerChangeListener, ListSelectionListener {
 
     private final OsmPrimitivesTable table;
 
@@ -77,7 +81,7 @@ public class ZoomToAction extends AbstractAction implements LayerChangeListener,
     }
 
     protected final void updateEnabledState() {
-        if (Main.main == null || Main.main.getEditLayer() != this.table.getLayer()) {
+        if (Main.main == null || Main.getLayerManager().getEditLayer() != this.table.getLayer()) {
             setEnabled(false);
             putValue(SHORT_DESCRIPTION, descriptionInactiveLayer);
             return;
@@ -97,17 +101,22 @@ public class ZoomToAction extends AbstractAction implements LayerChangeListener,
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         updateEnabledState();
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         updateEnabledState();
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         updateEnabledState();
     }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // Do nothing
+    }
 }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
index b9df7b5..a0b40cc 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
@@ -75,6 +75,7 @@ public class ChangesetContentDownloadTask extends AbstractChangesetDownloadTask
             } catch (OsmTransferCanceledException e) {
                 // the download was canceled by the user. This exception is caught if the user canceled the authentication dialog.
                 setCanceled(true);
+                Main.trace(e);
                 return;
             } catch (OsmTransferException e) {
                 if (isCanceled())
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
index 14702ef..ea1266c 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
@@ -70,7 +70,8 @@ public class ChangesetQueryTask extends AbstractChangesetDownloadTask {
             } catch (OsmTransferCanceledException e) {
                 // thrown if user cancel the authentication dialog
                 setCanceled(true);
-            }  catch (OsmTransferException e) {
+                Main.trace(e);
+            } catch (OsmTransferException e) {
                 if (isCanceled())
                     return;
                 rememberLastException(e);
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
index 024b189..33d467a 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
@@ -12,6 +12,7 @@ import java.util.regex.Pattern;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Bounds.ParseMethod;
+import org.openstreetmap.josm.data.ViewportData;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -140,14 +141,13 @@ public class DownloadGpsTask extends AbstractDownloadTask<GpxData> {
         private <L extends Layer> L addOrMergeLayer(L layer, L mergeLayer) {
             if (layer == null) return null;
             if (newLayer || mergeLayer == null) {
-                if (Main.main != null) {
-                    Main.main.addLayer(layer);
-                }
+                Main.getLayerManager().addLayer(layer);
                 return layer;
             } else {
                 mergeLayer.mergeFrom(layer);
+                mergeLayer.invalidate();
                 if (Main.map != null) {
-                    Main.map.repaint();
+                    Main.map.mapView.scheduleZoomTo(new ViewportData(layer.getViewProjectionBounds()));
                 }
                 return mergeLayer;
             }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
index bdc48a4..40096b5 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
@@ -20,6 +20,7 @@ import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.NoteLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.BoundingBoxDownloader;
+import org.openstreetmap.josm.io.BoundingBoxDownloader.MoreNotesException;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.OsmServerLocationReader;
 import org.openstreetmap.josm.io.OsmServerReader;
@@ -116,7 +117,7 @@ public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
             if (!noteLayers.isEmpty()) {
                 noteLayers.get(0).getNoteData().addNotes(notesData);
             } else {
-                Main.main.addLayer(new NoteLayer(notesData, tr("Notes")));
+                Main.getLayerManager().addLayer(new NoteLayer(notesData, tr("Notes")));
             }
         }
 
@@ -146,7 +147,8 @@ public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
             ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
             try {
                 notesData = reader.parseNotes(DOWNLOAD_LIMIT.get(), DAYS_CLOSED.get(), subMonitor);
-            } catch (BoundingBoxDownloader.MoreNotesException e) {
+            } catch (MoreNotesException e) {
+                Main.debug(e);
                 notesData = e.notes;
                 JOptionPane.showMessageDialog(Main.parent, "<html>"
                                 + trn("{0} note has been downloaded.", "{0} notes have been downloaded.", e.limit, e.limit)
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
index 3d9238a..7c3d819 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
@@ -180,7 +180,7 @@ public class DownloadOsmChangeTask extends DownloadOsmTask {
                         try {
                             data.setVisible(hp.isVisible());
                         } catch (IllegalStateException e) {
-                            Main.error("Cannot change visibility for "+p+": "+e.getMessage());
+                            Main.error(e, "Cannot change visibility for "+p+':');
                         }
                         data.setTimestamp(hp.getTimestamp());
                         data.setKeys(hp.getTags());
@@ -192,7 +192,7 @@ public class DownloadOsmChangeTask extends DownloadOsmTask {
                             // Forget this primitive
                             it.remove();
                         } catch (AssertionError e) {
-                            Main.error("Cannot load "+p + ": " + e.getMessage());
+                            Main.error(e, "Cannot load "+p+':');
                         }
                     }
                 }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
index 23f2d3b..a528e2a 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmCompressedTask.java
@@ -18,7 +18,7 @@ import org.openstreetmap.josm.io.OsmTransferException;
  */
 public class DownloadOsmCompressedTask extends DownloadOsmTask {
 
-    private static final String PATTERN_COMPRESS =  "https?://.*/.*\\.osm.(gz|bz2?|zip)";
+    private static final String PATTERN_COMPRESS = "https?://.*/.*\\.osm.(gz|bz2?|zip)";
 
     @Override
     public String[] getPatterns() {
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
index 2fbbd13..9ac3c2b 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
@@ -36,10 +36,12 @@ import org.xml.sax.SAXException;
  */
 public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     protected static final String PATTERN_OSM_API_URL           = "https?://.*/api/0.6/(map|nodes?|ways?|relations?|\\*).*";
     protected static final String PATTERN_OVERPASS_API_URL      = "https?://.*/interpreter\\?data=.*";
     protected static final String PATTERN_OVERPASS_API_XAPI_URL = "https?://.*/xapi(\\?.*\\[@meta\\]|_meta\\?).*";
     protected static final String PATTERN_EXTERNAL_OSM_FILE     = "https?://.*/.*\\.osm";
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     protected Bounds currentBounds;
     protected DownloadTask downloadTask;
@@ -211,7 +213,7 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
 
         protected OsmDataLayer getEditLayer() {
             if (!Main.isDisplayingMapView()) return null;
-            return Main.main.getEditLayer();
+            return Main.getLayerManager().getEditLayer();
         }
 
         protected int getNumDataLayers() {
@@ -250,7 +252,7 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
             Main.map.mapView.zoomTo(v);
         }
 
-        protected OsmDataLayer addNewLayerIfRequired(String newLayerName, Bounds bounds) {
+        protected OsmDataLayer addNewLayerIfRequired(String newLayerName) {
             int numDataLayers = getNumDataLayers();
             if (newLayer || numDataLayers == 0 || (numDataLayers > 1 && getEditLayer() == null)) {
                 // the user explicitly wants a new layer, we don't have any layer at all
@@ -258,14 +260,14 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
                 //
                 final OsmDataLayer layer = createNewLayer(newLayerName);
                 if (Main.main != null)
-                    Main.main.addLayer(layer, computeBbox(bounds));
+                    Main.getLayerManager().addLayer(layer);
                 return layer;
             }
             return null;
         }
 
         protected void loadData(String newLayerName, Bounds bounds) {
-            OsmDataLayer layer = addNewLayerIfRequired(newLayerName, bounds);
+            OsmDataLayer layer = addNewLayerIfRequired(newLayerName);
             if (layer == null) {
                 layer = getEditLayer();
                 if (layer == null) {
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
index 3807238..41114c4 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
@@ -121,8 +121,6 @@ public class DownloadReferrersTask extends PleaseWaitRunnable {
                     @Override
                     public void run() {
                         targetLayer.onPostDownloadFromServer();
-                        if (Main.map != null)
-                            Main.map.mapView.repaint();
                     }
                 }
         );
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
index da7ae26..34708e8 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadSessionTask.java
@@ -20,7 +20,7 @@ import org.openstreetmap.josm.tools.HttpClient;
  */
 public class DownloadSessionTask extends AbstractDownloadTask<Object> {
 
-    private static final String PATTERN_SESSION =  "https?://.*/.*\\.jo(s|z)";
+    private static final String PATTERN_SESSION = "https?://.*/.*\\.jo(s|z)";
 
     private Loader loader;
 
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
index 42a7fd1..155e095 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
@@ -71,7 +71,7 @@ public class DownloadTaskList {
         this.progressMonitor = progressMonitor;
         if (newLayer) {
             Layer l = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
-            Main.main.addLayer(l);
+            Main.getLayerManager().addLayer(l);
             Main.getLayerManager().setActiveLayer(l);
         }
 
@@ -296,7 +296,7 @@ public class DownloadTaskList {
                         return;
                 }
             }
-            final OsmDataLayer editLayer = Main.main.getEditLayer();
+            final OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer != null && osmData) {
                 final Set<OsmPrimitive> myPrimitives = getCompletePrimitives(editLayer.data);
                 for (DownloadTask task : tasks) {
diff --git a/src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java b/src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java
index 775c6b6..966f4d7 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/AddNoteAction.java
@@ -15,7 +15,6 @@ import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.NoteInputDialog;
 import org.openstreetmap.josm.gui.Notification;
-import org.openstreetmap.josm.gui.dialogs.NotesDialog;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -69,7 +68,7 @@ public class AddNoteAction extends MapMode implements KeyPressReleaseListener {
         Main.map.selectMapMode(Main.map.mapModeSelect);
 
         NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Create new note"), tr("Create note"));
-        dialog.showNoteDialog(tr("Enter a detailed comment to create a note"), NotesDialog.ICON_NEW);
+        dialog.showNoteDialog(tr("Enter a detailed comment to create a note"), ImageProvider.get("dialogs/notes", "note_new"));
 
         if (dialog.getValue() != 1) {
             Main.debug("User aborted note creation");
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java b/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
index c3b14d2..05d267e 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
@@ -24,6 +24,7 @@ import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationDialogManager;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.util.ModifierListener;
@@ -132,22 +133,26 @@ public class DeleteAction extends MapMode implements ModifierListener {
      * @param e Action event
      */
     public static void doActionPerformed(ActionEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        MainLayerManager lm = Main.getLayerManager();
+        OsmDataLayer editLayer = lm.getEditLayer();
+        if (editLayer == null) {
             return;
+        }
+
         boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
         boolean alt = (e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0;
 
         Command c;
         if (ctrl) {
-            c = DeleteCommand.deleteWithReferences(getEditLayer(), getCurrentDataSet().getSelected());
+            c = DeleteCommand.deleteWithReferences(editLayer, lm.getEditDataSet().getSelected());
         } else {
-            c = DeleteCommand.delete(getEditLayer(), getCurrentDataSet().getSelected(), !alt /* also delete nodes in way */);
+            c = DeleteCommand.delete(editLayer, lm.getEditDataSet().getSelected(), !alt /* also delete nodes in way */);
         }
         // if c is null, an error occurred or the user aborted. Don't do anything in that case.
         if (c != null) {
             Main.main.undoRedo.add(c);
-            getCurrentDataSet().setSelected();
-            Main.map.repaint();
+            //FIXME: This should not be required, DeleteCommand should update the selection, otherwise undo/redo won't work.
+            lm.getEditDataSet().setSelected();
         }
     }
 
@@ -169,9 +174,9 @@ public class DeleteAction extends MapMode implements ModifierListener {
     /**
      * removes any highlighting that may have been set beforehand.
      */
-    private static void removeHighlighting() {
+    private void removeHighlighting() {
         highlightHelper.clear();
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         if (ds != null) {
             ds.clearHighlightedWaySegments();
         }
@@ -210,24 +215,24 @@ public class DeleteAction extends MapMode implements ModifierListener {
 
     private void repaintIfRequired(Set<OsmPrimitive> newHighlights, WaySegment newHighlightedWaySegment) {
         boolean needsRepaint = false;
-        DataSet ds = getCurrentDataSet();
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
 
         if (newHighlightedWaySegment == null && oldHighlightedWaySegment != null) {
-            if (ds != null) {
-                ds.clearHighlightedWaySegments();
+            if (editLayer != null) {
+                editLayer.data.clearHighlightedWaySegments();
                 needsRepaint = true;
             }
             oldHighlightedWaySegment = null;
         } else if (newHighlightedWaySegment != null && !newHighlightedWaySegment.equals(oldHighlightedWaySegment)) {
-            if (ds != null) {
-                ds.setHighlightedWaySegments(Collections.singleton(newHighlightedWaySegment));
+            if (editLayer != null) {
+                editLayer.data.setHighlightedWaySegments(Collections.singleton(newHighlightedWaySegment));
                 needsRepaint = true;
             }
             oldHighlightedWaySegment = newHighlightedWaySegment;
         }
         needsRepaint |= highlightHelper.highlightOnly(newHighlights);
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
     }
 
@@ -293,7 +298,7 @@ public class DeleteAction extends MapMode implements ModifierListener {
             Main.main.undoRedo.add(c);
         }
 
-        getCurrentDataSet().setSelected();
+        getLayerManager().getEditDataSet().setSelected();
         giveUserFeedback(e);
     }
 
@@ -389,19 +394,20 @@ public class DeleteAction extends MapMode implements ModifierListener {
      */
     private Command buildDeleteCommands(MouseEvent e, int modifiers, boolean silent) {
         DeleteParameters parameters = getDeleteParameters(e, modifiers);
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
         switch (parameters.mode) {
         case node:
-            return DeleteCommand.delete(getEditLayer(), Collections.singleton(parameters.nearestNode), false, silent);
+            return DeleteCommand.delete(editLayer, Collections.singleton(parameters.nearestNode), false, silent);
         case node_with_references:
-            return DeleteCommand.deleteWithReferences(getEditLayer(), Collections.singleton(parameters.nearestNode), silent);
+            return DeleteCommand.deleteWithReferences(editLayer, Collections.singleton(parameters.nearestNode), silent);
         case segment:
-            return DeleteCommand.deleteWaySegment(getEditLayer(), parameters.nearestSegment);
+            return DeleteCommand.deleteWaySegment(editLayer, parameters.nearestSegment);
         case way:
-            return DeleteCommand.delete(getEditLayer(), Collections.singleton(parameters.nearestSegment.way), false, silent);
+            return DeleteCommand.delete(editLayer, Collections.singleton(parameters.nearestSegment.way), false, silent);
         case way_with_nodes:
-            return DeleteCommand.delete(getEditLayer(), Collections.singleton(parameters.nearestSegment.way), true, silent);
+            return DeleteCommand.delete(editLayer, Collections.singleton(parameters.nearestSegment.way), true, silent);
         case way_with_references:
-            return DeleteCommand.deleteWithReferences(getEditLayer(), Collections.singleton(parameters.nearestSegment.way), true);
+            return DeleteCommand.deleteWithReferences(editLayer, Collections.singleton(parameters.nearestSegment.way), true);
         default:
             return null;
         }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index feb7512..d766412 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -184,8 +184,9 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             return false;
 
         // update selection to reflect which way being modified
-        DataSet currentDataSet = getCurrentDataSet();
-        if (getCurrentBaseNode() != null && currentDataSet != null && !currentDataSet.getSelected().isEmpty()) {
+        OsmDataLayer editLayer = getLayerManager().getEditLayer();
+        if (getCurrentBaseNode() != null && editLayer != null && !editLayer.data.selectionEmpty()) {
+            DataSet currentDataSet = editLayer.data;
             Way continueFrom = getWayForNode(getCurrentBaseNode());
             if (alt && continueFrom != null && (!getCurrentBaseNode().isSelected() || continueFrom.isSelected())) {
                 addRemoveSelection(currentDataSet, getCurrentBaseNode(), continueFrom);
@@ -196,8 +197,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             }
         }
 
-        if (needsRepaint) {
-            Main.map.mapView.repaint();
+        if (needsRepaint && editLayer != null) {
+            editLayer.invalidate();
         }
         return needsRepaint;
     }
@@ -218,7 +219,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
 
         // determine if selection is suitable to continue drawing. If it
         // isn't, set wayIsFinished to true to avoid superfluous repaints.
-        determineCurrentBaseNodeAndPreviousNode(getCurrentDataSet().getSelected());
+        determineCurrentBaseNodeAndPreviousNode(getLayerManager().getEditDataSet().getSelected());
         wayIsFinished = getCurrentBaseNode() == null;
 
         toleranceMultiplier = 0.01 * NavigatableComponent.PROP_SNAP_DISTANCE.get();
@@ -271,7 +272,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         // when exiting we let everybody know about the currently selected
         // primitives
         //
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         if (ds != null) {
             ds.fireSelectionChanged();
         }
@@ -323,7 +324,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     }
 
     private void tryAgain(MouseEvent e) {
-        getCurrentDataSet().setSelected();
+        getLayerManager().getEditDataSet().setSelected();
         mouseReleased(e);
     }
 
@@ -335,7 +336,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     private void finishDrawing() {
         // let everybody else know about the current selection
         //
-        Main.main.getCurrentDataSet().fireSelectionChanged();
+        Main.getLayerManager().getEditDataSet().fireSelectionChanged();
         lastUsedNode = null;
         wayIsFinished = true;
         Main.map.selectSelectTool(true);
@@ -393,13 +394,13 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         updateKeyModifiers(e);
         mousePos = e.getPoint();
 
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         Collection<OsmPrimitive> selection = new ArrayList<>(ds.getSelected());
 
         boolean newNode = false;
         Node n = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive.isSelectablePredicate);
         if (ctrl) {
-            Iterator<Way> it = getCurrentDataSet().getSelectedWays().iterator();
+            Iterator<Way> it = ds.getSelectedWays().iterator();
             if (it.hasNext()) {
                 // ctrl-click on node of selected way = reuse node despite of ctrl
                 if (!it.next().containsNode(n)) n = null;
@@ -415,11 +416,11 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
                 // (this is just a convenience option so that people don't
                 // have to switch modes)
 
-                getCurrentDataSet().setSelected(n);
+                ds.setSelected(n);
                 // If we extend/continue an existing way, select it already now to make it obvious
                 Way continueFrom = getWayForNode(n);
                 if (continueFrom != null) {
-                    getCurrentDataSet().addSelected(continueFrom);
+                    ds.addSelected(continueFrom);
                 }
 
                 // The user explicitly selected a node, so let him continue drawing
@@ -614,7 +615,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             lastUsedNode = n;
         }
 
-        getCurrentDataSet().setSelected(newSelection);
+        ds.setSelected(newSelection);
 
         // "viewport following" mode for tracing long features
         // from aerial imagery or GPS tracks.
@@ -689,13 +690,15 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     private boolean isSelfContainedWay(Way selectedWay, Node currentNode, Node targetNode) {
         if (selectedWay != null) {
             int posn0 = selectedWay.getNodes().indexOf(currentNode);
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             if (posn0 != -1 && // n0 is part of way
-                    (posn0 >= 1                             && targetNode.equals(selectedWay.getNode(posn0-1))) || // previous node
-                    (posn0 < selectedWay.getNodesCount()-1) && targetNode.equals(selectedWay.getNode(posn0+1))) {  // next node
-                getCurrentDataSet().setSelected(targetNode);
+               (posn0 >= 1                             && targetNode.equals(selectedWay.getNode(posn0-1))) || // previous node
+               (posn0 < selectedWay.getNodesCount()-1) && targetNode.equals(selectedWay.getNode(posn0+1))) {  // next node
+                getLayerManager().getEditDataSet().setSelected(targetNode);
                 lastUsedNode = targetNode;
                 return true;
             }
+            // CHECKSTYLE.ON: SingleSpaceSeparator
         }
 
         return false;
@@ -776,7 +779,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             return;
         }
 
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
+        Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
 
         MapView mv = Main.map.mapView;
         Node currentMouseNode = null;
@@ -844,7 +847,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
      * @param selection
      * uses also lastUsedNode field
      */
-    private void determineCurrentBaseNodeAndPreviousNode(Collection<OsmPrimitive>  selection) {
+    private void determineCurrentBaseNodeAndPreviousNode(Collection<OsmPrimitive> selection) {
         Node selectedNode = null;
         Way selectedWay = null;
         for (OsmPrimitive p : selection) {
@@ -914,7 +917,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
      */
     @Override
     public void mouseExited(MouseEvent e) {
-        if (!Main.map.mapView.isActiveLayerDrawable())
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
+        if (editLayer == null)
             return;
         mousePos = e.getPoint();
         snapHelper.noSnapNow();
@@ -922,7 +926,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         // force repaint in case snapHelper needs one. If removeHighlighting
         // caused one already, don’t do it again.
         if (!repaintIssued) {
-            Main.map.mapView.repaint();
+            editLayer.invalidate();
         }
     }
 
@@ -1082,8 +1086,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 && getCurrentDataSet().getSelected().isEmpty()
-                && mousePos != null) {
+        if (mouseOnExistingNode == null && getLayerManager().getEditDataSet().selectionEmpty() && mousePos != null) {
             mouseOnExistingNode = Main.map.mapView.getNearestNode(mousePos, OsmPrimitive.isSelectablePredicate);
         }
 
@@ -1206,10 +1209,11 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         }
 
         Node n = mouseOnExistingNode;
+        DataSet ds = getLayerManager().getEditDataSet();
         /*
          * Handle special case: Highlighted node == selected node => finish drawing
          */
-        if (n != null && getCurrentDataSet() != null && getCurrentDataSet().getSelectedNodes().contains(n)) {
+        if (n != null && ds != null && ds.getSelectedNodes().contains(n)) {
             if (wayIsFinished) {
                 rv = new StringBuilder(tr("Select node under cursor."));
             } else {
@@ -1220,8 +1224,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         /*
          * Handle special case: Self-Overlapping or closing way
          */
-        if (getCurrentDataSet() != null && !getCurrentDataSet().getSelectedWays().isEmpty() && !wayIsFinished && !alt) {
-            Way w = getCurrentDataSet().getSelectedWays().iterator().next();
+        if (ds != null && !ds.getSelectedWays().isEmpty() && !wayIsFinished && !alt) {
+            Way w = ds.getSelectedWays().iterator().next();
             for (Node m : w.getNodes()) {
                 if (m.equals(mouseOnExistingNode) || mouseOnExistingWays.contains(w)) {
                     rv.append(' ').append(tr("Finish drawing."));
@@ -1243,9 +1247,9 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
      * @return selected primitives, while draw action is in progress
      */
     public Collection<OsmPrimitive> getInProgressSelection() {
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         if (ds == null) return null;
-        if (getCurrentBaseNode() != null && !ds.getSelected().isEmpty()) {
+        if (getCurrentBaseNode() != null && !ds.selectionEmpty()) {
             Way continueFrom = getWayForNode(getCurrentBaseNode());
             if (continueFrom != null)
                 return Collections.<OsmPrimitive>singleton(continueFrom);
@@ -1260,7 +1264,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 
     @Override
@@ -1282,7 +1286,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
                     if (n == null) {
                         n = (Node) p; // found one node
                         wayIsFinished = false;
-                    }  else {
+                    } else {
                         // if more than 1 node were affected by previous command,
                         // we have no way to continue, so we forget about found node
                         n = null;
@@ -1292,7 +1296,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             }
             // select last added node - maybe we will continue drawing from it
             if (n != null) {
-                getCurrentDataSet().addSelected(n);
+                getLayerManager().getEditDataSet().addSelected(n);
             }
         }
     }
@@ -1632,7 +1636,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
 
             projectionSource = null;
             if (snapToProjections) {
-                DataSet ds = getCurrentDataSet();
+                DataSet ds = getLayerManager().getEditDataSet();
                 Collection<Way> selectedWays = ds.getSelectedWays();
                 if (selectedWays.size() == 1) {
                     Way w = selectedWays.iterator().next();
@@ -1658,7 +1662,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
                         }
                     }
                     if (enOpt != null) {
-                        projectionSource =  enOpt;
+                        projectionSource = enOpt;
                     }
                 }
             }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
index 4279ac6..80a8698 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
@@ -426,11 +426,11 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
             } else if (alt) {
                 mode = Mode.create_new;
                 // create a new segment and then select and extrude the new segment
-                getCurrentDataSet().setSelected(selectedSegment.way);
+                getLayerManager().getEditDataSet().setSelected(selectedSegment.way);
                 alwaysCreateNodes = true;
             } else {
                 mode = Mode.extrude;
-                getCurrentDataSet().setSelected(selectedSegment.way);
+                getLayerManager().getEditDataSet().setSelected(selectedSegment.way);
                 alwaysCreateNodes = shift;
             }
         }
@@ -610,7 +610,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
         cmds.add(new AddCommand(wnew));
         Command c = new SequenceCommand(tr("Extrude Way"), cmds);
         Main.main.undoRedo.add(c);
-        getCurrentDataSet().setSelected(wnew);
+        getLayerManager().getEditDataSet().setSelected(wnew);
     }
 
     /**
@@ -707,7 +707,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
         // If the dual alignment moved two nodes to the same point, merge them
         Node targetNode = MergeNodesAction.selectTargetNode(changedNodes);
         Node locNode = MergeNodesAction.selectTargetLocationNode(changedNodes);
-        Command mergeCmd = MergeNodesAction.mergeNodes(Main.main.getEditLayer(), changedNodes, targetNode, locNode);
+        Command mergeCmd = MergeNodesAction.mergeNodes(Main.getLayerManager().getEditLayer(), changedNodes, targetNode, locNode);
         if (mergeCmd != null) {
             Main.main.undoRedo.add(mergeCmd);
         } else {
@@ -821,7 +821,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
             possibleMoveDirections.add(new ReferenceSegment(new EastNorth(
                     initialN2en.getX() - en.getX(),
                     initialN2en.getY() - en.getY()
-                    ), initialN2en,  en, false));
+                    ), initialN2en, en, false));
         }
     }
 
@@ -834,7 +834,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
         initialN2en = initialN1en;
         possibleMoveDirections = new ArrayList<>();
         for (OsmPrimitive p: selectedNode.getReferrers()) {
-            if (p instanceof Way  && p.isUsable()) {
+            if (p instanceof Way && p.isUsable()) {
                 for (Node neighbor: ((Way) p).getNeighbours(selectedNode)) {
                     EastNorth en = neighbor.getEastNorth();
                     possibleMoveDirections.add(new ReferenceSegment(new EastNorth(
@@ -904,7 +904,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
         dualAlignSegment2 = new ReferenceSegment(new EastNorth(
             initialN2en.getX() - nextNodeEn.getX(),
             initialN2en.getY() - nextNodeEn.getY()
-            ), initialN2en,  nextNodeEn, false);
+            ), initialN2en, nextNodeEn, false);
     }
 
     /**
@@ -984,7 +984,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
      */
     private int getNextNodeIndex(int index) {
         int count = selectedSegment.way.getNodesCount();
-        if (index <  count - 1)
+        if (index < count - 1)
             return index + 1;
         else if (selectedSegment.way.isClosed())
             return 1;
@@ -1194,6 +1194,7 @@ public class ExtrudeAction extends MapMode implements MapViewPaintable, KeyPress
             return new Line2D.Double(start, new Point2D.Double(start.getX() + (unitvector.getX() * linelength), start.getY()
                     + (unitvector.getY() * linelength)));
         } catch (NoninvertibleTransformException e) {
+            Main.debug(e);
             return new Line2D.Double(start, new Point2D.Double(start.getX() + (unitvector.getX() * 10), start.getY()
                     + (unitvector.getY() * 10)));
         }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java b/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
index 06d2118..72d4740 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
@@ -134,7 +134,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
         mousePos = null;
         oldModeHelpText = "";
 
-        if (getCurrentDataSet() == null) {
+        if (getLayerManager().getEditDataSet() == null) {
             return;
         }
 
@@ -210,7 +210,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
 
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 
     // -------------------------------------------------------------------------
@@ -409,7 +409,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
 
         if (state == State.selecting) {
             if (targetWay != null) {
-                getCurrentDataSet().setSelected(targetWay.getPrimitiveId());
+                getLayerManager().getEditDataSet().setSelected(targetWay.getPrimitiveId());
                 updateStateByCurrentSelection();
             }
         } else if (state == State.improving && mousePos != null) {
@@ -500,7 +500,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
                 } else {
                     List<Node> nodeList = new ArrayList<>();
                     nodeList.add(candidateNode);
-                    Command deleteCmd = DeleteCommand.delete(getEditLayer(), nodeList, true);
+                    Command deleteCmd = DeleteCommand.delete(getLayerManager().getEditLayer(), nodeList, true);
                     if (deleteCmd != null) {
                         Main.main.undoRedo.add(deleteCmd);
                     }
@@ -512,8 +512,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
                 EastNorth nodeEN = candidateNode.getEastNorth();
                 EastNorth cursorEN = mv.getEastNorth(mousePos.x, mousePos.y);
 
-                Main.main.undoRedo.add(new MoveCommand(candidateNode, cursorEN.east() - nodeEN.east(), cursorEN.north()
-                        - nodeEN.north()));
+                Main.main.undoRedo.add(new MoveCommand(candidateNode, cursorEN.east() - nodeEN.east(), cursorEN.north() - nodeEN.north()));
             }
         }
 
@@ -618,12 +617,13 @@ public class ImproveWayAccuracyAction extends MapMode implements
     public void startImproving(Way targetWay) {
         state = State.improving;
 
-        Collection<OsmPrimitive> currentSelection = getCurrentDataSet().getSelected();
+        DataSet ds = getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> currentSelection = ds.getSelected();
         if (currentSelection.size() != 1
                 || !currentSelection.iterator().next().equals(targetWay)) {
             selectionChangedBlocked = true;
-            getCurrentDataSet().clearSelection();
-            getCurrentDataSet().setSelected(targetWay.getPrimitiveId());
+            ds.clearSelection();
+            ds.setSelected(targetWay.getPrimitiveId());
             selectionChangedBlocked = false;
         }
 
@@ -644,7 +644,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
     private void updateStateByCurrentSelection() {
         final List<Node> nodeList = new ArrayList<>();
         final List<Way> wayList = new ArrayList<>();
-        final Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
+        final Collection<OsmPrimitive> sel = getLayerManager().getEditDataSet().getSelected();
 
         // Collecting nodes and ways from the selection
         for (OsmPrimitive p : sel) {
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ModifiersSpec.java b/src/org/openstreetmap/josm/actions/mapmode/ModifiersSpec.java
index 3de2c89..f64f0b2 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ModifiersSpec.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ModifiersSpec.java
@@ -24,9 +24,11 @@ public class ModifiersSpec {
         char s = str.charAt(1);
         char c = str.charAt(2);
         // @formatter:off
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         alt   = a == '?' ? UNKNOWN : (a == 'A' ? ON : OFF);
         shift = s == '?' ? UNKNOWN : (s == 'S' ? ON : OFF);
         ctrl  = c == '?' ? UNKNOWN : (c == 'C' ? ON : OFF);
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         // @formatter:on
     }
 
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java b/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
index 673febe..6b68712 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
@@ -159,7 +159,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
 
         //// Needed to update the mouse cursor if modifiers are changed when the mouse is motionless
         Main.map.keyDetector.addModifierListener(this);
-        sourceWays = new LinkedHashSet<>(getCurrentDataSet().getSelectedWays());
+        sourceWays = new LinkedHashSet<>(getLayerManager().getEditDataSet().getSelectedWays());
         for (Way w : sourceWays) {
             w.setHighlighted(true);
         }
@@ -204,6 +204,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
 
     private void updateModeLocalPreferences() {
         // @formatter:off
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         snapThreshold        = Main.pref.getDouble(prefKey("snap-threshold-percent"), 0.70);
         snapDefault          = Main.pref.getBoolean(prefKey("snap-default"),      true);
         copyTagsDefault      = Main.pref.getBoolean(prefKey("copy-tags-default"), true);
@@ -218,6 +219,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
         addToSelectionModifierCombo = new ModifiersSpec(getStringPref("add-to-selection-modifier-combo", "aSc"));
         toggleSelectedModifierCombo = new ModifiersSpec(getStringPref("toggle-selection-modifier-combo", "asC"));
         setSelectedModifierCombo    = new ModifiersSpec(getStringPref("set-selection-modifier-combo",    "asc"));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         // @formatter:on
     }
 
@@ -299,7 +301,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
 
         // Since the created way is left selected, we need to unselect again here
         if (pWays != null && pWays.getWays() != null) {
-            getCurrentDataSet().clearSelection(pWays.getWays());
+            getLayerManager().getEditDataSet().clearSelection(pWays.getWays());
             pWays = null;
         }
 
@@ -487,24 +489,24 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
         snap = snapDefault != matchesCurrentModifiers(snapModifierCombo);
     }
 
-    //// We keep the source ways and the selection in sync so the user can see the source way's tags
+    // We keep the source ways and the selection in sync so the user can see the source way's tags
     private void addSourceWay(Way w) {
         assert sourceWays != null;
-        getCurrentDataSet().addSelected(w);
+        getLayerManager().getEditDataSet().addSelected(w);
         w.setHighlighted(true);
         sourceWays.add(w);
     }
 
     private void removeSourceWay(Way w) {
         assert sourceWays != null;
-        getCurrentDataSet().clearSelection(w);
+        getLayerManager().getEditDataSet().clearSelection(w);
         w.setHighlighted(false);
         sourceWays.remove(w);
     }
 
     private void clearSourceWays() {
         assert sourceWays != null;
-        getCurrentDataSet().clearSelection(sourceWays);
+        getLayerManager().getEditDataSet().clearSelection(sourceWays);
         for (Way w : sourceWays) {
             w.setHighlighted(false);
         }
@@ -540,9 +542,10 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
             }
             pWays = new ParallelWays(sourceWays, copyTags, referenceWayIndex);
             pWays.commit();
-            getCurrentDataSet().setSelected(pWays.getWays());
+            getLayerManager().getEditDataSet().setSelected(pWays.getWays());
             return true;
         } catch (IllegalArgumentException e) {
+            Main.debug(e);
             new Notification(tr("ParallelWayAction\n" +
                     "The ways selected must form a simple branchless path"))
                     .setIcon(JOptionPane.INFORMATION_MESSAGE)
diff --git a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
index 9d8c35e..5cc3e6d 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
@@ -255,7 +255,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
         virtualManager.clear();
         if (mode == Mode.MOVE) {
             if (!dragInProgress() && virtualManager.activateVirtualNodeNearPoint(e.getPoint())) {
-                DataSet ds = getCurrentDataSet();
+                DataSet ds = getLayerManager().getEditDataSet();
                 if (ds != null && drawTargetHighlight) {
                     ds.setHighlightedVirtualNodes(virtualManager.virtualWays);
                 }
@@ -305,7 +305,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             if (dragInProgress()) {
                 // only consider merge if ctrl is pressed and there are nodes in
                 // the selection that could be merged
-                if (!ctrl || getCurrentDataSet().getSelectedNodes().isEmpty()) {
+                if (!ctrl || getLayerManager().getEditDataSet().getSelectedNodes().isEmpty()) {
                     c = "move";
                     break;
                 }
@@ -347,7 +347,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
      */
     private boolean removeHighlighting() {
         boolean needsRepaint = false;
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
         if (ds != null && !ds.getHighlightedVirtualNodes().isEmpty()) {
             needsRepaint = true;
             ds.clearHighlightedVirtualNodes();
@@ -426,8 +426,9 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
         case ROTATE:
         case SCALE:
             //  if nothing was selected, select primitive under cursor for scaling or rotating
-            if (getCurrentDataSet().getSelected().isEmpty()) {
-                getCurrentDataSet().setSelected(asColl(nearestPrimitive));
+            DataSet ds = getLayerManager().getEditDataSet();
+            if (ds.selectionEmpty()) {
+                ds.setSelected(asColl(nearestPrimitive));
             }
 
             // Mode.select redraws when selectPrims is called
@@ -500,7 +501,6 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             // Unregisters selectionManager if ctrl has been pressed after mouse click on Mac OS X in order to move the map
             if (ctrl && Main.isPlatformOsx()) {
                 selectionManager.unregister(mv);
-                mv.requestClearRect();
                 // Make sure correct cursor is displayed
                 mv.setNewCursor(Cursor.MOVE_CURSOR, this);
             }
@@ -519,7 +519,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
         if (mode == Mode.MOVE) {
             // If ctrl is pressed we are in merge mode. Look for a nearby node,
             // highlight it and adjust the cursor accordingly.
-            final boolean canMerge = ctrl && !getCurrentDataSet().getSelectedNodes().isEmpty();
+            final boolean canMerge = ctrl && !getLayerManager().getEditDataSet().getSelectedNodes().isEmpty();
             final OsmPrimitive p = canMerge ? findNodeToMergeTo(e.getPoint()) : null;
             boolean needsRepaint = removeHighlighting();
             if (p != null) {
@@ -593,7 +593,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             selectionManager.unregister(mv);
 
             // Select Draw Tool if no selection has been made
-            if (getCurrentDataSet().getSelected().isEmpty() && !cancelDrawMode) {
+            if (getLayerManager().getEditDataSet().selectionEmpty() && !cancelDrawMode) {
                 Main.map.selectDrawTool(true);
                 updateStatusLine();
                 return;
@@ -611,7 +611,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                     selectPrims(cycleManager.cyclePrims(), true, false);
 
                     // If the user double-clicked a node, change to draw mode
-                    Collection<OsmPrimitive> c = getCurrentDataSet().getSelected();
+                    Collection<OsmPrimitive> c = getLayerManager().getEditDataSet().getSelected();
                     if (e.getClickCount() >= 2 && c.size() == 1 && c.iterator().next() instanceof Node) {
                         // We need to do it like this as otherwise drawAction will see a double
                         // click and switch back to SelectMode
@@ -705,10 +705,11 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
     private boolean updateCommandWhileDragging(EastNorth currentEN) {
         // Currently we support only transformations which do not affect relations.
         // So don't add them in the first place to make handling easier
-        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelectedNodesAndWays();
+        DataSet ds = getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> selection = ds.getSelectedNodesAndWays();
         if (selection.isEmpty()) { // if nothing was selected to drag, just select nearest node/way to the cursor
             OsmPrimitive nearestPrimitive = mv.getNearestNodeOrWay(mv.getPoint(startEN), mv.isSelectablePredicate, true);
-            getCurrentDataSet().setSelected(nearestPrimitive);
+            ds.setSelected(nearestPrimitive);
         }
 
         Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
@@ -719,7 +720,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
         Command c = getLastCommand();
         if (mode == Mode.MOVE) {
             if (startEN == null) return false; // fix #8128
-            getCurrentDataSet().beginUpdate();
+            ds.beginUpdate();
             if (c instanceof MoveCommand && affectedNodes.equals(((MoveCommand) c).getParticipatingPrimitives())) {
                 ((MoveCommand) c).saveCheckpoint();
                 ((MoveCommand) c).applyVectorTo(currentEN);
@@ -732,7 +733,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 if (ll != null && ll.isOutSideWorld()) {
                     // Revert move
                     ((MoveCommand) c).resetToCheckpoint();
-                    getCurrentDataSet().endUpdate();
+                    ds.endUpdate();
                     JOptionPane.showMessageDialog(
                             Main.parent,
                             tr("Cannot move objects outside of the world."),
@@ -749,7 +750,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 return false;
             }
 
-            getCurrentDataSet().beginUpdate();
+            ds.beginUpdate();
 
             if (mode == Mode.ROTATE) {
                 if (c instanceof RotateCommand && affectedNodes.equals(((RotateCommand) c).getTransformedNodes())) {
@@ -765,12 +766,12 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 }
             }
 
-            Collection<Way> ways = getCurrentDataSet().getSelectedWays();
+            Collection<Way> ways = ds.getSelectedWays();
             if (doesImpactStatusLine(affectedNodes, ways)) {
                 Main.map.statusLine.setDist(ways);
             }
         }
-        getCurrentDataSet().endUpdate();
+        ds.endUpdate();
         return true;
     }
 
@@ -790,7 +791,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
      */
     private void useLastMoveCommandIfPossible() {
         Command c = getLastCommand();
-        Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(getCurrentDataSet().getSelected());
+        Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(getLayerManager().getEditDataSet().getSelected());
         if (c instanceof MoveCommand && affectedNodes.equals(((MoveCommand) c).getParticipatingPrimitives())) {
             // old command was created with different base point of movement, we need to recalculate it
             ((MoveCommand) c).changeStartPoint(startEN);
@@ -829,7 +830,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             }
         }
         int max = Main.pref.getInteger("warn.move.maxelements", 20), limit = max;
-        for (OsmPrimitive osm : getCurrentDataSet().getSelected()) {
+        for (OsmPrimitive osm : getLayerManager().getEditDataSet().getSelected()) {
             if (osm instanceof Way) {
                 limit -= ((Way) osm).getNodes().size();
             }
@@ -855,7 +856,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             updateKeyModifiers(e);
             if (ctrl) mergePrims(e.getPoint());
         }
-        getCurrentDataSet().fireSelectionChanged();
+        getLayerManager().getEditDataSet().fireSelectionChanged();
     }
 
     static class ConfirmMoveDialog extends ExtendedDialog {
@@ -868,9 +869,10 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
         }
     }
 
-    private static boolean movesHiddenWay() {
-        final Collection<OsmPrimitive> elementsToTest = new HashSet<>(getCurrentDataSet().getSelected());
-        for (Way osm : Utils.filteredCollection(getCurrentDataSet().getSelected(), Way.class)) {
+    private boolean movesHiddenWay() {
+        DataSet ds = getLayerManager().getEditDataSet();
+        final Collection<OsmPrimitive> elementsToTest = new HashSet<>(ds.getSelected());
+        for (Way osm : Utils.filteredCollection(ds.getSelected(), Way.class)) {
             elementsToTest.addAll(osm.getNodes());
         }
         for (OsmPrimitive node : Utils.filteredCollection(elementsToTest, Node.class)) {
@@ -890,7 +892,8 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
      * @param p mouse position
      */
     private void mergePrims(Point p) {
-        Collection<Node> selNodes = getCurrentDataSet().getSelectedNodes();
+        DataSet ds = getLayerManager().getEditDataSet();
+        Collection<Node> selNodes = ds.getSelectedNodes();
         if (selNodes.isEmpty())
             return;
 
@@ -900,11 +903,10 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
 
         if (selNodes.size() == 1) {
             // Move all selected primitive to preserve shape #10748
-            Collection<OsmPrimitive> selection =
-                getCurrentDataSet().getSelectedNodesAndWays();
+            Collection<OsmPrimitive> selection = ds.getSelectedNodesAndWays();
             Collection<Node> affectedNodes = AllNodesVisitor.getAllNodes(selection);
             Command c = getLastCommand();
-            getCurrentDataSet().beginUpdate();
+            ds.beginUpdate();
             if (c instanceof MoveCommand
                 && affectedNodes.equals(((MoveCommand) c).getParticipatingPrimitives())) {
                 Node selectedNode = selNodes.iterator().next();
@@ -913,12 +915,12 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 ((MoveCommand) c).moveAgain(targetEN.getX() - selectedEN.getX(),
                                             targetEN.getY() - selectedEN.getY());
             }
-            getCurrentDataSet().endUpdate();
+            ds.endUpdate();
         }
 
         Collection<Node> nodesToMerge = new LinkedList<>(selNodes);
         nodesToMerge.add(target);
-        mergeNodes(Main.main.getEditLayer(), nodesToMerge, target);
+        mergeNodes(Main.getLayerManager().getEditLayer(), nodesToMerge, target);
     }
 
     /**
@@ -941,13 +943,13 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
      */
     private Node findNodeToMergeTo(Point p) {
         Collection<Node> target = mv.getNearestNodes(p,
-                getCurrentDataSet().getSelectedNodes(),
+                getLayerManager().getEditDataSet().getSelectedNodes(),
                 mv.isSelectablePredicate);
         return target.isEmpty() ? null : target.iterator().next();
     }
 
     private void selectPrims(Collection<OsmPrimitive> prims, boolean released, boolean area) {
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = getLayerManager().getEditDataSet();
 
         // not allowed together: do not change dataset selection, return early
         // Virtual Ways: if non-empty the cursor is above a virtual node. So don't highlight
@@ -996,8 +998,9 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             if (mode == Mode.SELECT)
                 return tr("Release the mouse button to select the objects in the rectangle.");
             else if (mode == Mode.MOVE && (System.currentTimeMillis() - mouseDownTime >= initialMoveDelay)) {
-                final boolean canMerge = getCurrentDataSet() != null && !getCurrentDataSet().getSelectedNodes().isEmpty();
-                final String mergeHelp = canMerge ? ' ' + tr("Ctrl to merge with nearest node.") : "";
+                final DataSet ds = getLayerManager().getEditDataSet();
+                final boolean canMerge = ds != null && !ds.getSelectedNodes().isEmpty();
+                final String mergeHelp = canMerge ? (' ' + tr("Ctrl to merge with nearest node.")) : "";
                 return tr("Release the mouse button to stop moving.") + mergeHelp;
             } else if (mode == Mode.ROTATE)
                 return tr("Release the mouse button to stop rotating.");
@@ -1110,7 +1113,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             }
             // updateKeyModifiers() already called before!
 
-            DataSet ds = getCurrentDataSet();
+            DataSet ds = getLayerManager().getEditDataSet();
             OsmPrimitive first = cycleList.iterator().next(), foundInDS = null;
             OsmPrimitive nxt = first;
 
@@ -1245,7 +1248,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                     "Add and move a virtual new node to {0} ways", virtualWays.size(),
                     virtualWays.size());
             Main.main.undoRedo.add(new SequenceCommand(text, virtualCmds));
-            getCurrentDataSet().setSelected(Collections.singleton((OsmPrimitive) virtualNode));
+            getLayerManager().getEditDataSet().setSelected(Collections.singleton((OsmPrimitive) virtualNode));
             clear();
         }
 
diff --git a/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java b/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
index ea8176a..aa5280f 100644
--- a/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
+++ b/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
@@ -38,7 +38,7 @@ public class AddSelectionToRelations extends AbstractRelationAction implements S
     public void actionPerformed(ActionEvent e) {
         Collection<Command> cmds = new LinkedList<>();
         for (Relation orig : relations) {
-            Command c = GenericRelationEditor.addPrimitivesToRelation(orig, Main.main.getCurrentDataSet().getSelected());
+            Command c = GenericRelationEditor.addPrimitivesToRelation(orig, Main.getLayerManager().getEditDataSet().getSelected());
             if (c != null) {
                 cmds.add(c);
             }
diff --git a/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java b/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
index c7729fb..fb49dfe 100644
--- a/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
@@ -9,6 +9,7 @@ import java.util.Collection;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.DeleteAction;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -23,13 +24,15 @@ public class DeleteRelationsAction extends AbstractRelationAction {
     public DeleteRelationsAction() {
         putValue(SHORT_DESCRIPTION, tr("Delete the selected relation"));
         putValue(NAME, tr("Delete"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+        new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
     }
 
     protected void deleteRelation(Collection<Relation> toDelete) {
-        if (toDelete == null)
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
+        if (toDelete == null || layer == null)
             return;
-        DeleteAction.deleteRelations(Main.main.getEditLayer(), toDelete);
+
+        DeleteAction.deleteRelations(layer, toDelete);
         // clear selection after deletion
         if (Main.map.relationListDialog != null)
                 Main.map.relationListDialog.selectRelations(null);
@@ -37,7 +40,7 @@ public class DeleteRelationsAction extends AbstractRelationAction {
 
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || !Main.main.hasEditLayer())
+        if (!isEnabled())
             return;
         deleteRelation(relations);
     }
diff --git a/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java b/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
index 3696580..8ffcb56 100644
--- a/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
@@ -35,7 +35,7 @@ public class DownloadMembersAction extends AbstractRelationAction {
     @Override
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled() || relations.isEmpty() || !Main.isDisplayingMapView()) return;
-        Main.worker.submit(new DownloadRelationTask(relations, Main.main.getEditLayer()));
+        Main.worker.submit(new DownloadRelationTask(relations, Main.getLayerManager().getEditLayer()));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java b/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
index d4edb0f..716ce6d 100644
--- a/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
@@ -58,7 +58,7 @@ public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAct
         Main.worker.submit(new DownloadRelationMemberTask(
                 relations,
                 incompleteMembers,
-                Main.main.getEditLayer()));
+                Main.getLayerManager().getEditLayer()));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java b/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
index 1c2c82d..a17ac0a 100644
--- a/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
@@ -21,7 +21,7 @@ public class DuplicateRelationAction extends AbstractRelationAction {
      */
     public DuplicateRelationAction() {
         putValue(SHORT_DESCRIPTION, tr("Create a copy of this relation and open it in another editor window"));
-        putValue(SMALL_ICON, ImageProvider.get("duplicate"));
+        new ImageProvider("duplicate").getResource().attachImageIcon(this, true);
         putValue(NAME, tr("Duplicate"));
     }
 
@@ -33,7 +33,7 @@ public class DuplicateRelationAction extends AbstractRelationAction {
         Relation copy = new Relation(original, true);
         copy.setModified(true);
         RelationEditor editor = RelationEditor.getEditor(
-                Main.main.getEditLayer(),
+                Main.getLayerManager().getEditLayer(),
                 copy,
                 null /* no selected members */
                 );
diff --git a/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java b/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
index 7cd59ff..aaa7117 100644
--- a/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
@@ -23,7 +23,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * The action for editing a relation.
  * @since 5793
  */
-public class EditRelationAction extends AbstractRelationAction  {
+public class EditRelationAction extends AbstractRelationAction {
 
     /**
      * Constructs a new <code>EditRelationAction</code>.
@@ -31,7 +31,7 @@ public class EditRelationAction extends AbstractRelationAction  {
     public EditRelationAction() {
         putValue(NAME, tr("Edit"));
         putValue(SHORT_DESCRIPTION, tr("Call relation editor for selected relation"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+        new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
     }
 
     /**
@@ -42,7 +42,7 @@ public class EditRelationAction extends AbstractRelationAction  {
     public static Set<RelationMember> getMembersForCurrentSelection(Relation r) {
         Set<RelationMember> members = new HashSet<>();
         if (Main.isDisplayingMapView()) {
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer != null && editLayer.data != null) {
                 Collection<OsmPrimitive> selection = editLayer.data.getSelected();
                 for (RelationMember member: r.getMembers()) {
@@ -61,7 +61,7 @@ public class EditRelationAction extends AbstractRelationAction  {
      */
     public static void launchEditor(Relation toEdit) {
         if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return;
-        RelationEditor.getEditor(Main.main.getEditLayer(), toEdit,
+        RelationEditor.getEditor(Main.getLayerManager().getEditLayer(), toEdit,
                 getMembersForCurrentSelection(toEdit)).setVisible(true);
     }
 
diff --git a/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java b/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
index 6c79832..44af2b8 100644
--- a/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/RecentRelationsAction.java
@@ -20,10 +20,14 @@ import javax.swing.plaf.basic.BasicArrowButton;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -32,7 +36,7 @@ import org.openstreetmap.josm.tools.Shortcut;
 /**
  * Action for accessing recent relations.
  */
-public class RecentRelationsAction implements ActionListener, CommandQueueListener, LayerChangeListener {
+public class RecentRelationsAction implements ActionListener, CommandQueueListener, LayerChangeListener, ActiveLayerChangeListener {
 
     private final SideButton editButton;
     private final BasicArrowButton arrow;
@@ -47,7 +51,8 @@ public class RecentRelationsAction implements ActionListener, CommandQueueListen
         arrow = editButton.createArrow(this);
         arrow.setToolTipText(tr("List of recent relations"));
         Main.main.undoRedo.addCommandQueueListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
         enableArrow();
         shortcut = Shortcut.registerShortcut(
             "relationeditor:editrecentrelation",
@@ -94,7 +99,7 @@ public class RecentRelationsAction implements ActionListener, CommandQueueListen
     public static boolean isRelationListable(Relation relation) {
         return relation != null &&
             !relation.isDeleted() &&
-            Main.main.getCurrentDataSet().containsRelation(relation);
+            Main.getLayerManager().getEditDataSet().containsRelation(relation);
     }
 
     @Override
@@ -108,17 +113,22 @@ public class RecentRelationsAction implements ActionListener, CommandQueueListen
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         enableArrow();
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         enableArrow();
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        enableArrow();
+    }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         enableArrow();
     }
 
@@ -129,7 +139,7 @@ public class RecentRelationsAction implements ActionListener, CommandQueueListen
     public static List<Relation> getRecentRelationsOnActiveLayer() {
         if (!Main.isDisplayingMapView())
             return Collections.emptyList();
-        Layer activeLayer = Main.main.getActiveLayer();
+        Layer activeLayer = Main.getLayerManager().getActiveLayer();
         if (!(activeLayer instanceof OsmDataLayer)) {
             return Collections.emptyList();
         } else {
@@ -181,4 +191,5 @@ public class RecentRelationsAction implements ActionListener, CommandQueueListen
             EditRelationAction.launchEditor(relation);
         }
     }
+
 }
diff --git a/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java b/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
index 9ffefbb..f01a6b6 100644
--- a/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
@@ -42,9 +42,9 @@ public class SelectMembersAction extends AbstractRelationAction {
             members.addAll(r.getMemberPrimitives());
         }
         if (add) {
-            Main.main.getEditLayer().data.addSelected(members);
+            Main.getLayerManager().getEditLayer().data.addSelected(members);
         } else {
-            Main.main.getEditLayer().data.setSelected(members);
+            Main.getLayerManager().getEditLayer().data.setSelected(members);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java b/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java
index 20eb34b..c55715c 100644
--- a/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java
+++ b/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java
@@ -25,7 +25,7 @@ public class SelectRelationAction extends AbstractRelationAction {
     public SelectRelationAction(boolean add) {
         putValue(SHORT_DESCRIPTION, add ? tr("Add the selected relations to the current selection") :
             tr("Set the current selection to the list of selected relations"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+        new ImageProvider("dialogs", "select").getResource().attachImageIcon(this, true);
         putValue(NAME, add ? tr("Select relation (add)") : tr("Select relation"));
         this.add = add;
     }
@@ -33,7 +33,7 @@ public class SelectRelationAction extends AbstractRelationAction {
     @Override
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled() || relations.isEmpty()) return;
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer == null || editLayer.data == null) return;
         if (add) {
             editLayer.data.addSelected(relations);
diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
index ad887d4..9ac3515 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchAction.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchAction.java
@@ -350,6 +350,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
                         SearchCompiler.compile(ss);
                         super.buttonAction(buttonIndex, evt);
                     } catch (ParseError e) {
+                        Main.debug(e);
                         JOptionPane.showMessageDialog(
                                 Main.parent,
                                 tr("Search expression is not valid: \n\n {0}", e.getMessage()),
@@ -529,7 +530,89 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
     }
 
     static void search(SearchSetting s) {
-        SearchTask.newSearchTask(s).run();
+        SearchTask.newSearchTask(s, new SelectSearchReceiver()).run();
+    }
+
+    /**
+     * Performs the search specified by the search string {@code search} and the search mode {@code mode} and returns the result of the search.
+     *
+     * @param search the search string to use
+     * @param mode the search mode to use
+     * @return The result of the search.
+     * @since 10457
+     */
+    public static Collection<OsmPrimitive> searchAndReturn(String search, SearchMode mode) {
+        final SearchSetting searchSetting = new SearchSetting();
+        searchSetting.text = search;
+        searchSetting.mode = mode;
+        CapturingSearchReceiver receiver = new CapturingSearchReceiver();
+        SearchTask.newSearchTask(searchSetting, receiver).run();
+        return receiver.result;
+    }
+
+    /**
+     * Interfaces implementing this may receive the result of the current search.
+     * @author Michael Zangl
+     * @since 10457
+     */
+    interface SearchReceiver {
+        /**
+         * Receive the search result
+         * @param ds The data set searched on.
+         * @param result The result collection, including the initial collection.
+         * @param foundMatches The number of matches added to the result.
+         * @param setting The setting used.
+         */
+        void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting);
+    }
+
+    /**
+     * Select the search result and display a status text for it.
+     */
+    private static class SelectSearchReceiver implements SearchReceiver {
+
+        @Override
+        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches, SearchSetting setting) {
+            ds.setSelected(result);
+            if (foundMatches == 0) {
+                final String msg;
+                final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
+                if (setting.mode == SearchMode.replace) {
+                    msg = tr("No match found for ''{0}''", text);
+                } else if (setting.mode == SearchMode.add) {
+                    msg = tr("Nothing added to selection by searching for ''{0}''", text);
+                } else if (setting.mode == SearchMode.remove) {
+                    msg = tr("Nothing removed from selection by searching for ''{0}''", text);
+                } else if (setting.mode == SearchMode.in_selection) {
+                    msg = tr("Nothing found in selection by searching for ''{0}''", text);
+                } else {
+                    msg = null;
+                }
+                Main.map.statusLine.setHelpText(msg);
+                JOptionPane.showMessageDialog(
+                        Main.parent,
+                        msg,
+                        tr("Warning"),
+                        JOptionPane.WARNING_MESSAGE
+                );
+            } else {
+                Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
+            }
+        }
+    }
+
+    /**
+     * This class stores the result of the search in a local variable.
+     * @author Michael Zangl
+     */
+    private static final class CapturingSearchReceiver implements SearchReceiver {
+        private Collection<OsmPrimitive> result;
+
+        @Override
+        public void receiveSearchResult(DataSet ds, Collection<OsmPrimitive> result, int foundMatches,
+                SearchSetting setting) {
+                    this.result = result;
+        }
     }
 
     static final class SearchTask extends PleaseWaitRunnable {
@@ -539,24 +622,38 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         private final Predicate<OsmPrimitive> predicate;
         private boolean canceled;
         private int foundMatches;
+        private SearchReceiver resultReceiver;
 
-        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate) {
+        private SearchTask(DataSet ds, SearchSetting setting, Collection<OsmPrimitive> selection, Predicate<OsmPrimitive> predicate,
+                SearchReceiver resultReceiver) {
             super(tr("Searching"));
             this.ds = ds;
             this.setting = setting;
             this.selection = selection;
             this.predicate = predicate;
+            this.resultReceiver = resultReceiver;
+        }
+
+        static SearchTask newSearchTask(SearchSetting setting, SearchReceiver resultReceiver) {
+            final DataSet ds = Main.getLayerManager().getEditDataSet();
+            return newSearchTask(setting, ds, resultReceiver);
         }
 
-        static SearchTask newSearchTask(SearchSetting setting) {
-            final DataSet ds = Main.main.getCurrentDataSet();
+        /**
+         * Create a new search task for the given search setting.
+         * @param setting The setting to use
+         * @param ds The data set to search on
+         * @param resultReceiver will receive the search result
+         * @return A new search task.
+         */
+        private static SearchTask newSearchTask(SearchSetting setting, final DataSet ds, SearchReceiver resultReceiver) {
             final Collection<OsmPrimitive> selection = new HashSet<>(ds.getAllSelected());
             return new SearchTask(ds, setting, selection, new Predicate<OsmPrimitive>() {
                 @Override
                 public boolean evaluate(OsmPrimitive o) {
                     return ds.isSelected(o);
                 }
-            });
+            }, resultReceiver);
         }
 
         @Override
@@ -578,9 +675,9 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
 
                 Collection<OsmPrimitive> all;
                 if (setting.allElements) {
-                    all = Main.main.getCurrentDataSet().allPrimitives();
+                    all = Main.getLayerManager().getEditDataSet().allPrimitives();
                 } else {
-                    all = Main.main.getCurrentDataSet().allNonDeletedCompletePrimitives();
+                    all = Main.getLayerManager().getEditDataSet().allNonDeletedCompletePrimitives();
                 }
                 final ProgressMonitor subMonitor = getProgressMonitor().createSubTaskMonitor(all.size(), false);
                 subMonitor.beginTask(trn("Searching in {0} object", "Searching in {0} objects", all.size(), all.size()));
@@ -607,13 +704,13 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
                     subMonitor.worked(1);
                 }
                 subMonitor.finishTask();
-            } catch (SearchCompiler.ParseError e) {
+            } catch (ParseError e) {
+                Main.debug(e);
                 JOptionPane.showMessageDialog(
                         Main.parent,
                         e.getMessage(),
                         tr("Error"),
                         JOptionPane.ERROR_MESSAGE
-
                 );
             }
         }
@@ -623,31 +720,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
             if (canceled) {
                 return;
             }
-            ds.setSelected(selection);
-            if (foundMatches == 0) {
-                final String msg;
-                final String text = Utils.shortenString(setting.text, MAX_LENGTH_SEARCH_EXPRESSION_DISPLAY);
-                if (setting.mode == SearchMode.replace) {
-                    msg = tr("No match found for ''{0}''", text);
-                } else if (setting.mode == SearchMode.add) {
-                    msg = tr("Nothing added to selection by searching for ''{0}''", text);
-                } else if (setting.mode == SearchMode.remove) {
-                    msg = tr("Nothing removed from selection by searching for ''{0}''", text);
-                } else if (setting.mode == SearchMode.in_selection) {
-                    msg = tr("Nothing found in selection by searching for ''{0}''", text);
-                } else {
-                    msg = null;
-                }
-                Main.map.statusLine.setHelpText(msg);
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        msg,
-                        tr("Warning"),
-                        JOptionPane.WARNING_MESSAGE
-                );
-            } else {
-                Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
-            }
+            resultReceiver.receiveSearchResult(ds, selection, foundMatches, setting);
         }
     }
 
@@ -783,7 +856,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
      */
     @Override
     protected void updateEnabledState() {
-        setEnabled(getEditLayer() != null);
+        setEnabled(getLayerManager().getEditLayer() != null);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
index 49a766a..12e1f3d 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
@@ -67,8 +67,8 @@ public class SearchCompiler {
 
     private final boolean caseSensitive;
     private final boolean regexSearch;
-    private static String  rxErrorMsg = marktr("The regex \"{0}\" had a parse error at offset {1}, full error:\n\n{2}");
-    private static String  rxErrorMsgNoPos = marktr("The regex \"{0}\" had a parse error, full error:\n\n{1}");
+    private static String rxErrorMsg = marktr("The regex \"{0}\" had a parse error at offset {1}, full error:\n\n{2}");
+    private static String rxErrorMsgNoPos = marktr("The regex \"{0}\" had a parse error, full error:\n\n{1}");
     private final PushbackTokenizer tokenizer;
     private static Map<String, SimpleMatchFactory> simpleMatchFactoryMap = new HashMap<>();
     private static Map<String, UnaryMatchFactory> unaryMatchFactoryMap = new HashMap<>();
diff --git a/src/org/openstreetmap/josm/actions/upload/ApiPreconditionCheckerHook.java b/src/org/openstreetmap/josm/actions/upload/ApiPreconditionCheckerHook.java
index 18ac258..d487363 100644
--- a/src/org/openstreetmap/josm/actions/upload/ApiPreconditionCheckerHook.java
+++ b/src/org/openstreetmap/josm/actions/upload/ApiPreconditionCheckerHook.java
@@ -41,6 +41,7 @@ public class ApiPreconditionCheckerHook implements UploadHook {
                     return false;
             }
         } catch (OsmTransferCanceledException e) {
+            Main.trace(e);
             return false;
         } catch (OsmApiInitializationException e) {
             ExceptionDialogUtil.explainOsmTransferException(e);
@@ -72,7 +73,7 @@ public class ApiPreconditionCheckerHook implements UploadHook {
                             tr("Precondition Violation"),
                             JOptionPane.ERROR_MESSAGE
                     );
-                    Main.main.getCurrentDataSet().setSelected(Collections.singleton(osmPrimitive));
+                    Main.getLayerManager().getEditDataSet().setSelected(Collections.singleton(osmPrimitive));
                     return false;
                 }
             }
@@ -89,7 +90,7 @@ public class ApiPreconditionCheckerHook implements UploadHook {
                         tr("API Capabilities Violation"),
                         JOptionPane.ERROR_MESSAGE
                 );
-                Main.main.getCurrentDataSet().setSelected(Collections.singleton(osmPrimitive));
+                Main.getLayerManager().getEditDataSet().setSelected(Collections.singleton(osmPrimitive));
                 return false;
             }
         }
diff --git a/src/org/openstreetmap/josm/actions/upload/FixDataHook.java b/src/org/openstreetmap/josm/actions/upload/FixDataHook.java
index ce29fff..8367ce5 100644
--- a/src/org/openstreetmap/josm/actions/upload/FixDataHook.java
+++ b/src/org/openstreetmap/josm/actions/upload/FixDataHook.java
@@ -35,6 +35,7 @@ public class FixDataHook implements UploadHook {
      * Constructor for data initialization
      */
     public FixDataHook() {
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         deprecated.add(new FixDataSpace());
         deprecated.add(new FixDataKey("color",            "colour"));
         deprecated.add(new FixDataTag("highway", "ford",  "ford",    "yes"));
@@ -43,6 +44,7 @@ public class FixDataHook implements UploadHook {
         deprecated.add(new FixDataTag("oneway",  "true",  "oneway",  "yes"));
         deprecated.add(new FixDataTag("oneway",  "1",     "oneway",  "yes"));
         deprecated.add(new FixDataTag("highway", "stile", "barrier", "stile"));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         deprecated.add(new FixData() {
             @Override
             public boolean fixKeys(Map<String, String> keys, OsmPrimitive osm) {
diff --git a/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java b/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
index 51307a4..2704956 100644
--- a/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
+++ b/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
@@ -13,7 +13,6 @@ import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.OsmValidator;
@@ -72,7 +71,7 @@ public class ValidateUploadHook implements UploadHook {
                 }
             }
         }
-        OsmDataLayer editLayer = JosmAction.getEditLayer();
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer != null) {
             editLayer.validationErrors.clear();
             editLayer.validationErrors.addAll(errors);
@@ -150,7 +149,7 @@ public class ValidateUploadHook implements UploadHook {
             OsmValidator.initializeTests();
             OsmValidator.initializeErrorLayer();
             Main.map.validatorDialog.unfurlDialog();
-            Main.main.getCurrentDataSet().fireSelectionChanged();
+            Main.getLayerManager().getEditDataSet().fireSelectionChanged();
             return false;
         }
         return true;
diff --git a/src/org/openstreetmap/josm/command/AddCommand.java b/src/org/openstreetmap/josm/command/AddCommand.java
index f22603b..0ed62bb 100644
--- a/src/org/openstreetmap/josm/command/AddCommand.java
+++ b/src/org/openstreetmap/josm/command/AddCommand.java
@@ -58,7 +58,7 @@ public class AddCommand extends Command {
 
     @Override
     public boolean executeCommand() {
-        getLayer().data.addPrimitive(osm);
+        getAffectedDataSet().addPrimitive(osm);
         osm.setModified(true);
         checkNodeStyles(osm);
         return true;
@@ -66,7 +66,7 @@ public class AddCommand extends Command {
 
     @Override
     public void undoCommand() {
-        getLayer().data.removePrimitive(osm);
+        getAffectedDataSet().removePrimitive(osm);
         checkNodeStyles(osm);
     }
 
diff --git a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
index 1c43060..c3a9ab7 100644
--- a/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
+++ b/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
@@ -77,7 +77,7 @@ public class AddPrimitivesCommand extends Command {
             primitivesToSelect = new ArrayList<>(toSelect.size());
 
             for (PrimitiveData pd : data) {
-                OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
+                OsmPrimitive primitive = getAffectedDataSet().getPrimitiveById(pd);
                 boolean created = primitive == null;
                 if (created) {
                     primitive = pd.getType().newInstance(pd.getUniqueId(), true);
@@ -86,7 +86,7 @@ public class AddPrimitivesCommand extends Command {
                     primitive.load(pd);
                 }
                 if (created) {
-                    getLayer().data.addPrimitive(primitive);
+                    getAffectedDataSet().addPrimitive(primitive);
                 }
                 newPrimitives.add(primitive);
                 if (toSelect.contains(pd)) {
@@ -114,7 +114,7 @@ public class AddPrimitivesCommand extends Command {
     }
 
     @Override public void undoCommand() {
-        DataSet ds = getLayer().data;
+        DataSet ds = getAffectedDataSet();
 
         if (createdPrimitives == null) {
             createdPrimitives = new ArrayList<>(data.size());
@@ -166,7 +166,7 @@ public class AddPrimitivesCommand extends Command {
 
         Collection<OsmPrimitive> prims = new HashSet<>();
         for (PrimitiveData d : data) {
-            OsmPrimitive osm = getLayer().data.getPrimitiveById(d);
+            OsmPrimitive osm = getAffectedDataSet().getPrimitiveById(d);
             if (osm == null)
                 throw new RuntimeException();
             prims.add(osm);
diff --git a/src/org/openstreetmap/josm/command/Command.java b/src/org/openstreetmap/josm/command/Command.java
index 07cc022..031eec2 100644
--- a/src/org/openstreetmap/josm/command/Command.java
+++ b/src/org/openstreetmap/josm/command/Command.java
@@ -16,6 +16,7 @@ import javax.swing.JPanel;
 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.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
@@ -130,7 +131,7 @@ public abstract class Command extends PseudoCommand {
      * Creates a new command in the context of the current edit layer, if any
      */
     public Command() {
-        this.layer = Main.main == null ? null : Main.main.getEditLayer();
+        this.layer = Main.getLayerManager().getEditLayer();
     }
 
     /**
@@ -147,7 +148,10 @@ public abstract class Command extends PseudoCommand {
     /**
      * Executes the command on the dataset. This implementation will remember all
      * primitives returned by fillModifiedData for restoring them on undo.
+     * <p>
+     * The layer should be invalidated after execution so that it can be re-painted.
      * @return true
+     * @see #invalidateAffectedLayers()
      */
     public boolean executeCommand() {
         CloneVisitor visitor = new CloneVisitor();
@@ -209,6 +213,15 @@ public abstract class Command extends PseudoCommand {
     }
 
     /**
+     * Gets the data set this command affects.
+     * @return The data set. May be <code>null</code> if no layer was set and no edit layer was found.
+     * @since 10467
+     */
+    public DataSet getAffectedDataSet() {
+        return layer == null ? null : layer.data;
+    }
+
+    /**
      * Fill in the changed data this command operates on.
      * Add to the lists, don't clear them.
      *
@@ -299,4 +312,15 @@ public abstract class Command extends PseudoCommand {
         return Objects.equals(cloneMap, command.cloneMap) &&
                 Objects.equals(layer, command.layer);
     }
+
+    /**
+     * Invalidate all layers that were affected by this command.
+     * @see Layer#invalidate()
+     */
+    public void invalidateAffectedLayers() {
+        OsmDataLayer layer = getLayer();
+        if (layer != null) {
+            layer.invalidate();
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/command/MoveCommand.java b/src/org/openstreetmap/josm/command/MoveCommand.java
index 3c474c5..65466ce 100644
--- a/src/org/openstreetmap/josm/command/MoveCommand.java
+++ b/src/org/openstreetmap/josm/command/MoveCommand.java
@@ -106,7 +106,7 @@ public class MoveCommand extends Command {
      */
     public MoveCommand(Collection<OsmPrimitive> objects, EastNorth start, EastNorth end) {
         this(objects, end.getX()-start.getX(), end.getY()-start.getY());
-        startEN =  start;
+        startEN = start;
     }
 
     /**
@@ -117,7 +117,7 @@ public class MoveCommand extends Command {
      */
     public MoveCommand(OsmPrimitive p, EastNorth start, EastNorth end) {
         this(Collections.singleton(p), end.getX()-start.getX(), end.getY()-start.getY());
-        startEN =  start;
+        startEN = start;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/command/PurgeCommand.java b/src/org/openstreetmap/josm/command/PurgeCommand.java
index 8c53cf5..d092898 100644
--- a/src/org/openstreetmap/josm/command/PurgeCommand.java
+++ b/src/org/openstreetmap/josm/command/PurgeCommand.java
@@ -230,10 +230,8 @@ public class PurgeCommand extends Command {
 
         List<Relation> outR = new ArrayList<>(inR.size());
         while (!childlessR.isEmpty()) {
-            // Identify one childless Relation and
-            // let it virtually die. This makes other
-            // relations childless.
-            Iterator<Relation> it  = childlessR.iterator();
+            // Identify one childless Relation and let it virtually die. This makes other relations childless.
+            Iterator<Relation> it = childlessR.iterator();
             Relation next = it.next();
             it.remove();
             outR.add(next);
diff --git a/src/org/openstreetmap/josm/command/RotateCommand.java b/src/org/openstreetmap/josm/command/RotateCommand.java
index e37a4eb..c4fdc8e 100644
--- a/src/org/openstreetmap/josm/command/RotateCommand.java
+++ b/src/org/openstreetmap/josm/command/RotateCommand.java
@@ -80,8 +80,10 @@ public class RotateCommand extends TransformNodesCommand {
             EastNorth oldEastNorth = oldStates.get(n).getEastNorth();
             double x = oldEastNorth.east() - pivot.east();
             double y = oldEastNorth.north() - pivot.north();
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             double nx =  cosPhi * x + sinPhi * y + pivot.east();
             double ny = -sinPhi * x + cosPhi * y + pivot.north();
+            // CHECKSTYLE.ON: SingleSpaceSeparator
             n.setEastNorth(new EastNorth(nx, ny));
         }
     }
diff --git a/src/org/openstreetmap/josm/command/ScaleCommand.java b/src/org/openstreetmap/josm/command/ScaleCommand.java
index 440ecad..2c7d043 100644
--- a/src/org/openstreetmap/josm/command/ScaleCommand.java
+++ b/src/org/openstreetmap/josm/command/ScaleCommand.java
@@ -43,7 +43,7 @@ public class ScaleCommand extends TransformNodesCommand {
         // Note that SelectAction will keep the same ScaleCommand when the user
         // releases the button and presses it again with the same modifiers.
         // The very first point of this operation is stored here.
-        startEN   = currentEN;
+        startEN = currentEN;
 
         handleEvent(currentEN);
     }
diff --git a/src/org/openstreetmap/josm/command/SelectCommand.java b/src/org/openstreetmap/josm/command/SelectCommand.java
index df372ad..d893d18 100644
--- a/src/org/openstreetmap/josm/command/SelectCommand.java
+++ b/src/org/openstreetmap/josm/command/SelectCommand.java
@@ -37,13 +37,13 @@ public class SelectCommand extends Command {
 
     @Override
     public void undoCommand() {
-        Main.map.mapView.getEditLayer().data.setSelected(oldSelection);
+        Main.getLayerManager().getEditLayer().data.setSelected(oldSelection);
     }
 
     @Override
     public boolean executeCommand() {
-        oldSelection = Main.map.mapView.getEditLayer().data.getSelected();
-        Main.map.mapView.getEditLayer().data.setSelected(newSelection);
+        oldSelection = Main.getLayerManager().getEditLayer().data.getSelected();
+        Main.getLayerManager().getEditLayer().data.setSelected(newSelection);
         return true;
     }
 
diff --git a/src/org/openstreetmap/josm/command/SequenceCommand.java b/src/org/openstreetmap/josm/command/SequenceCommand.java
index 22428c8..eb74259 100644
--- a/src/org/openstreetmap/josm/command/SequenceCommand.java
+++ b/src/org/openstreetmap/josm/command/SequenceCommand.java
@@ -125,6 +125,14 @@ public class SequenceCommand extends Command {
     }
 
     @Override
+    public void invalidateAffectedLayers() {
+        super.invalidateAffectedLayers();
+        for (Command c : sequence) {
+            c.invalidateAffectedLayers();
+        }
+    }
+
+    @Override
     public int hashCode() {
         return Objects.hash(super.hashCode(), Arrays.hashCode(sequence), sequenceComplete, name, continueOnError);
     }
diff --git a/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java b/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java
index d3da64b..99f8248 100644
--- a/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java
@@ -31,7 +31,7 @@ public class ConflictAddCommand extends Command {
      */
     public ConflictAddCommand(OsmDataLayer layer, Conflict<? extends OsmPrimitive> conflict) {
         super(layer);
-        this.conflict  = conflict;
+        this.conflict = conflict;
     }
 
     protected void warnBecauseOfDoubleConflict() {
@@ -61,7 +61,7 @@ public class ConflictAddCommand extends Command {
 
     @Override
     public void undoCommand() {
-        if (Main.isDisplayingMapView() && !Main.map.mapView.hasLayer(getLayer())) {
+        if (Main.isDisplayingMapView() && !Main.getLayerManager().containsLayer(getLayer())) {
             Main.warn(tr("Layer ''{0}'' does not exist any more. Cannot remove conflict for object ''{1}''.",
                     getLayer().getName(),
                     conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance())
diff --git a/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java b/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java
index 98c40de..5f21a57 100644
--- a/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java
@@ -70,7 +70,7 @@ public abstract class ConflictResolveCommand extends Command {
         super.undoCommand();
 
         if (Main.isDisplayingMapView()) {
-            if (!Main.map.mapView.hasLayer(getLayer())) {
+            if (!Main.getLayerManager().containsLayer(getLayer())) {
                 Main.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
                         this.toString(),
                         getLayer().toString()
@@ -78,7 +78,7 @@ public abstract class ConflictResolveCommand extends Command {
                 return;
             }
 
-            Main.map.mapView.setActiveLayer(getLayer());
+            Main.getLayerManager().setActiveLayer(getLayer());
         }
         reconstituteConflicts();
     }
diff --git a/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java b/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java
index 5905af2..c795bb2 100644
--- a/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java
@@ -74,7 +74,7 @@ public class RelationMemberConflictResolverCommand extends ConflictResolveComman
     @Override
     public void undoCommand() {
         OsmDataLayer layer = getLayer();
-        if (!Main.map.mapView.hasLayer(layer)) {
+        if (!Main.getLayerManager().containsLayer(layer)) {
             Main.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
                     this.toString(),
                     layer.toString()
@@ -82,8 +82,8 @@ public class RelationMemberConflictResolverCommand extends ConflictResolveComman
             return;
         }
 
-        Main.map.mapView.setActiveLayer(layer);
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        Main.getLayerManager().setActiveLayer(layer);
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
 
         // restore the former state
         //
diff --git a/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java b/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
index f94b18d..5d2e85b 100644
--- a/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
@@ -58,7 +58,7 @@ public class WayNodesConflictResolverCommand extends ConflictResolveCommand {
         // replace the list of nodes of 'my' way by the list of merged nodes
         //
         for (Node n:mergedNodeList) {
-            if (!getLayer().data.getNodes().contains(n)) {
+            if (!getAffectedDataSet().getNodes().contains(n)) {
                 Main.warn(tr("Main dataset does not include node {0}", n.toString()));
             }
         }
diff --git a/src/org/openstreetmap/josm/data/AutosaveTask.java b/src/org/openstreetmap/josm/data/AutosaveTask.java
index d872628..a72f525 100644
--- a/src/org/openstreetmap/josm/data/AutosaveTask.java
+++ b/src/org/openstreetmap/josm/data/AutosaveTask.java
@@ -23,6 +23,8 @@ import java.util.List;
 import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.Main;
@@ -33,10 +35,11 @@ import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.Notification;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.OsmExporter;
@@ -58,6 +61,9 @@ import org.openstreetmap.josm.tools.Utils;
  *      open with another versions of JOSM or fix the problem manually.
  *
  *      The deleted layers dir keeps at most PROP_DELETED_LAYERS files.
+ *
+ * @since  3378 (creation)
+ * @since 10386 (new LayerChangeListener interface)
  */
 public class AutosaveTask extends TimerTask implements LayerChangeListener, Listener {
 
@@ -103,6 +109,9 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         return autosaveDir.toPath();
     }
 
+    /**
+     * Starts the autosave background task.
+     */
     public void schedule() {
         if (PROP_INTERVAL.get() > 0) {
 
@@ -124,12 +133,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
 
             timer = new Timer(true);
             timer.schedule(this, 1000L, PROP_INTERVAL.get() * 1000L);
-            MapView.addLayerChangeListener(this);
-            if (Main.isDisplayingMapView()) {
-                for (OsmDataLayer l: Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
-                    registerNewlayer(l);
-                }
-            }
+            Main.getLayerManager().addLayerChangeListener(this, true);
         }
     }
 
@@ -182,7 +186,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
                     Main.warn(tr("Unable to create file {0}, other filename will be used", result.getAbsolutePath()));
                 }
             } catch (IOException e) {
-                Main.error(tr("IOError while creating file, autosave will be skipped: {0}", e.getMessage()));
+                Main.error(e, tr("IOError while creating file, autosave will be skipped: {0}", e.getMessage()));
                 return null;
             }
             index++;
@@ -249,7 +253,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
 
@@ -261,17 +265,17 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            registerNewlayer((OsmDataLayer) newLayer);
+    public void layerAdded(LayerAddEvent e) {
+        if (e.getAddedLayer() instanceof OsmDataLayer) {
+            registerNewlayer((OsmDataLayer) e.getAddedLayer());
         }
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof OsmDataLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof OsmDataLayer) {
             synchronized (layersLock) {
-                OsmDataLayer osmLayer = (OsmDataLayer) oldLayer;
+                OsmDataLayer osmLayer = (OsmDataLayer) e.getRemovedLayer();
                 osmLayer.data.removeDataSetListener(datasetAdapter);
                 Iterator<AutosaveLayerInfo> it = layersInfo.iterator();
                 while (it.hasNext()) {
@@ -352,15 +356,25 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         return false;
     }
 
-    public void recoverUnsavedLayers() {
+    /**
+     * Recover the unsaved layers and open them asynchronously.
+     * @return A future that can be used to wait for the completion of this task.
+     */
+    public Future<?> recoverUnsavedLayers() {
         List<File> files = getUnsavedLayersFiles();
         final OpenFileTask openFileTsk = new OpenFileTask(files, null, tr("Restoring files"));
-        Main.worker.submit(openFileTsk);
-        Main.worker.submit(new Runnable() {
+        final Future<?> openFilesFuture = Main.worker.submit(openFileTsk);
+        return Main.worker.submit(new Runnable() {
             @Override
             public void run() {
-                for (File f: openFileTsk.getSuccessfullyOpenedFiles()) {
-                    moveToDeletedLayersFolder(f);
+                try {
+                    // Wait for opened tasks to be generated.
+                    openFilesFuture.get();
+                    for (File f: openFileTsk.getSuccessfullyOpenedFiles()) {
+                        moveToDeletedLayersFolder(f);
+                    }
+                } catch (InterruptedException | ExecutionException e) {
+                    Main.error(e);
                 }
             }
         });
@@ -401,6 +415,9 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         }
     }
 
+    /**
+     * Mark all unsaved layers as deleted. They are still preserved in the deleted layers folder.
+     */
     public void discardUnsavedLayers() {
         for (File f: getUnsavedLayersFiles()) {
             moveToDeletedLayersFolder(f);
diff --git a/src/org/openstreetmap/josm/data/CustomConfigurator.java b/src/org/openstreetmap/josm/data/CustomConfigurator.java
index d59297d..1b6321a 100644
--- a/src/org/openstreetmap/josm/data/CustomConfigurator.java
+++ b/src/org/openstreetmap/josm/data/CustomConfigurator.java
@@ -34,7 +34,6 @@ import javax.script.ScriptException;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.transform.OutputKeys;
@@ -96,6 +95,17 @@ public final class CustomConfigurator {
     }
 
     /**
+     * Log an exception.
+     * @param e exception to log
+     * @param s message prefix
+     * @since 10469
+     */
+    public static void log(Exception e, String s) {
+        summary.append(s + ' ' + Main.getErrorMessage(e));
+        summary.append('\n');
+    }
+
+    /**
      * Returns the log.
      * @return the log
      */
@@ -268,16 +278,12 @@ public final class CustomConfigurator {
 
         try {
             String toXML = Main.pref.toXML(true);
-            InputStream is = new ByteArrayInputStream(toXML.getBytes(StandardCharsets.UTF_8));
-            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-            builderFactory.setValidating(false);
-            builderFactory.setNamespaceAware(false);
-            DocumentBuilder builder = builderFactory.newDocumentBuilder();
-            document = builder.parse(is);
+            DocumentBuilder builder = Utils.newSafeDOMBuilder();
+            document = builder.parse(new ByteArrayInputStream(toXML.getBytes(StandardCharsets.UTF_8)));
             exportDocument = builder.newDocument();
             root = document.getDocumentElement();
         } catch (SAXException | IOException | ParserConfigurationException ex) {
-            Main.warn("Error getting preferences to save:" +ex.getMessage());
+            Main.warn(ex, "Error getting preferences to save:");
         }
         if (root == null || exportDocument == null)
             return;
@@ -343,7 +349,7 @@ public final class CustomConfigurator {
 
     private static boolean busy;
 
-    public static void pluginOperation(String install, String uninstall, String delete)  {
+    public static void pluginOperation(String install, String uninstall, String delete) {
         final List<String> installList = new ArrayList<>();
         final List<String> removeList = new ArrayList<>();
         final List<String> deleteList = new ArrayList<>();
@@ -458,22 +464,18 @@ public final class CustomConfigurator {
                     openAndReadXML(is);
                 }
             } catch (ScriptException | IOException | SecurityException ex) {
-                log("Error reading custom preferences: " + ex.getMessage());
+                log(ex, "Error reading custom preferences:");
             }
         }
 
         public void openAndReadXML(InputStream is) {
             try {
-                DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-                builderFactory.setValidating(false);
-                builderFactory.setNamespaceAware(true);
-                DocumentBuilder builder = builderFactory.newDocumentBuilder();
-                Document document = builder.parse(is);
+                Document document = Utils.parseSafeDOM(is);
                 synchronized (CustomConfigurator.class) {
                     processXML(document);
                 }
             } catch (SAXException | IOException | ParserConfigurationException ex) {
-                log("Error reading custom preferences: "+ex.getMessage());
+                log(ex, "Error reading custom preferences:");
             }
             log("-- Reading complete --");
         }
@@ -588,7 +590,7 @@ public final class CustomConfigurator {
                     PreferencesUtils.loadPrefsToJS(engine, tmpPref, fragmentVar, false);
                     // we store this fragment as API.fragments['id']
                 } catch (ScriptException ex) {
-                    log("Error: can not load preferences fragment : "+ex.getMessage());
+                    log(ex, "Error: can not load preferences fragment:");
                 }
             }
 
@@ -600,7 +602,7 @@ public final class CustomConfigurator {
                 log("Preferences append: %d keys: %s\n",
                    tmpPref.getAllSettings().size(), tmpPref.getAllSettings().keySet().toString());
                 PreferencesUtils.appendPreferences(tmpPref, mainPrefs);
-            }  else if ("delete-values".equals(oper)) {
+            } else if ("delete-values".equals(oper)) {
                 PreferencesUtils.deletePreferenceValues(tmpPref, mainPrefs);
             }
         }
@@ -672,7 +674,7 @@ public final class CustomConfigurator {
             try {
                 engine.eval(name+"='"+value+"';");
             } catch (ScriptException ex) {
-                log("Error: Can not assign variable: %s=%s  : %s\n", name, value, ex.getMessage());
+                log(ex, String.format("Error: Can not assign variable: %s=%s :", name, value));
             }
         }
 
@@ -715,7 +717,7 @@ public final class CustomConfigurator {
                 PreferencesUtils.modifyPreferencesByScript(engine, mainPrefs, js);
             } catch (ScriptException ex) {
                 messageBox("e", ex.getMessage());
-                log("JS error: "+ex.getMessage());
+                log(ex, "JS error:");
             }
             log("Script finished");
         }
@@ -733,7 +735,7 @@ public final class CustomConfigurator {
                     String result = engine.eval(mr.group(1)).toString();
                     mr.appendReplacement(sb, result);
                 } catch (ScriptException ex) {
-                    log("Error: Can not evaluate expression %s : %s",  mr.group(1), ex.getMessage());
+                    log(ex, String.format("Error: Can not evaluate expression %s :", mr.group(1)));
                 }
             }
             mr.appendTail(sb);
@@ -754,7 +756,7 @@ public final class CustomConfigurator {
                 CharArrayReader reader = new CharArrayReader(fragmentWithReplacedVars.toCharArray());
                 tmpPref.fromXML(reader);
             } catch (TransformerException | XMLStreamException | IOException ex) {
-                log("Error: can not read XML fragment :" + ex.getMessage());
+                log(ex, "Error: can not read XML fragment:");
             }
 
             return tmpPref;
@@ -915,7 +917,7 @@ public final class CustomConfigurator {
         }
     }
 
-    private static Collection<String> getCollection(Preferences mainpref, String key, boolean warnUnknownDefault)  {
+    private static Collection<String> getCollection(Preferences mainpref, String key, boolean warnUnknownDefault) {
         ListSetting existing = Utils.cast(mainpref.settingsMap.get(key), ListSetting.class);
         ListSetting defaults = Utils.cast(mainpref.defaultsMap.get(key), ListSetting.class);
         if (existing == null && defaults == null) {
@@ -928,7 +930,7 @@ public final class CustomConfigurator {
             return defaults.getValue() == null ? null : new ArrayList<>(defaults.getValue());
     }
 
-    private static Collection<Collection<String>> getArray(Preferences mainpref, String key, boolean warnUnknownDefault)  {
+    private static Collection<Collection<String>> getArray(Preferences mainpref, String key, boolean warnUnknownDefault) {
         ListListSetting existing = Utils.cast(mainpref.settingsMap.get(key), ListListSetting.class);
         ListListSetting defaults = Utils.cast(mainpref.defaultsMap.get(key), ListListSetting.class);
 
@@ -942,7 +944,7 @@ public final class CustomConfigurator {
             return defaults.getValue() == null ? null : new ArrayList<Collection<String>>(defaults.getValue());
     }
 
-    private static List<Map<String, String>> getListOfStructs(Preferences mainpref, String key, boolean warnUnknownDefault)  {
+    private static List<Map<String, String>> getListOfStructs(Preferences mainpref, String key, boolean warnUnknownDefault) {
         MapListSetting existing = Utils.cast(mainpref.settingsMap.get(key), MapListSetting.class);
         MapListSetting defaults = Utils.cast(mainpref.settingsMap.get(key), MapListSetting.class);
 
@@ -1030,7 +1032,7 @@ public final class CustomConfigurator {
         engine.eval(finish);
 
         @SuppressWarnings("unchecked")
-        Map<String, String> stringMap =  (Map<String, String>) engine.get("stringMap");
+        Map<String, String> stringMap = (Map<String, String>) engine.get("stringMap");
         @SuppressWarnings("unchecked")
         Map<String, List<String>> listMap = (SortedMap<String, List<String>>) engine.get("listMap");
         @SuppressWarnings("unchecked")
@@ -1072,7 +1074,7 @@ public final class CustomConfigurator {
      */
     public static void loadPrefsToJS(ScriptEngine engine, Preferences tmpPref, String whereToPutInJS, boolean includeDefaults)
             throws ScriptException {
-        Map<String, String> stringMap =  new TreeMap<>();
+        Map<String, String> stringMap = new TreeMap<>();
         Map<String, List<String>> listMap = new TreeMap<>();
         Map<String, List<List<String>>> listlistMap = new TreeMap<>();
         Map<String, List<Map<String, String>>> listmapMap = new TreeMap<>();
diff --git a/src/org/openstreetmap/josm/data/DataSource.java b/src/org/openstreetmap/josm/data/DataSource.java
index c3d78c4..a20838d 100644
--- a/src/org/openstreetmap/josm/data/DataSource.java
+++ b/src/org/openstreetmap/josm/data/DataSource.java
@@ -38,6 +38,15 @@ public class DataSource {
         this.origin = origin;
     }
 
+    /**
+     * Cosntructs a new {@link DataSource}
+     * @param source The source to copy the data from.
+     * @since 10346
+     */
+    public DataSource(DataSource source) {
+        this(source.bounds, source.origin);
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(bounds, origin);
diff --git a/src/org/openstreetmap/josm/data/Preferences.java b/src/org/openstreetmap/josm/data/Preferences.java
index 6003919..74c9b67 100644
--- a/src/org/openstreetmap/josm/data/Preferences.java
+++ b/src/org/openstreetmap/josm/data/Preferences.java
@@ -506,16 +506,16 @@ public class Preferences {
      * Called after every put. In case of a problem, do nothing but output the error in log.
      * @throws IOException if any I/O error occurs
      */
-    public void save() throws IOException {
+    public synchronized void save() throws IOException {
         save(getPreferenceFile(),
                 new FilteredCollection<>(settingsMap.entrySet(), NO_DEFAULT_SETTINGS_ENTRY), false);
     }
 
-    public void saveDefaults() throws IOException {
+    public synchronized void saveDefaults() throws IOException {
         save(getDefaultsCacheFile(), defaultsMap.entrySet(), true);
     }
 
-    public void save(File prefFile, Collection<Entry<String, Setting<?>>> settings, boolean defaults) throws IOException {
+    protected void save(File prefFile, Collection<Entry<String, Setting<?>>> settings, boolean defaults) throws IOException {
 
         if (!defaults) {
             /* currently unused, but may help to fix configuration issues in future */
@@ -908,7 +908,7 @@ public class Preferences {
                 try {
                     save();
                 } catch (IOException e) {
-                    Main.warn(tr("Failed to persist preferences to ''{0}''", getPreferenceFile().getAbsoluteFile()));
+                    Main.warn(e, tr("Failed to persist preferences to ''{0}''", getPreferenceFile().getAbsoluteFile()));
                 }
             }
         }
@@ -1250,7 +1250,7 @@ public class Preferences {
         try {
             struct = klass.getConstructor().newInstance();
         } catch (ReflectiveOperationException ex) {
-            throw new RuntimeException(ex);
+            throw new IllegalArgumentException(ex);
         }
         for (Entry<String, String> key_value : hash.entrySet()) {
             Object value;
@@ -1258,6 +1258,7 @@ public class Preferences {
             try {
                 f = klass.getDeclaredField(key_value.getKey().replace('-', '_'));
             } catch (NoSuchFieldException ex) {
+                Main.trace(ex);
                 continue;
             }
             if (f.getAnnotation(pref.class) == null) {
@@ -1278,7 +1279,7 @@ public class Preferences {
                 } catch (NumberFormatException nfe) {
                     continue;
                 }
-            } else  if (f.getType() == String.class) {
+            } else if (f.getType() == String.class) {
                 value = key_value.getValue();
             } else if (f.getType().isAssignableFrom(Map.class)) {
                 value = mapFromJson(key_value.getValue());
diff --git a/src/org/openstreetmap/josm/data/UndoRedoHandler.java b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
index bb07a61..6f77728 100644
--- a/src/org/openstreetmap/josm/data/UndoRedoHandler.java
+++ b/src/org/openstreetmap/josm/data/UndoRedoHandler.java
@@ -9,12 +9,21 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class UndoRedoHandler implements MapView.LayerChangeListener {
+/**
+ * This is the global undo/redo handler for all {@link OsmDataLayer}s.
+ * <p>
+ * If you want to change a data layer, you can use {@link #add(Command)} to execute a command on it and make that command undoable.
+ */
+public class UndoRedoHandler implements LayerChangeListener {
 
     /**
      * All commands that were made on the dataset. Don't write from outside!
@@ -31,7 +40,7 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
      * Constructs a new {@code UndoRedoHandler}.
      */
     public UndoRedoHandler() {
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     /**
@@ -41,6 +50,7 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
     public void addNoRedraw(final Command c) {
         CheckParameterUtil.ensureParameterNotNull(c, "c");
         c.executeCommand();
+        c.invalidateAffectedLayers();
         commands.add(c);
         // Limit the number of commands in the undo list.
         // Currently you have to undo the commands one by one. If
@@ -51,14 +61,11 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
         redoCommands.clear();
     }
 
+    /**
+     * Fires a commands change event after adding a command.
+     */
     public void afterAdd() {
         fireCommandsChanged();
-
-        // the command may have changed the selection so tell the listeners about the current situation
-        DataSet ds = Main.main.getCurrentDataSet();
-        if (ds != null) {
-            ds.fireSelectionChanged();
-        }
     }
 
     /**
@@ -66,8 +73,22 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
      * @param c The command to execute. Must not be {@code null}.
      */
     public synchronized void add(final Command c) {
+        DataSet ds = c.getAffectedDataSet();
+        if (ds == null) {
+            // old, legacy behaviour
+            ds = Main.getLayerManager().getEditDataSet();
+        }
+        Collection<? extends OsmPrimitive> oldSelection = null;
+        if (ds != null) {
+            oldSelection = ds.getSelected();
+        }
         addNoRedraw(c);
         afterAdd();
+
+        // the command may have changed the selection so tell the listeners about the current situation
+        if (ds != null) {
+            fireIfSelectionChanged(ds, oldSelection);
+        }
     }
 
     /**
@@ -84,25 +105,24 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
     public synchronized void undo(int num) {
         if (commands.isEmpty())
             return;
-        Collection<? extends OsmPrimitive> oldSelection = Main.main.getCurrentDataSet().getSelected();
-        Main.main.getCurrentDataSet().beginUpdate();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
+        Collection<? extends OsmPrimitive> oldSelection = ds.getSelected();
+        ds.beginUpdate();
         try {
             for (int i = 1; i <= num; ++i) {
                 final Command c = commands.removeLast();
                 c.undoCommand();
+                c.invalidateAffectedLayers();
                 redoCommands.addFirst(c);
                 if (commands.isEmpty()) {
                     break;
                 }
             }
         } finally {
-            Main.main.getCurrentDataSet().endUpdate();
+            ds.endUpdate();
         }
         fireCommandsChanged();
-        Collection<? extends OsmPrimitive> newSelection = Main.main.getCurrentDataSet().getSelected();
-        if (!oldSelection.equals(newSelection)) {
-            Main.main.getCurrentDataSet().fireSelectionChanged();
-        }
+        fireIfSelectionChanged(ds, oldSelection);
     }
 
     /**
@@ -119,34 +139,50 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
     public void redo(int num) {
         if (redoCommands.isEmpty())
             return;
-        Collection<? extends OsmPrimitive> oldSelection = Main.main.getCurrentDataSet().getSelected();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
+        Collection<? extends OsmPrimitive> oldSelection = ds.getSelected();
         for (int i = 0; i < num; ++i) {
             final Command c = redoCommands.removeFirst();
             c.executeCommand();
+            c.invalidateAffectedLayers();
             commands.add(c);
             if (redoCommands.isEmpty()) {
                 break;
             }
         }
         fireCommandsChanged();
-        Collection<? extends OsmPrimitive> newSelection = Main.main.getCurrentDataSet().getSelected();
+        fireIfSelectionChanged(ds, oldSelection);
+    }
+
+    private static void fireIfSelectionChanged(DataSet ds, Collection<? extends OsmPrimitive> oldSelection) {
+        Collection<? extends OsmPrimitive> newSelection = ds.getSelected();
         if (!oldSelection.equals(newSelection)) {
-            Main.main.getCurrentDataSet().fireSelectionChanged();
+            ds.fireSelectionChanged();
         }
     }
 
-    public void fireCommandsChanged() {
+    /**
+     * Fires a command change to all listeners.
+     */
+    private void fireCommandsChanged() {
         for (final CommandQueueListener l : listenerCommands) {
             l.commandChanged(commands.size(), redoCommands.size());
         }
     }
 
+    /**
+     * Resets the undo/redo list.
+     */
     public void clean() {
         redoCommands.clear();
         commands.clear();
         fireCommandsChanged();
     }
 
+    /**
+     * Resets all commands that affect the given layer.
+     * @param layer The layer that was affected.
+     */
     public void clean(Layer layer) {
         if (layer == null)
             return;
@@ -169,17 +205,17 @@ public class UndoRedoHandler implements MapView.LayerChangeListener {
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        clean(oldLayer);
+    public void layerRemoving(LayerRemoveEvent e) {
+        clean(e.getRemovedLayer());
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
 
diff --git a/src/org/openstreetmap/josm/data/Version.java b/src/org/openstreetmap/josm/data/Version.java
index 9f1c41b..5ed9cc9 100644
--- a/src/org/openstreetmap/josm/data/Version.java
+++ b/src/org/openstreetmap/josm/data/Version.java
@@ -58,7 +58,7 @@ public class Version {
         try {
             properties.load(revisionInfo);
         } catch (IOException e) {
-            Main.warn(tr("Error reading revision info from revision file: {0}", e.getMessage()));
+            Main.warn(e, tr("Error reading revision info from revision file: {0}", e.getMessage()));
         }
         String value = properties.getProperty("Revision");
         if (value != null) {
@@ -84,7 +84,7 @@ public class Version {
         //
         isLocalBuild = false;
         value = properties.getProperty("Is-Local-Build");
-        if (value != null && "true".equalsIgnoreCase(value.trim()))  {
+        if (value != null && "true".equalsIgnoreCase(value.trim())) {
             isLocalBuild = true;
         }
 
@@ -92,7 +92,7 @@ public class Version {
         //
         buildName = null;
         value = properties.getProperty("Build-Name");
-        if (value != null && !value.trim().isEmpty())  {
+        if (value != null && !value.trim().isEmpty()) {
             buildName = value.trim();
         }
 
@@ -129,7 +129,7 @@ public class Version {
      * @return the JOSM version
      */
     public String getVersionString() {
-        return  version == 0 ? tr("UNKNOWN") : Integer.toString(version);
+        return version == 0 ? tr("UNKNOWN") : Integer.toString(version);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/cache/CacheEntryAttributes.java b/src/org/openstreetmap/josm/data/cache/CacheEntryAttributes.java
index 7e741dd..d1ed1f1 100644
--- a/src/org/openstreetmap/josm/data/cache/CacheEntryAttributes.java
+++ b/src/org/openstreetmap/josm/data/cache/CacheEntryAttributes.java
@@ -91,7 +91,7 @@ public class CacheEntryAttributes extends ElementAttributes {
     private long getLongAttr(String key) {
         String val = attrs.get(key);
         if (val == null) {
-            attrs.put(key,  "0");
+            attrs.put(key, "0");
             return 0;
         }
         try {
@@ -187,6 +187,14 @@ public class CacheEntryAttributes extends ElementAttributes {
     }
 
     /**
+     * @param error error related to this object
+     * @since 10469
+     */
+    public void setError(Exception error) {
+        setErrorMessage(Main.getErrorMessage(error));
+    }
+
+    /**
      * @param message error message related to this object
      */
     public void setErrorMessage(String message) {
diff --git a/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java b/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
index ff5b30a..68b0119 100644
--- a/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
+++ b/src/org/openstreetmap/josm/data/cache/HostLimitQueue.java
@@ -62,9 +62,7 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
                     try {
                         url = job.getUrl();
                     } catch (IOException e) {
-                        if (Main.isDebugEnabled()) {
-                            Main.debug(e.getMessage());
-                        }
+                        Main.debug(e);
                     }
                     Main.debug("TMS - Skipping job {0} because host limit reached", url);
                 }
@@ -99,7 +97,7 @@ public class HostLimitQueue extends LinkedBlockingDeque<Runnable> {
         return job;
     }
 
-    private  Semaphore getSemaphore(JCSCachedTileLoaderJob<?, ?> job) {
+    private Semaphore getSemaphore(JCSCachedTileLoaderJob<?, ?> job) {
         String host;
         try {
             host = job.getUrl().getHost();
diff --git a/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java b/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
index 4cd9e68..46eeffa 100644
--- a/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
+++ b/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
@@ -29,6 +29,7 @@ import org.openstreetmap.gui.jmapviewer.FeatureAdapter;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * @author Wiktor Niesiobędzki
@@ -41,9 +42,9 @@ public final class JCSCacheManager {
     private static final Logger LOG = FeatureAdapter.getLogger(JCSCacheManager.class.getCanonicalName());
 
     private static volatile CompositeCacheManager cacheManager;
-    private static long maxObjectTTL        = -1;
+    private static long maxObjectTTL = -1;
     private static final String PREFERENCE_PREFIX = "jcs.cache";
-    private static BooleanProperty USE_BLOCK_CACHE = new BooleanProperty(PREFERENCE_PREFIX + ".use_block_cache", true);
+    public static BooleanProperty USE_BLOCK_CACHE = new BooleanProperty(PREFERENCE_PREFIX + ".use_block_cache", true);
 
     private static final AuxiliaryCacheFactory diskCacheFactory =
             USE_BLOCK_CACHE.get() ? new BlockDiskCacheFactory() : new IndexedDiskCacheFactory();
@@ -52,7 +53,7 @@ public final class JCSCacheManager {
     /**
      * default objects to be held in memory by JCS caches (per region)
      */
-    public static final IntegerProperty DEFAULT_MAX_OBJECTS_IN_MEMORY  = new IntegerProperty(PREFERENCE_PREFIX + ".max_objects_in_memory", 1000);
+    public static final IntegerProperty DEFAULT_MAX_OBJECTS_IN_MEMORY = new IntegerProperty(PREFERENCE_PREFIX + ".max_objects_in_memory", 1000);
 
     private JCSCacheManager() {
         // Hide implicit public constructor for utility classes
@@ -113,6 +114,7 @@ public final class JCSCacheManager {
         Properties props = new Properties();
         // these are default common to all cache regions
         // use of auxiliary cache and sizing of the caches is done with giving proper geCache(...) params
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         props.setProperty("jcs.default.cacheattributes",                      CompositeCacheAttributes.class.getCanonicalName());
         props.setProperty("jcs.default.cacheattributes.MaxObjects",           DEFAULT_MAX_OBJECTS_IN_MEMORY.get().toString());
         props.setProperty("jcs.default.cacheattributes.UseMemoryShrinker",    "true");
@@ -122,6 +124,7 @@ public final class JCSCacheManager {
         props.setProperty("jcs.default.elementattributes.MaxLife",            Long.toString(maxObjectTTL));
         props.setProperty("jcs.default.elementattributes.IdleTime",           Long.toString(maxObjectTTL));
         props.setProperty("jcs.default.elementattributes.IsSpool",            "true");
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         CompositeCacheManager cm = CompositeCacheManager.getUnconfiguredInstance();
         cm.configure(props);
         cacheManager = cm;
@@ -199,6 +202,7 @@ public final class JCSCacheManager {
         if (USE_BLOCK_CACHE.get()) {
             BlockDiskCacheAttributes blockAttr = new BlockDiskCacheAttributes();
             blockAttr.setMaxKeySize(maxDiskObjects);
+            blockAttr.setBlockSizeBytes(4096); // use 4k blocks
             ret = blockAttr;
         } else {
             IndexedDiskCacheAttributes indexAttr = new IndexedDiskCacheAttributes();
@@ -212,20 +216,22 @@ public final class JCSCacheManager {
         } else {
             ret.setDiskPath(cachePath);
         }
-        ret.setCacheName(cacheName + (USE_BLOCK_CACHE.get() ? "_BLOCK" : "_INDEX"));
+        ret.setCacheName(cacheName + (USE_BLOCK_CACHE.get() ? "_BLOCK_v2" : "_INDEX_v2"));
 
-        removeStaleFiles(cachePath + File.separator + cacheName, (USE_BLOCK_CACHE.get() ? "_INDEX" : "_BLOCK"));
+        removeStaleFiles(cachePath + File.separator + cacheName, (USE_BLOCK_CACHE.get() ? "_INDEX_v2" : "_BLOCK_v2"));
         return ret;
     }
 
     private static void removeStaleFiles(String basePathPart, String suffix) {
         deleteCacheFiles(basePathPart); // TODO: this can be removed around 2016.09
+        deleteCacheFiles(basePathPart + "_BLOCK"); // TODO: this can be removed around 2016.09
+        deleteCacheFiles(basePathPart + "_INDEX"); // TODO: this can be removed around 2016.09
         deleteCacheFiles(basePathPart + suffix);
     }
 
     private static void deleteCacheFiles(String basePathPart) {
-        new File(basePathPart + ".key").delete();
-        new File(basePathPart + ".data").delete();
+        Utils.deleteFile(new File(basePathPart + ".key"));
+        Utils.deleteFile(new File(basePathPart + ".data"));
     }
 
     private static CompositeCacheAttributes getCacheAttributes(int maxMemoryElements) {
diff --git a/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java b/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
index 1719511..dcc5f24 100644
--- a/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
+++ b/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
@@ -71,7 +71,7 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
      */
 
     private static final ThreadPoolExecutor DEFAULT_DOWNLOAD_JOB_DISPATCHER = new ThreadPoolExecutor(
-            2, // we have a small queue, so threads will be quickly started (threads are started only, when queue is full)
+            1, // we have a small queue, so threads will be quickly started (threads are started only, when queue is full)
             THREAD_LIMIT.get(), // do not this number of threads
             30, // keepalive for thread
             TimeUnit.SECONDS,
@@ -312,7 +312,7 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
 
             final HttpClient request = getRequest("GET", true);
 
-            if (isObjectLoadable()  &&
+            if (isObjectLoadable() &&
                     (now - attributes.getLastModification()) <= ABSOLUTE_EXPIRE_TIME_LIMIT) {
                 request.setIfModifiedSince(attributes.getLastModification());
             }
@@ -377,7 +377,7 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
         } catch (FileNotFoundException e) {
             log.log(Level.FINE, "JCS - Caching empty object as server returned 404 for: {0}", getUrlNoException());
             attributes.setResponseCode(404);
-            attributes.setErrorMessage(e.toString());
+            attributes.setError(e);
             boolean doCache = isResponseLoadable(null, 404, null) || cacheAsEmpty();
             if (doCache) {
                 cacheData = createCacheEntry(new byte[]{});
@@ -386,7 +386,7 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
             return doCache;
         } catch (IOException e) {
             log.log(Level.FINE, "JCS - IOExecption during communication with server for: {0}", getUrlNoException());
-            attributes.setErrorMessage(e.toString());
+            attributes.setError(e);
             attributes.setResponseCode(499); // set dummy error code
             boolean doCache = isResponseLoadable(null, 499, null) || cacheAsEmpty(); //generic 499 error code returned
             if (doCache) {
@@ -395,8 +395,8 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
             }
             return doCache;
         } catch (InterruptedException e) {
-            attributes.setErrorMessage(e.toString());
-            log.log(Level.WARNING, "JCS - Exception during download {0}",  getUrlNoException());
+            attributes.setError(e);
+            log.log(Level.WARNING, "JCS - Exception during download {0}", getUrlNoException());
             Main.warn(e);
         }
         log.log(Level.WARNING, "JCS - Silent failure during download: {0}", getUrlNoException());
diff --git a/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java b/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java
index 961e8eb..4eb31d0 100644
--- a/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java
+++ b/src/org/openstreetmap/josm/data/conflict/ConflictCollection.java
@@ -234,7 +234,7 @@ public class ConflictCollection implements Iterable<Conflict<? extends OsmPrimit
      * @return true, if this collection includes a conflict for <code>their</code>; false, otherwise
      */
     public boolean hasConflictForTheir(OsmPrimitive their) {
-        return getConflictForTheir(their)  != null;
+        return getConflictForTheir(their) != null;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/coor/CachedLatLon.java b/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
index b847b19..12ee12b 100644
--- a/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/CachedLatLon.java
@@ -1,6 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.coor;
 
+import java.util.Objects;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.projection.Projection;
 
@@ -53,7 +55,7 @@ public class CachedLatLon extends LatLon {
      * @return the internally cached east/north coordinates. null, if the globally defined projection is null
      */
     public final EastNorth getEastNorth() {
-        if (proj != Main.getProjection()) {
+        if (!Objects.equals(proj, Main.getProjection())) {
             proj = Main.getProjection();
             eastNorth = proj.latlon2eastNorth(this);
         }
@@ -61,6 +63,19 @@ public class CachedLatLon extends LatLon {
     }
 
     @Override
+    public int hashCode() {
+        return Objects.hash(x, y, eastNorth);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!super.equals(obj))
+            return false;
+        CachedLatLon other = (CachedLatLon) obj;
+        return Objects.equals(eastNorth, other.eastNorth);
+    }
+
+    @Override
     public String toString() {
         return "CachedLatLon[lat="+lat()+",lon="+lon()+']';
     }
diff --git a/src/org/openstreetmap/josm/data/coor/EastNorth.java b/src/org/openstreetmap/josm/data/coor/EastNorth.java
index 77fca04..3add3ec 100644
--- a/src/org/openstreetmap/josm/data/coor/EastNorth.java
+++ b/src/org/openstreetmap/josm/data/coor/EastNorth.java
@@ -12,14 +12,27 @@ public class EastNorth extends Coordinate {
 
     private static final long serialVersionUID = 1L;
 
+    /**
+     * Constructs a new {@code EastNorth}.
+     * @param east easting
+     * @param north northing
+     */
     public EastNorth(double east, double north) {
         super(east, north);
     }
 
+    /**
+     * Returns easting.
+     * @return easting
+     */
     public double east() {
         return x;
     }
 
+    /**
+     * Returns northing.
+     * @return northing
+     */
     public double north() {
         return y;
     }
@@ -52,6 +65,11 @@ public class EastNorth extends Coordinate {
         return new EastNorth(x-other.x, y-other.y);
     }
 
+    /**
+     * Scales this {@link EastNorth} instance to a given factor and returns the result.
+     * @param s factor
+     * @return The result.
+     */
     public EastNorth scale(double s) {
         return new EastNorth(s * x, s * y);
     }
@@ -143,8 +161,10 @@ public class EastNorth extends Coordinate {
         double sinPhi = Math.sin(angle);
         double x = east() - pivot.east();
         double y = north() - pivot.north();
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         double nx =  cosPhi * x + sinPhi * y + pivot.east();
         double ny = -sinPhi * x + cosPhi * y + pivot.north();
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         return new EastNorth(nx, ny);
     }
 
diff --git a/src/org/openstreetmap/josm/data/coor/LatLon.java b/src/org/openstreetmap/josm/data/coor/LatLon.java
index 7c18c29..2a7e628 100644
--- a/src/org/openstreetmap/josm/data/coor/LatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/LatLon.java
@@ -55,10 +55,9 @@ public class LatLon extends Coordinate {
      */
     public static final LatLon ZERO = new LatLon(0, 0);
 
-    /**
-     * North and south pole.
-     */
+    /** North pole. */
     public static final LatLon NORTH_POLE = new LatLon(90, 0);
+    /** South pole. */
     public static final LatLon SOUTH_POLE = new LatLon(-90, 0);
 
     private static DecimalFormat cDmsMinuteFormatter = new DecimalFormat("00");
@@ -226,7 +225,6 @@ public class LatLon extends Coordinate {
         this(coor.getLat(), coor.getLon());
     }
 
-
     /**
      * Returns the latitude, i.e., the north-south position in degrees.
      * @return the latitude
@@ -486,10 +484,10 @@ public class LatLon extends Coordinate {
     @Override
     public boolean equals(Object obj) {
         if (this == obj) return true;
-        if (!(obj instanceof LatLon)) return false;
+        if (obj == null || getClass() != obj.getClass()) return false;
         LatLon that = (LatLon) obj;
         return Double.compare(that.x, x) == 0 &&
-                Double.compare(that.y, y) == 0;
+               Double.compare(that.y, y) == 0;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/gpx/GpxData.java b/src/org/openstreetmap/josm/data/gpx/GpxData.java
index 2d01218..da6d631 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxData.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxData.java
@@ -202,7 +202,7 @@ public class GpxData extends WithAttributes implements Data {
                 } else {
                     if (pnt.compareTo(earliest) < 0) {
                         earliest = pnt;
-                    } else {
+                    } else if (pnt.compareTo(latest) > 0) {
                         latest = pnt;
                     }
                 }
diff --git a/src/org/openstreetmap/josm/data/gpx/WayPoint.java b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
index 510f90f..7b85ee5 100644
--- a/src/org/openstreetmap/josm/data/gpx/WayPoint.java
+++ b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
@@ -18,7 +18,7 @@ import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 public class WayPoint extends WithAttributes implements Comparable<WayPoint>, TemplateEngineDataProvider {
 
     /**
-     * The seconds (not milliseconds!) since 1970-01-01.
+     * The seconds (not milliseconds!) since 1970-01-01 00:00 UTC
      */
     public double time;
     public Color customColoring;
diff --git a/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java b/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
index 508f525..eb26517 100644
--- a/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
@@ -76,7 +76,7 @@ public class CachedAttributionBingAerialTileSource extends BingAerialTileSource
                         }
                         return ret;
                     } catch (IOException ex) {
-                        Main.warn("Could not connect to Bing API. Will retry in " + waitTimeSec + " seconds.");
+                        Main.warn(ex, "Could not connect to Bing API. Will retry in " + waitTimeSec + " seconds.");
                         Thread.sleep(waitTimeSec * 1000L);
                         waitTimeSec *= 2;
                     }
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index ef417fa..764e7dc 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
@@ -862,7 +862,7 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
      */
     public String getExtendedUrl() {
         return imageryType.getTypeString() + (defaultMaxZoom != 0
-            ? ('['+(defaultMinZoom != 0 ? (Integer.toString(defaultMinZoom) + ',') : "")+defaultMaxZoom+"]") : "") + ':' + url;
+            ? ('['+(defaultMinZoom != 0 ? (Integer.toString(defaultMinZoom) + ',') : "")+defaultMaxZoom+']') : "") + ':' + url;
     }
 
     public String getToolbarName() {
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
index d52eea8..a3aedd5 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
@@ -142,7 +142,7 @@ public class ImageryLayerInfo {
             try {
                 OnlineResource.JOSM_WEBSITE.checkOfflineAccess(source, Main.getJOSMWebsite());
             } catch (OfflineAccessException e) {
-                Main.warn(e.getMessage());
+                Main.warn(e, false);
                 online = false;
             }
             if (clearCache && online) {
diff --git a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
index a2368e4..2f723b6 100644
--- a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
+++ b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
@@ -24,6 +24,7 @@ import org.openstreetmap.gui.jmapviewer.interfaces.TileJob;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
 import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
 import org.openstreetmap.josm.data.cache.CacheEntry;
 import org.openstreetmap.josm.data.cache.CacheEntryAttributes;
@@ -38,7 +39,7 @@ import org.openstreetmap.josm.tools.HttpClient;
  * Class bridging TMS requests to JCS cache requests
  * @since 8168
  */
-public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, BufferedImageCacheEntry> implements TileJob, ICachedLoaderListener  {
+public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, BufferedImageCacheEntry> implements TileJob, ICachedLoaderListener {
     private static final Logger LOG = FeatureAdapter.getLogger(TMSCachedTileLoaderJob.class.getCanonicalName());
     private static final LongProperty MAXIMUM_EXPIRES = new LongProperty("imagery.generic.maximum_expires",
             30 /*days*/ * 24 /*hours*/ * 60 /*minutes*/ * 60 /*seconds*/ *1000L /*milliseconds*/);
@@ -123,7 +124,7 @@ public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, Buffe
         if (cacheData != null) {
             byte[] content = cacheData.getContent();
             try {
-                return content != null  || cacheData.getImage() != null || isNoTileAtZoom();
+                return content != null || cacheData.getImage() != null || isNoTileAtZoom();
             } catch (IOException e) {
                 LOG.log(Level.WARNING, "JCS TMS - error loading from cache for tile {0}: {1}", new Object[] {tile.getKey(), e.getMessage()});
             }
@@ -153,6 +154,7 @@ public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, Buffe
             super.submit(this, force);
         } catch (IOException e) {
             // if we fail to submit the job, mark tile as loaded and set error message
+            Main.warn(e, false);
             tile.finishLoading();
             tile.setError(e.getMessage());
         }
@@ -207,7 +209,7 @@ public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, Buffe
             }
         } catch (IOException e) {
             LOG.log(Level.WARNING, "JCS TMS - error loading object for tile {0}: {1}", new Object[] {tile.getKey(), e.getMessage()});
-            tile.setError(e.toString());
+            tile.setError(e);
             tile.setLoaded(false);
             if (listeners != null) { // listeners might be null, if some other thread notified already about success
                 for (TileLoaderListener l: listeners) {
diff --git a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
index 6e808ee..0d826ae 100644
--- a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
@@ -45,17 +45,19 @@ public class TemplatedWMSTileSource extends TMSTileSource implements TemplatedTi
     private int[] tileYMax;
     private double[] degreesPerTile;
 
-    private static final Pattern PATTERN_HEADER  = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}");
-    private static final Pattern PATTERN_PROJ    = Pattern.compile("\\{proj\\}");
-    private static final Pattern PATTERN_WKID    = Pattern.compile("\\{wkid\\}");
-    private static final Pattern PATTERN_BBOX    = Pattern.compile("\\{bbox\\}");
-    private static final Pattern PATTERN_W       = Pattern.compile("\\{w\\}");
-    private static final Pattern PATTERN_S       = Pattern.compile("\\{s\\}");
-    private static final Pattern PATTERN_E       = Pattern.compile("\\{e\\}");
-    private static final Pattern PATTERN_N       = Pattern.compile("\\{n\\}");
-    private static final Pattern PATTERN_WIDTH   = Pattern.compile("\\{width\\}");
-    private static final Pattern PATTERN_HEIGHT  = Pattern.compile("\\{height\\}");
-    private static final Pattern PATTERN_PARAM   = Pattern.compile("\\{([^}]+)\\}");
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
+    private static final Pattern PATTERN_HEADER = Pattern.compile("\\{header\\(([^,]+),([^}]+)\\)\\}");
+    private static final Pattern PATTERN_PROJ   = Pattern.compile("\\{proj\\}");
+    private static final Pattern PATTERN_WKID   = Pattern.compile("\\{wkid\\}");
+    private static final Pattern PATTERN_BBOX   = Pattern.compile("\\{bbox\\}");
+    private static final Pattern PATTERN_W      = Pattern.compile("\\{w\\}");
+    private static final Pattern PATTERN_S      = Pattern.compile("\\{s\\}");
+    private static final Pattern PATTERN_E      = Pattern.compile("\\{e\\}");
+    private static final Pattern PATTERN_N      = Pattern.compile("\\{n\\}");
+    private static final Pattern PATTERN_WIDTH  = Pattern.compile("\\{width\\}");
+    private static final Pattern PATTERN_HEIGHT = Pattern.compile("\\{height\\}");
+    private static final Pattern PATTERN_PARAM  = Pattern.compile("\\{([^}]+)\\}");
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     private static final NumberFormat latLonFormat = new DecimalFormat("###0.0000000", new DecimalFormatSymbols(Locale.US));
 
@@ -268,7 +270,7 @@ public class TemplatedWMSTileSource extends TMSTileSource implements TemplatedTi
 
     @Override
     public TileXY latLonToTileXY(ICoordinate point, int zoom) {
-        return latLonToTileXY(point.getLat(),  point.getLon(), zoom);
+        return latLonToTileXY(point.getLat(), point.getLon(), zoom);
     }
 
     @Override
@@ -296,7 +298,7 @@ public class TemplatedWMSTileSource extends TMSTileSource implements TemplatedTi
         double scale = getDegreesPerTile(zoom) / getTileSize();
         EastNorth point = Main.getProjection().latlon2eastNorth(new LatLon(lat, lon));
         return new Point(
-                    (int) Math.round((point.east() - anchorPosition.east())   / scale),
+                    (int) Math.round((point.east() - anchorPosition.east()) / scale),
                     (int) Math.round((anchorPosition.north() - point.north()) / scale)
                 );
     }
diff --git a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
index c8a5b80..c38297d 100644
--- a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
@@ -60,7 +60,7 @@ import org.openstreetmap.josm.tools.Utils;
  * @since 8526
  */
 public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTileSource {
-    private static final String PATTERN_HEADER  = "\\{header\\(([^,]+),([^}]+)\\)\\}";
+    private static final String PATTERN_HEADER = "\\{header\\(([^,]+),([^}]+)\\)\\}";
 
     private static final String URL_GET_ENCODING_PARAMS = "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER={layer}&STYLE={style}&"
             + "FORMAT={format}&tileMatrixSet={TileMatrixSet}&tileMatrix={TileMatrix}&tileRow={TileRow}&tileCol={TileCol}";
@@ -811,7 +811,7 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
 
     @Override
     public TileXY latLonToTileXY(ICoordinate point, int zoom) {
-        return latLonToTileXY(point.getLat(),  point.getLon(), zoom);
+        return latLonToTileXY(point.getLat(), point.getLon(), zoom);
     }
 
     @Override
@@ -843,7 +843,7 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
         double scale = matrix.scaleDenominator * this.crsScale;
         EastNorth point = Main.getProjection().latlon2eastNorth(new LatLon(lat, lon));
         return new Point(
-                    (int) Math.round((point.east() - matrix.topLeftCorner.east())   / scale),
+                    (int) Math.round((point.east() - matrix.topLeftCorner.east()) / scale),
                     (int) Math.round((matrix.topLeftCorner.north() - point.north()) / scale)
                 );
     }
diff --git a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
index ac349f8..1c371f3 100644
--- a/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
@@ -59,7 +59,7 @@ public abstract class AbstractPrimitive implements IPrimitive {
      * This flag is false, if the object is marked
      * as deleted on the server.
      */
-    protected static final int FLAG_VISIBLE  = 1 << 1;
+    protected static final int FLAG_VISIBLE = 1 << 1;
 
     /**
      * An object that was deleted by the user.
@@ -68,7 +68,7 @@ public abstract class AbstractPrimitive implements IPrimitive {
      * An object usually cannot be deleted if it has non-deleted
      * objects still referring to it.
      */
-    protected static final int FLAG_DELETED  = 1 << 2;
+    protected static final int FLAG_DELETED = 1 << 2;
 
     /**
      * A primitive is incomplete if we know its id and type, but nothing more.
diff --git a/src/org/openstreetmap/josm/data/osm/BBox.java b/src/org/openstreetmap/josm/data/osm/BBox.java
index 7a6bb16..a5c5d78 100644
--- a/src/org/openstreetmap/josm/data/osm/BBox.java
+++ b/src/org/openstreetmap/josm/data/osm/BBox.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.data.osm;
 
 import java.awt.geom.Rectangle2D;
 import java.util.Arrays;
+import java.util.Objects;
 
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
@@ -51,7 +52,7 @@ public class BBox {
         this.ymax = copy.ymax;
     }
 
-    public BBox(double ax, double ay, double bx, double by)  {
+    public BBox(double ax, double ay, double bx, double by) {
 
         if (ax > bx) {
             xmax = ax;
@@ -92,18 +93,18 @@ public class BBox {
         }
     }
 
-    private void sanity()  {
+    private void sanity() {
         if (xmin < -180.0) {
             xmin = -180.0;
         }
-        if (xmax >  180.0) {
-            xmax =  180.0;
+        if (xmax > 180.0) {
+            xmax = 180.0;
         }
-        if (ymin <  -90.0) {
-            ymin =  -90.0;
+        if (ymin < -90.0) {
+            ymin = -90.0;
         }
-        if (ymax >   90.0) {
-            ymax =   90.0;
+        if (ymax > 90.0) {
+            ymax = 90.0;
         }
     }
 
@@ -265,17 +266,16 @@ public class BBox {
 
     @Override
     public int hashCode() {
-        return (int) (ymin * xmin);
+        return Objects.hash(xmin, xmax, ymin, ymax);
     }
 
     @Override
     public boolean equals(Object o) {
-        if (o instanceof BBox) {
-            BBox b = (BBox) o;
-            return b.xmax == xmax && b.ymax == ymax
-                    && b.xmin == xmin && b.ymin == ymin;
-        } else
-            return false;
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        BBox b = (BBox) o;
+        return Double.compare(b.xmax, xmax) == 0 && Double.compare(b.ymax, ymax) == 0
+            && Double.compare(b.xmin, xmin) == 0 && Double.compare(b.ymin, ymin) == 0;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/osm/Changeset.java b/src/org/openstreetmap/josm/data/osm/Changeset.java
index 94741f4..d8b9cd8 100644
--- a/src/org/openstreetmap/josm/data/osm/Changeset.java
+++ b/src/org/openstreetmap/josm/data/osm/Changeset.java
@@ -325,7 +325,7 @@ public final class Changeset implements Tagged {
         this.user = other.user;
         this.createdAt = other.createdAt;
         this.closedAt = other.closedAt;
-        this.open  = other.open;
+        this.open = other.open;
         this.min = other.min;
         this.max = other.max;
         this.commentsCount = other.commentsCount;
diff --git a/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java b/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java
index bc9c346..7c363fb 100644
--- a/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java
+++ b/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java
@@ -143,7 +143,7 @@ public class ChangesetDataSet {
      * dataset
      */
     public HistoryOsmPrimitive getPrimitive(PrimitiveId id) {
-        if (id == null)  return null;
+        if (id == null) return null;
         return primitives.get(id);
     }
 
diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
index b497d0d..fe3febc 100644
--- a/src/org/openstreetmap/josm/data/osm/DataSet.java
+++ b/src/org/openstreetmap/josm/data/osm/DataSet.java
@@ -137,6 +137,56 @@ public final class DataSet implements Data, Cloneable, ProjectionChangeListener
     }
 
     /**
+     * Creates a new {@link DataSet}.
+     * @param copyFrom An other {@link DataSet} to copy the contents of this dataset from.
+     * @since 10346
+     */
+    public DataSet(DataSet copyFrom) {
+        this();
+        copyFrom.getReadLock().lock();
+        try {
+            Map<OsmPrimitive, OsmPrimitive> primMap = new HashMap<>();
+            for (Node n : copyFrom.nodes) {
+                Node newNode = new Node(n);
+                primMap.put(n, newNode);
+                addPrimitive(newNode);
+            }
+            for (Way w : copyFrom.ways) {
+                Way newWay = new Way(w);
+                primMap.put(w, newWay);
+                List<Node> newNodes = new ArrayList<>();
+                for (Node n: w.getNodes()) {
+                    newNodes.add((Node) primMap.get(n));
+                }
+                newWay.setNodes(newNodes);
+                addPrimitive(newWay);
+            }
+            // Because relations can have other relations as members we first clone all relations
+            // and then get the cloned members
+            for (Relation r : copyFrom.relations) {
+                Relation newRelation = new Relation(r, r.isNew());
+                newRelation.setMembers(null);
+                primMap.put(r, newRelation);
+                addPrimitive(newRelation);
+            }
+            for (Relation r : copyFrom.relations) {
+                Relation newRelation = (Relation) primMap.get(r);
+                List<RelationMember> newMembers = new ArrayList<>();
+                for (RelationMember rm: r.getMembers()) {
+                    newMembers.add(new RelationMember(rm.getRole(), primMap.get(rm.getMember())));
+                }
+                newRelation.setMembers(newMembers);
+            }
+            for (DataSource source : copyFrom.dataSources) {
+                dataSources.add(new DataSource(source));
+            }
+            version = copyFrom.version;
+        } finally {
+            copyFrom.getReadLock().unlock();
+        }
+    }
+
+    /**
      * Returns the lock used for reading.
      * @return the lock used for reading
      */
@@ -872,54 +922,14 @@ public final class DataSet implements Data, Cloneable, ProjectionChangeListener
         }
     }
 
+    /**
+     * Return a copy of this dataset
+     * @deprecated Use the copy constructor instead. Remove in July 2016
+     */
+    @Deprecated
     @Override
     public DataSet clone() {
-        getReadLock().lock();
-        try {
-            DataSet ds = (DataSet) super.clone();
-            Main.addProjectionChangeListener(ds);
-            Map<OsmPrimitive, OsmPrimitive> primMap = new HashMap<>();
-            for (Node n : nodes) {
-                Node newNode = new Node(n);
-                primMap.put(n, newNode);
-                ds.addPrimitive(newNode);
-            }
-            for (Way w : ways) {
-                Way newWay = new Way(w);
-                primMap.put(w, newWay);
-                List<Node> newNodes = new ArrayList<>();
-                for (Node n: w.getNodes()) {
-                    newNodes.add((Node) primMap.get(n));
-                }
-                newWay.setNodes(newNodes);
-                ds.addPrimitive(newWay);
-            }
-            // Because relations can have other relations as members we first clone all relations
-            // and then get the cloned members
-            for (Relation r : relations) {
-                Relation newRelation = new Relation(r, r.isNew());
-                newRelation.setMembers(null);
-                primMap.put(r, newRelation);
-                ds.addPrimitive(newRelation);
-            }
-            for (Relation r : relations) {
-                Relation newRelation = (Relation) primMap.get(r);
-                List<RelationMember> newMembers = new ArrayList<>();
-                for (RelationMember rm: r.getMembers()) {
-                    newMembers.add(new RelationMember(rm.getRole(), primMap.get(rm.getMember())));
-                }
-                newRelation.setMembers(newMembers);
-            }
-            for (DataSource source : dataSources) {
-                ds.dataSources.add(new DataSource(source.bounds, source.origin));
-            }
-            ds.version = version;
-            return ds;
-        } catch (CloneNotSupportedException e) {
-            throw new IllegalStateException(e);
-        } finally {
-            getReadLock().unlock();
-        }
+        return new DataSet(this);
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java b/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
index 830334a..2888e7b 100644
--- a/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
+++ b/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
@@ -140,7 +140,7 @@ public class DatasetConsistencyTest {
             printError("NO DATASET", "%s is referenced by %s but not found in dataset", primitive, parent);
         } else if (dataSet.getPrimitiveById(primitive) == null) {
             printError("REFERENCED BUT NOT IN DATA", "%s is referenced by %s but not found in dataset", primitive, parent);
-        } else  if (dataSet.getPrimitiveById(primitive) != primitive) {
+        } else if (dataSet.getPrimitiveById(primitive) != primitive) {
             printError("DIFFERENT INSTANCE", "%s is different instance that referred by %s", primitive, parent);
         }
 
diff --git a/src/org/openstreetmap/josm/data/osm/Filter.java b/src/org/openstreetmap/josm/data/osm/Filter.java
index b5fb131..a1c9751 100644
--- a/src/org/openstreetmap/josm/data/osm/Filter.java
+++ b/src/org/openstreetmap/josm/data/osm/Filter.java
@@ -56,7 +56,7 @@ public class Filter extends SearchSetting {
             mode = SearchMode.add;
         } else if ("remove".equals(e.mode)) {
             mode = SearchMode.remove;
-        } else  if ("in_selection".equals(e.mode)) {
+        } else if ("in_selection".equals(e.mode)) {
             mode = SearchMode.in_selection;
         }
         caseSensitive = e.case_sensitive;
diff --git a/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java b/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java
index 8c2e481..a77afe2 100644
--- a/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java
+++ b/src/org/openstreetmap/josm/data/osm/MultipolygonBuilder.java
@@ -18,6 +18,7 @@ import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.ForkJoinTask;
 import java.util.concurrent.RecursiveTask;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Geometry.PolygonIntersection;
 import org.openstreetmap.josm.tools.MultiMap;
@@ -143,6 +144,7 @@ public class MultipolygonBuilder {
             //analyze witch way is inside witch outside.
             return makeFromPolygons(joinedWays);
         } catch (JoinedPolygonCreationException ex) {
+            Main.debug(ex);
             return ex.getMessage();
         }
     }
diff --git a/src/org/openstreetmap/josm/data/osm/Node.java b/src/org/openstreetmap/josm/data/osm/Node.java
index 46c0377..f149615 100644
--- a/src/org/openstreetmap/josm/data/osm/Node.java
+++ b/src/org/openstreetmap/josm/data/osm/Node.java
@@ -276,7 +276,7 @@ public final class Node extends OsmPrimitive implements INode {
     @Override
     public String toString() {
         String coorDesc = isLatLonKnown() ? "lat="+lat+",lon="+lon : "";
-        return "{Node id=" + getUniqueId() + " version=" + getVersion() + ' ' + getFlagsAsString() + ' '  + coorDesc+'}';
+        return "{Node id=" + getUniqueId() + " version=" + getVersion() + ' ' + getFlagsAsString() + ' ' + coorDesc+'}';
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
index 231f5b3..54faab8 100644
--- a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
@@ -633,7 +633,7 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
                 }
             }
             super.setIncomplete(incomplete);
-        }  finally {
+        } finally {
             writeUnlock(locked);
         }
     }
@@ -874,7 +874,7 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
         try {
             return SearchCompiler.compile(Main.pref.get(prefName, defaultValue));
         } catch (ParseError e) {
-            Main.error("Unable to compile pattern for " + prefName + ", trying default pattern: " + e.getMessage());
+            Main.error(e, "Unable to compile pattern for " + prefName + ", trying default pattern:");
         }
 
         try {
@@ -1265,7 +1265,7 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
     }
 
     boolean hasEqualSemanticAttributes(final OsmPrimitive other, final boolean testInterestingTagsOnly) {
-        if (!isNew() &&  id != other.id)
+        if (!isNew() && id != other.id)
             return false;
         if (isIncomplete() ^ other.isIncomplete()) // exclusive or operator for performance (see #7159)
             return false;
@@ -1290,7 +1290,7 @@ public abstract class OsmPrimitive extends AbstractPrimitive implements Comparab
     public boolean hasEqualTechnicalAttributes(OsmPrimitive other) {
         if (other == null) return false;
 
-        return  isDeleted() == other.isDeleted()
+        return isDeleted() == other.isDeleted()
                 && isModified() == other.isModified()
                 && timestamp == other.timestamp
                 && version == other.version
diff --git a/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java b/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
index 9570667..90c3176 100644
--- a/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
+++ b/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
@@ -11,10 +11,11 @@ import java.util.concurrent.LinkedBlockingQueue;
 
 import javax.swing.SwingUtilities;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
 /**
  * This class allows to add DatasetListener to currently active dataset. If active
@@ -25,7 +26,7 @@ import org.openstreetmap.josm.gui.layer.OsmDataLayer;
  * Events in EDT are supported, see {@link #addDatasetListener(DataSetListener, FireMode)}
  *
  */
-public class DatasetEventManager implements MapView.EditLayerChangeListener, Listener {
+public class DatasetEventManager implements ActiveLayerChangeListener, Listener {
 
     private static final DatasetEventManager instance = new DatasetEventManager();
 
@@ -145,7 +146,7 @@ public class DatasetEventManager implements MapView.EditLayerChangeListener, Lis
      * Constructs a new {@code DatasetEventManager}.
      */
     public DatasetEventManager() {
-        MapView.addEditLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     /**
@@ -170,17 +171,17 @@ public class DatasetEventManager implements MapView.EditLayerChangeListener, Lis
     }
 
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (oldLayer != null) {
-            oldLayer.data.removeDataSetListener(myListener);
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        DataSet oldData = e.getPreviousEditDataSet();
+        if (oldData != null) {
+            oldData.removeDataSetListener(myListener);
         }
 
-        if (newLayer != null) {
-            newLayer.data.addDataSetListener(myListener);
-            processDatasetEvent(new DataChangedEvent(newLayer.data));
-        } else {
-            processDatasetEvent(new DataChangedEvent(null));
+        DataSet newData = e.getSource().getEditDataSet();
+        if (newData != null) {
+            newData.addDataSetListener(myListener);
         }
+        processDatasetEvent(new DataChangedEvent(newData));
     }
 
     private static void fireEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) {
diff --git a/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java b/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java
index bf48dc2..6da567a 100644
--- a/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java
+++ b/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java
@@ -17,14 +17,16 @@ import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * A data set holding histories of OSM primitives.
  * @since 1670
+ * @since 10386 (new LayerChangeListener interface)
  */
 public class HistoryDataSet implements LayerChangeListener {
     /** the unique instance */
@@ -38,9 +40,9 @@ public class HistoryDataSet implements LayerChangeListener {
     public static synchronized HistoryDataSet getInstance() {
         if (historyDataSet == null) {
             historyDataSet = new HistoryDataSet();
-            MapView.addLayerChangeListener(historyDataSet);
+            Main.getLayerManager().addLayerChangeListener(historyDataSet);
         }
-        return  historyDataSet;
+        return historyDataSet;
     }
 
     /** the history data */
@@ -200,19 +202,19 @@ public class HistoryDataSet implements LayerChangeListener {
     /* interface LayerChangeListener                                                  */
     /* ------------------------------------------------------------------------------ */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         /* irrelevant in this context */
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         /* irrelevant in this context */
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         if (!Main.isDisplayingMapView()) return;
-        if (Main.map.mapView.getNumLayers() == 0) {
+        if (Main.getLayerManager().getLayers().isEmpty()) {
             data.clear();
             fireCacheCleared();
         }
diff --git a/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java
index c53ebea..a344c7b 100644
--- a/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java
+++ b/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java
@@ -88,7 +88,7 @@ public abstract class HistoryOsmPrimitive implements Comparable<HistoryOsmPrimit
         this.version = version;
         this.visible = visible;
         this.user = user;
-        this.changesetId  = changesetId;
+        this.changesetId = changesetId;
         this.timestamp = timestamp;
         tags = new HashMap<>();
     }
diff --git a/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java b/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java
index e637a7f..61e0fd1 100644
--- a/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java
+++ b/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java
@@ -110,7 +110,7 @@ public class HistoryRelation extends HistoryOsmPrimitive {
      * @return the idx-th member
      * @throws IndexOutOfBoundsException if idx is out of bounds
      */
-    public RelationMemberData getRelationMember(int idx) throws IndexOutOfBoundsException  {
+    public RelationMemberData getRelationMember(int idx) throws IndexOutOfBoundsException {
         if (idx < 0 || idx >= members.size())
             throw new IndexOutOfBoundsException(
                     MessageFormat.format("Parameter {0} not in range 0..{1}. Got ''{2}''.", "idx", members.size(), idx));
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
index 8cae889..06a919c 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
@@ -144,9 +144,7 @@ public abstract class AbstractMapRenderer implements Rendering {
             // avoid the WaySegment class and add another data class with { Way way; Node firstNode, secondNode; int firstIdx; }.
             // On read, it would first check, if the way still has firstIdx+2 nodes, then check if the corresponding way nodes are still
             // the same and report changes in a more controlled manner.
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
+            Main.trace(e);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java
index f804ab5..2103435 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java
@@ -65,7 +65,7 @@ public final class MapRendererFactory {
 
         public Descriptor(Class<? extends AbstractMapRenderer> renderer, String displayName, String description) {
             this.renderer = renderer;
-            this.displayName  = displayName;
+            this.displayName = displayName;
             this.description = description;
         }
 
@@ -100,7 +100,7 @@ public final class MapRendererFactory {
             try {
                 return Class.forName(className, true, cl);
             } catch (final NoClassDefFoundError | ClassNotFoundException e) {
-                Main.trace(e.getMessage());
+                Main.trace(e);
             }
         }
         Main.error(tr("Failed to load map renderer class ''{0}''. The class wasn''t found.", className));
@@ -265,14 +265,14 @@ public final class MapRendererFactory {
      * @throws MapRendererFactoryException if creating an instance fails
      * @see AbstractMapRenderer#AbstractMapRenderer(Graphics2D, NavigatableComponent, boolean)
      */
-    public AbstractMapRenderer createActiveRenderer(Graphics2D g, NavigatableComponent viewport, boolean isInactiveMode)
-            throws MapRendererFactoryException {
+    public AbstractMapRenderer createActiveRenderer(Graphics2D g, NavigatableComponent viewport, boolean isInactiveMode) {
         try {
             Constructor<?> c = activeRenderer.getConstructor(new Class<?>[]{Graphics2D.class, NavigatableComponent.class, boolean.class});
             return AbstractMapRenderer.class.cast(c.newInstance(g, viewport, isInactiveMode));
         } catch (NoSuchMethodException | IllegalArgumentException | InstantiationException | IllegalAccessException e) {
             throw new MapRendererFactoryException(e);
         } catch (InvocationTargetException e) {
+            Main.debug(e);
             throw new MapRendererFactoryException(e.getCause());
         }
     }
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/PaintColors.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/PaintColors.java
index 293fc96..fb9f625 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/PaintColors.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/PaintColors.java
@@ -20,7 +20,7 @@ public enum PaintColors implements ColorKey {
     NODE(marktr("Node: standard"), Color.yellow),
     CONNECTION(marktr("Node: connection"), Color.yellow),
     TAGGED(marktr("Node: tagged"), new Color(204, 255, 255)), // light cyan
-    DEFAULT_WAY(marktr("way"),  new Color(0, 0, 128)), // dark blue
+    DEFAULT_WAY(marktr("way"), new Color(0, 0, 128)), // dark blue
     RELATION(marktr("relation"), new Color(0, 128, 128)), // teal
     UNTAGGED_WAY(marktr("untagged way"), new Color(0, 128, 0)), // dark green
     BACKGROUND(marktr("background"), Color.BLACK),
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 b3f96a5..bf5ddcf 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
@@ -294,7 +294,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
      * method which apparently no longer gives a useful result for Java 7.
      */
     public static boolean isGlyphVectorDoubleTranslationBug(Font font) {
-        Boolean cached  = IS_GLYPH_VECTOR_DOUBLE_TRANSLATION_BUG.get(font);
+        Boolean cached = IS_GLYPH_VECTOR_DOUBLE_TRANSLATION_BUG.get(font);
         if (cached != null)
             return cached;
         String overridePref = Main.pref.get("glyph-bug", "auto");
@@ -574,7 +574,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
             // quick check to see if label box is smaller than primitive box
             if (pb.width >= nb.getWidth() && pb.height >= nb.getHeight()) {
 
-                final double w = pb.width  - nb.getWidth();
+                final double w = pb.width - nb.getWidth();
                 final double h = pb.height - nb.getHeight();
 
                 final int x2 = pb.x + (int) (w/2.0);
@@ -589,10 +589,12 @@ public class StyledMapRenderer extends AbstractMapRenderer {
                 boolean labelOK = area.contains(centeredNBounds);
                 if (!labelOK) {
                     // if center position (C) is not inside osm shape, try naively some other positions as follows:
+                    // CHECKSTYLE.OFF: SingleSpaceSeparator
                     final int x1 = pb.x + (int)   (w/4.0);
                     final int x3 = pb.x + (int) (3*w/4.0);
                     final int y1 = pb.y + (int)   (h/4.0);
                     final int y3 = pb.y + (int) (3*h/4.0);
+                    // CHECKSTYLE.ON: SingleSpaceSeparator
                     // +-----------+
                     // |  5  1  6  |
                     // |  4  C  2  |
@@ -1480,7 +1482,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
                     if (showHeadArrowOnly ? !it.hasNext() : showOrientation) {
                         final double segmentLength = p1.distance(p2);
                         if (segmentLength != 0) {
-                            final double l =  (10. + line.getLineWidth()) / segmentLength;
+                            final double l = (10. + line.getLineWidth()) / segmentLength;
 
                             final double sx = l * (p1.x - p2.x);
                             final double sy = l * (p1.y - p2.y);
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 66b894c..4414c36 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
@@ -426,7 +426,7 @@ public class WireframeMapRenderer extends AbstractMapRenderer implements Visitor
             path.lineTo(p2.x, p2.y);
 
             if (showDirection) {
-                final double l =  10. / p1.distance(p2);
+                final double l = 10. / p1.distance(p2);
 
                 final double sx = l * (p1.x - p2.x);
                 final double sy = l * (p1.y - p2.y);
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
index 984a874..d387a34 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
@@ -645,7 +645,7 @@ public class Multipolygon {
         return result;
     }
 
-    private void addInnerToOuters(List<PolyData> innerPolygons, List<PolyData> outerPolygons)  {
+    private void addInnerToOuters(List<PolyData> innerPolygons, List<PolyData> outerPolygons) {
         if (innerPolygons.isEmpty()) {
             combinedPolygons.addAll(outerPolygons);
         } else if (outerPolygons.size() == 1) {
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
index d76fc02..16650ca 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
@@ -27,10 +27,11 @@ import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -50,7 +51,7 @@ public final class MultipolygonCache implements DataSetListener, LayerChangeList
         this.selectedPolyData = new ArrayList<>();
         Main.addProjectionChangeListener(this);
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     /**
@@ -285,19 +286,19 @@ public final class MultipolygonCache implements DataSetListener, LayerChangeList
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof OsmDataLayer) {
-            clear(((OsmDataLayer) oldLayer).data);
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof OsmDataLayer) {
+            clear(((OsmDataLayer) e.getRemovedLayer()).data);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java b/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java
index 66726c8..66f6230 100644
--- a/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java
+++ b/src/org/openstreetmap/josm/data/preferences/ParametrizedEnumProperty.java
@@ -27,6 +27,7 @@ public abstract class ParametrizedEnumProperty<T extends Enum<T>> {
         try {
             return Enum.valueOf(enumClass, s);
         } catch (IllegalArgumentException e) {
+            Main.trace(e);
             return defaultValue;
         }
     }
diff --git a/src/org/openstreetmap/josm/data/projection/CustomProjection.java b/src/org/openstreetmap/josm/data/projection/CustomProjection.java
index 6f02a1f..8ffbe0b 100644
--- a/src/org/openstreetmap/josm/data/projection/CustomProjection.java
+++ b/src/org/openstreetmap/josm/data/projection/CustomProjection.java
@@ -204,6 +204,7 @@ public class CustomProjection extends AbstractProjection {
         try {
             update(pref);
         } catch (ProjectionConfigurationException ex) {
+            Main.trace(ex);
             try {
                 update(null);
             } catch (ProjectionConfigurationException ex1) {
@@ -315,7 +316,7 @@ public class CustomProjection extends AbstractProjection {
             }
             s = parameters.get(Param.axis.key);
             if (s != null) {
-                this.axis  = s;
+                this.axis = s;
             }
         }
     }
@@ -525,7 +526,7 @@ public class CustomProjection extends AbstractProjection {
         if ("utm".equals(id)) {
             id = "tmerc";
         }
-        Proj proj =  Projections.getBaseProjection(id);
+        Proj proj = Projections.getBaseProjection(id);
         if (proj == null) throw new ProjectionConfigurationException(tr("Unknown projection identifier: ''{0}''", id));
 
         ProjParameters projParams = new ProjParameters();
diff --git a/src/org/openstreetmap/josm/data/projection/Projection.java b/src/org/openstreetmap/josm/data/projection/Projection.java
index 4f1fc48..b2bd016 100644
--- a/src/org/openstreetmap/josm/data/projection/Projection.java
+++ b/src/org/openstreetmap/josm/data/projection/Projection.java
@@ -16,7 +16,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 public interface Projection {
     /**
      * The default scale factor in east/north units per pixel
-     * ({@link org.openstreetmap.josm.gui.NavigatableComponent#scale})).
+     * ({@link org.openstreetmap.josm.gui.NavigatableComponent#getState})).
      * FIXME: misnomer
      * @return the scale factor
      */
@@ -42,6 +42,7 @@ public interface Projection {
      * Describe the projection in one or two words.
      * @return the name / description
      */
+    @Override
     String toString();
 
     /**
diff --git a/src/org/openstreetmap/josm/data/projection/Projections.java b/src/org/openstreetmap/josm/data/projection/Projections.java
index 23af5ed..d97b7b0 100644
--- a/src/org/openstreetmap/josm/data/projection/Projections.java
+++ b/src/org/openstreetmap/josm/data/projection/Projections.java
@@ -323,8 +323,7 @@ public final class Projections {
             try {
                 proj = pc.getProjection();
             } catch (RuntimeException e) {
-                String cause = e.getMessage();
-                Main.warn("Unable to get projection "+code+" with "+pc + (cause != null ? ". "+cause : ""));
+                Main.warn(e, "Unable to get projection "+code+" with "+pc+':');
             }
         }
         if (proj == null) {
diff --git a/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java b/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
index 8ebba53..0c0e5e2 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
@@ -91,6 +91,7 @@ public abstract class AbstractProj implements Proj {
         spherical = params.ellps.spherical;
         //  Compute constants for the mlfn
         double t;
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         en0 = C00 - e2  *  (C02 + e2  *
              (C04 + e2  *  (C06 + e2  * C08)));
         en1 =       e2  *  (C22 - e2  *
@@ -99,6 +100,7 @@ public abstract class AbstractProj implements Proj {
              (C44 - e2  *  (C46 + e2  * C48));
         en3 = (t *= e2) *  (C66 - e2  * C68);
         en4 =   t * e2  *  C88;
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 
     @Override
@@ -157,7 +159,7 @@ public abstract class AbstractProj implements Proj {
         final double eccnth = 0.5 * e;
         double phi = (Math.PI/2) - 2.0 * Math.atan(ts);
         for (int i = 0; i < MAXIMUM_ITERATIONS; i++) {
-            final double con  = e * Math.sin(phi);
+            final double con = e * Math.sin(phi);
             final double dphi = (Math.PI/2) - 2.0*Math.atan(ts * Math.pow((1-con)/(1+con), eccnth)) - phi;
             phi += dphi;
             if (Math.abs(dphi) <= ITERATION_TOLERANCE) {
diff --git a/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java b/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
index 0a32fcc..d7baa4c 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
@@ -97,15 +97,15 @@ public class AlbersEqualArea extends AbstractProj {
         if (Math.abs(phi1 + phi2) < EPSILON) {
             throw new ProjectionConfigurationException(tr("standard parallels are opposite"));
         }
-        double  sinphi = Math.sin(phi1);
-        double  cosphi = Math.cos(phi1);
-        double  n      = sinphi;
+        double sinphi = Math.sin(phi1);
+        double cosphi = Math.cos(phi1);
+        double n = sinphi;
         boolean secant = Math.abs(phi1 - phi2) >= EPSILON;
         double m1 = msfn(sinphi, cosphi);
         double q1 = qsfn(sinphi);
         if (secant) { // secant cone
-            sinphi    = Math.sin(phi2);
-            cosphi    = Math.cos(phi2);
+            sinphi = Math.sin(phi2);
+            cosphi = Math.cos(phi2);
             double m2 = msfn(sinphi, cosphi);
             double q2 = qsfn(sinphi);
             n = (m1 * m1 - m2 * m2) / (q2 - q1);
@@ -129,8 +129,10 @@ public class AlbersEqualArea extends AbstractProj {
             }
         }
         rho = Math.sqrt(rho) / n;
-        y   = rho0 - rho * Math.cos(x);
-        x   =        rho * Math.sin(x);
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        y = rho0 - rho * Math.cos(x);
+        x =        rho * Math.sin(x);
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         return new double[] {x, y};
     }
 
@@ -141,8 +143,8 @@ public class AlbersEqualArea extends AbstractProj {
         if (rho > EPSILON) {
             if (n < 0.0) {
                 rho = -rho;
-                x   = -x;
-                y   = -y;
+                x = -x;
+                y = -y;
             }
             x = Math.atan2(x, y) / n;
             y = rho * n;
@@ -174,9 +176,9 @@ public class AlbersEqualArea extends AbstractProj {
         for (int i = 0; i < MAXIMUM_ITERATIONS; i++) {
             final double sinpi = Math.sin(phi);
             final double cospi = Math.cos(phi);
-            final double con   = e * sinpi;
-            final double com   = 1.0 - con*con;
-            final double dphi  = 0.5 * com*com / cospi *
+            final double con = e * sinpi;
+            final double com = 1.0 - con*con;
+            final double dphi = 0.5 * com*com / cospi *
                     (qs/toneEs - sinpi / com + 0.5/e * Math.log((1. - con) / (1. + con)));
             phi += dphi;
             if (Math.abs(dphi) <= ITERATION_TOLERANCE) {
diff --git a/src/org/openstreetmap/josm/data/projection/proj/LambertAzimuthalEqualArea.java b/src/org/openstreetmap/josm/data/projection/proj/LambertAzimuthalEqualArea.java
index a519525..602416a 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/LambertAzimuthalEqualArea.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/LambertAzimuthalEqualArea.java
@@ -99,34 +99,29 @@ public class LambertAzimuthalEqualArea extends AbstractProj {
         aPA2 = P20 * es3;
 
         final double sinphi;
-        qp     = qsfn(1);
-        rq     = Math.sqrt(0.5 * qp);
+        qp = qsfn(1);
+        rq = Math.sqrt(0.5 * qp);
         sinphi = Math.sin(latitudeOfOrigin);
         sinb1 = qsfn(sinphi) / qp;
         cosb1 = Math.sqrt(1.0 - sinb1 * sinb1);
         switch (mode) {
             case NORTH_POLE:  // Fall through
-            case SOUTH_POLE: {
-                dd  = 1.0;
+            case SOUTH_POLE:
+                dd = 1.0;
                 xmf = ymf = rq;
                 break;
-            }
-            case EQUATORIAL: {
-                dd  = 1.0 / rq;
+            case EQUATORIAL:
+                dd = 1.0 / rq;
                 xmf = 1.0;
                 ymf = 0.5 * qp;
                 break;
-            }
-            case OBLIQUE: {
-                dd  = Math.cos(latitudeOfOrigin) /
-                        (Math.sqrt(1.0 - e2 * sinphi * sinphi) * rq * cosb1);
+            case OBLIQUE:
+                dd = Math.cos(latitudeOfOrigin) / (Math.sqrt(1.0 - e2 * sinphi * sinphi) * rq * cosb1);
                 xmf = rq * dd;
                 ymf = rq / dd;
                 break;
-            }
-            default: {
+            default:
                 throw new AssertionError(mode);
-            }
         }
     }
 
@@ -138,25 +133,23 @@ public class LambertAzimuthalEqualArea extends AbstractProj {
         double q = qsfn(sinphi);
         final double sinb, cosb, b, c, x, y;
         switch (mode) {
-            case OBLIQUE: {
+            case OBLIQUE:
                 sinb = q / qp;
                 cosb = Math.sqrt(1.0 - sinb * sinb);
-                c    = 1.0 + sinb1 * sinb + cosb1 * cosb * coslam;
-                b    = Math.sqrt(2.0 / c);
-                y    = ymf * b * (cosb1 * sinb - sinb1 * cosb * coslam);
-                x    = xmf * b * cosb * sinlam;
+                c = 1.0 + sinb1 * sinb + cosb1 * cosb * coslam;
+                b = Math.sqrt(2.0 / c);
+                y = ymf * b * (cosb1 * sinb - sinb1 * cosb * coslam);
+                x = xmf * b * cosb * sinlam;
                 break;
-            }
-            case EQUATORIAL: {
+            case EQUATORIAL:
                 sinb = q / qp;
                 cosb = Math.sqrt(1.0 - sinb * sinb);
-                c    = 1.0 + cosb * coslam;
-                b    = Math.sqrt(2.0 / c);
-                y    = ymf * b * sinb;
-                x    = xmf * b * cosb * sinlam;
+                c = 1.0 + cosb * coslam;
+                b = Math.sqrt(2.0 / c);
+                y = ymf * b * sinb;
+                x = xmf * b * cosb * sinlam;
                 break;
-            }
-            case NORTH_POLE: {
+            case NORTH_POLE:
                 c = (Math.PI / 2) + phi;
                 q = qp - q;
                 if (q >= 0.0) {
@@ -167,8 +160,7 @@ public class LambertAzimuthalEqualArea extends AbstractProj {
                     x = y = 0.;
                 }
                 break;
-            }
-            case SOUTH_POLE: {
+            case SOUTH_POLE:
                 c = phi - (Math.PI / 2);
                 q = qp + q;
                 if (q >= 0.0) {
@@ -179,10 +171,8 @@ public class LambertAzimuthalEqualArea extends AbstractProj {
                     x = y = 0.;
                 }
                 break;
-            }
-            default: {
+            default:
                 throw new AssertionError(mode);
-            }
         }
         if (Math.abs(c) < EPSILON_LATITUDE) {
             return new double[] {0, 0}; // this is an error, we should handle it somehow
@@ -210,10 +200,10 @@ public class LambertAzimuthalEqualArea extends AbstractProj {
                     x *= sCe;
                     if (mode == Mode.OBLIQUE) {
                         ab = cCe * sinb1 + y * sCe * cosb1 / rho;
-                        y  = rho * cosb1 * cCe - y * sinb1 * sCe;
+                        y = rho * cosb1 * cCe - y * sinb1 * sCe;
                     } else {
                         ab = y * sCe / rho;
-                        y  = rho * cCe;
+                        y = rho * cCe;
                     }
                     lambda = Math.atan2(x, y);
                     phi = authlat(Math.asin(ab));
diff --git a/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java b/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java
index 5bb34c4..acf1087 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/LambertConformalConic.java
@@ -104,8 +104,8 @@ public class LambertConformalConic extends AbstractProj {
         final double t2 = t(toRadians(lat2));
         final double tf = t(toRadians(lat0));
 
-        n  = (log(m1) - log(m2)) / (log(t1) - log(t2));
-        f  = m1 / (n * pow(t1, n));
+        n = (log(m1) - log(m2)) / (log(t1) - log(t2));
+        f = m1 / (n * pow(t1, n));
         r0 = f * pow(tf, n);
     }
 
@@ -122,7 +122,7 @@ public class LambertConformalConic extends AbstractProj {
         final double t0 = t(lat0rad);
 
         n = sin(lat0rad);
-        f  = m0 / (n * pow(t0, n));
+        f = m0 / (n * pow(t0, n));
         r0 = f * pow(t0, n);
     }
 
diff --git a/src/org/openstreetmap/josm/data/projection/proj/Mercator.java b/src/org/openstreetmap/josm/data/projection/proj/Mercator.java
index 2b60737..10d61ca 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/Mercator.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/Mercator.java
@@ -71,7 +71,7 @@ public class Mercator extends AbstractProj implements IScaleFactorProvider {
             double standardParallel = Math.toRadians(params.lat_ts);
             if (spherical) {
                 scaleFactor *= Math.cos(standardParallel);
-            }  else {
+            } else {
                 scaleFactor *= msfn(Math.sin(standardParallel), Math.cos(standardParallel));
             }
         }
diff --git a/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java b/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java
index 27dc117..3d66cf8 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/ObliqueMercator.java
@@ -313,11 +313,13 @@ public class ObliqueMercator extends AbstractProj implements ICentralMeridianPro
 
             lonCenter = Math.toRadians(params.lonc);
             azimuth = Math.toRadians(params.alpha);
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             if ((azimuth > -1.5*Math.PI && azimuth < -0.5*Math.PI) ||
                 (azimuth >  0.5*Math.PI && azimuth <  1.5*Math.PI)) {
                 throw new ProjectionConfigurationException(
                         tr("Illegal value for parameter ''{0}'': {1}", "alpha", Double.toString(params.alpha)));
             }
+            // CHECKSTYLE.ON: SingleSpaceSeparator
             if (params.gamma != null) {
                 rectifiedGridAngle = Math.toRadians(params.gamma);
             } else {
@@ -340,13 +342,13 @@ public class ObliqueMercator extends AbstractProj implements ICentralMeridianPro
          */
         singamma0 = Math.sin(gamma0);
         cosgamma0 = Math.cos(gamma0);
-        sinrot    = Math.sin(rectifiedGridAngle);
-        cosrot    = Math.cos(rectifiedGridAngle);
-        arb       = a / b;
-        ab        = a * b;
-        bra       = b / a;
-        vPoleN  = arb * Math.log(Math.tan(0.5 * (Math.PI/2.0 - gamma0)));
-        vPoleS  = arb * Math.log(Math.tan(0.5 * (Math.PI/2.0 + gamma0)));
+        sinrot = Math.sin(rectifiedGridAngle);
+        cosrot = Math.cos(rectifiedGridAngle);
+        arb = a / b;
+        ab = a * b;
+        bra = b / a;
+        vPoleN = arb * Math.log(Math.tan(0.5 * (Math.PI/2.0 - gamma0)));
+        vPoleS = arb * Math.log(Math.tan(0.5 * (Math.PI/2.0 + gamma0)));
         boolean hotine = params.no_off != null && params.no_off;
         if (hotine) {
             uc = 0.0;
diff --git a/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java b/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
index af224ff..ab05a40 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
@@ -134,7 +134,7 @@ public class PolarStereographic extends AbstractProj {
             y = rho * coslon;
         } else {
             final double rho = k0 * tsfn(y, sinlat);
-            x =  rho * sinlon;
+            x = rho * sinlon;
             y = -rho * coslon;
         }
         return new double[] {x, y};
diff --git a/src/org/openstreetmap/josm/data/validation/OsmValidator.java b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
index 192742d..9fdf307 100644
--- a/src/org/openstreetmap/josm/data/validation/OsmValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
@@ -59,11 +59,6 @@ import org.openstreetmap.josm.data.validation.tests.UntaggedNode;
 import org.openstreetmap.josm.data.validation.tests.UntaggedWay;
 import org.openstreetmap.josm.data.validation.tests.WayConnectedToArea;
 import org.openstreetmap.josm.data.validation.tests.WronglyOrderedWays;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.ValidatorLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
@@ -74,7 +69,7 @@ import org.openstreetmap.josm.tools.Utils;
  *
  * @author Francisco R. Santos <frsantos at gmail.com>
  */
-public class OsmValidator implements LayerChangeListener {
+public class OsmValidator {
 
     public static volatile ValidatorLayer errorLayer;
 
@@ -221,7 +216,7 @@ public class OsmValidator implements LayerChangeListener {
             return;
         if (errorLayer == null) {
             errorLayer = new ValidatorLayer();
-            Main.main.addLayer(errorLayer);
+            Main.getLayerManager().addLayer(errorLayer);
         }
     }
 
@@ -345,29 +340,4 @@ public class OsmValidator implements LayerChangeListener {
         }
     }
 
-    /* -------------------------------------------------------------------------- */
-    /* interface LayerChangeListener                                              */
-    /* -------------------------------------------------------------------------- */
-    @Override
-    public void layerAdded(LayerAddEvent e) {
-        // do nothing
-    }
-
-    @Override
-    public void layerOrderChanged(LayerOrderChangeEvent e) {
-        // do nothing
-    }
-
-    @Override
-    public void layerRemoving(LayerRemoveEvent e) {
-        if (e.getRemovedLayer() == errorLayer) {
-            errorLayer = null;
-            return;
-        }
-        if (e.getSource().getLayersOfType(OsmDataLayer.class).isEmpty()) {
-            if (errorLayer != null) {
-                Main.main.removeLayer(errorLayer);
-            }
-        }
-    }
 }
diff --git a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
index cb87393..18181ae 100644
--- a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
+++ b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
@@ -151,7 +151,7 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
             int[] y = new int[] {(int) (p1.y - sinT), (int) (p2.y - sinT),
                                  (int) (p2.y + sinT), (int) (p1.y + sinT)};
             g.fillPolygon(x, y, 4);
-            g.fillArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
+            g.fillArc(p1.x - 5, p1.y - 5, 10, 10, deg, 180);
             g.fillArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
         }
         g.setColor(color);
@@ -159,7 +159,7 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
                 (int) (p2.x + cosT), (int) (p2.y - sinT));
         g.drawLine((int) (p1.x - cosT), (int) (p1.y + sinT),
                 (int) (p2.x - cosT), (int) (p2.y + sinT));
-        g.drawArc(p1.x - 5, p1.y - 5, 10, 10, deg,  180);
+        g.drawArc(p1.x - 5, p1.y - 5, 10, 10, deg, 180);
         g.drawArc(p2.x - 5, p2.y - 5, 10, 10, deg, -180);
     }
 
diff --git a/src/org/openstreetmap/josm/data/validation/Severity.java b/src/org/openstreetmap/josm/data/validation/Severity.java
index a5c2e42..70ac073 100644
--- a/src/org/openstreetmap/josm/data/validation/Severity.java
+++ b/src/org/openstreetmap/josm/data/validation/Severity.java
@@ -10,12 +10,14 @@ import org.openstreetmap.josm.Main;
 
 /** The error severity */
 public enum Severity {
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     /** Error messages */
     ERROR(tr("Errors"), /* ICON(data/) */"error",       Main.pref.getColor(marktr("validation error"), Color.RED)),
     /** Warning messages */
     WARNING(tr("Warnings"), /* ICON(data/) */"warning", Main.pref.getColor(marktr("validation warning"), Color.YELLOW)),
     /** Other messages */
     OTHER(tr("Other"), /* ICON(data/) */"other",        Main.pref.getColor(marktr("validation other"), Color.CYAN));
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     /** Description of the severity code */
     private final String message;
diff --git a/src/org/openstreetmap/josm/data/validation/Test.java b/src/org/openstreetmap/josm/data/validation/Test.java
index 3260026..75524f8 100644
--- a/src/org/openstreetmap/josm/data/validation/Test.java
+++ b/src/org/openstreetmap/josm/data/validation/Test.java
@@ -332,7 +332,7 @@ public class Test extends AbstractVisitor {
             }
         }
         if (!primitivesToDelete.isEmpty()) {
-            return DeleteCommand.delete(Main.main.getEditLayer(), primitivesToDelete);
+            return DeleteCommand.delete(Main.getLayerManager().getEditLayer(), primitivesToDelete);
         } else {
             return null;
         }
diff --git a/src/org/openstreetmap/josm/data/validation/TestError.java b/src/org/openstreetmap/josm/data/validation/TestError.java
index f9b2ea4..4f74340 100644
--- a/src/org/openstreetmap/josm/data/validation/TestError.java
+++ b/src/org/openstreetmap/josm/data/validation/TestError.java
@@ -360,7 +360,7 @@ public class TestError implements Comparable<TestError>, DataSetListener {
             if (event.getPrimitives().containsAll(primitives)) {
                 primitives = Collections.emptyList();
             } else {
-                Main.warn("Unable to remove primitives from "+this);
+                Main.warn(e, "Unable to remove primitives from "+this+'.');
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java b/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
index b92de25..181b60b 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
@@ -20,6 +20,8 @@ import java.net.IDN;
 import java.util.Arrays;
 import java.util.Locale;
 
+import org.openstreetmap.josm.Main;
+
 /**
  * <p><b>Domain name</b> validation routines.</p>
  *
@@ -57,7 +59,7 @@ import java.util.Locale;
  * {@link java.net.InetAddress} for that functionality.)
  * </p>
  *
- * @version $Revision: 1725571 $
+ * @version $Revision: 1740822 $
  * @since Validator 1.4
  */
 public final class DomainValidator extends AbstractValidator {
@@ -289,12 +291,13 @@ public final class DomainValidator extends AbstractValidator {
 
     // WARNING: this array MUST be sorted, otherwise it cannot be searched reliably using binary search
     private static final String[] GENERIC_TLDS = new String[] {
-        // Taken from Version 2016060300, Last Updated Fri Jun  3 07:07:01 2016 UTC
+        // Taken from Version 2016071000, Last Updated Sun Jul 10 07:07:02 2016 UTC
         "aaa", // aaa American Automobile Association, Inc.
         "aarp", // aarp AARP
         "abb", // abb ABB Ltd
         "abbott", // abbott Abbott Laboratories, Inc.
         "abbvie", // abbvie AbbVie Inc.
+        "able", // able Able Inc.
         "abogado", // abogado Top Level Domain Holdings Limited
         "abudhabi", // abudhabi Abu Dhabi Systems and Information Centre
         "academy", // academy Half Oaks, LLC
@@ -314,6 +317,7 @@ public final class DomainValidator extends AbstractValidator {
         "agakhan", // agakhan Fondation Aga Khan (Aga Khan Foundation)
         "agency", // agency Steel Falls, LLC
         "aig", // aig American International Group, Inc.
+        "airbus", // airbus Airbus S.A.S.
         "airforce", // airforce United TLD Holdco Ltd.
         "airtel", // airtel Bharti Airtel Limited
         "akdn", // akdn Fondation Aga Khan (Aga Khan Foundation)
@@ -322,11 +326,13 @@ public final class DomainValidator extends AbstractValidator {
         "allfinanz", // allfinanz Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
         "ally", // ally Ally Financial Inc.
         "alsace", // alsace REGION D ALSACE
+        "alstom", // alstom ALSTOM
         "amica", // amica Amica Mutual Insurance Company
         "amsterdam", // amsterdam Gemeente Amsterdam
         "analytics", // analytics Campus IP LLC
         "android", // android Charleston Road Registry Inc.
         "anquan", // anquan QIHOO 360 TECHNOLOGY CO. LTD.
+        "anz", // anz Australia and New Zealand Banking Group Limited
         "apartments", // apartments June Maple, LLC
         "app", // app Charleston Road Registry Inc.
         "apple", // apple Apple Inc.
@@ -334,12 +340,14 @@ public final class DomainValidator extends AbstractValidator {
         "aramco", // aramco Aramco Services Company
         "archi", // archi STARTING DOT LIMITED
         "army", // army United TLD Holdco Ltd.
+        "art", // art UK Creative Ideas Limited
         "arte", // arte Association Relative à la Télévision Européenne G.E.I.E.
         "asia", // asia DotAsia Organisation Ltd.
         "associates", // associates Baxter Hill, LLC
         "attorney", // attorney United TLD Holdco, Ltd
         "auction", // auction United TLD HoldCo, Ltd.
         "audi", // audi AUDI Aktiengesellschaft
+        "audible", // audible Amazon Registry Service, Inc.
         "audio", // audio Uniregistry, Corp.
         "author", // author Amazon Registry Services, Inc.
         "auto", // auto Uniregistry, Corp.
@@ -380,6 +388,7 @@ public final class DomainValidator extends AbstractValidator {
         "biz", // biz Neustar, Inc.
         "black", // black Afilias Limited
         "blackfriday", // blackfriday Uniregistry, Corp.
+        "blanco", // blanco BLANCO GmbH + Co KG
         "blog", // blog Knock Knock WHOIS There, LLC
         "bloomberg", // bloomberg Bloomberg IP Holdings LLC
         "blue", // blue Afilias Limited
@@ -416,6 +425,7 @@ public final class DomainValidator extends AbstractValidator {
         "cafe", // cafe Pioneer Canyon, LLC
         "cal", // cal Charleston Road Registry Inc.
         "call", // call Amazon Registry Services, Inc.
+        "cam", // cam AC Webconnecting Holding B.V.
         "camera", // camera Atomic Maple, LLC
         "camp", // camp Delta Dynamite, LLC
         "cancerresearch", // cancerresearch Australian Cancer Research Foundation
@@ -437,6 +447,7 @@ public final class DomainValidator extends AbstractValidator {
         "catering", // catering New Falls. LLC
         "cba", // cba COMMONWEALTH BANK OF AUSTRALIA
         "cbn", // cbn The Christian Broadcasting Network, Inc.
+        "cbre", // cbre CBRE, Inc.
         "ceb", // ceb The Corporate Executive Board Company
         "center", // center Tin Mill, LLC
         "ceo", // ceo CEOTLD Pty Ltd
@@ -448,6 +459,7 @@ public final class DomainValidator extends AbstractValidator {
         "chase", // chase JPMorgan Chase & Co.
         "chat", // chat Sand Fields, LLC
         "cheap", // cheap Sand Cover, LLC
+        "chintai", // chintai CHINTAI Corporation
         "chloe", // chloe Richemont DNS Inc.
         "christmas", // christmas Uniregistry, Corp.
         "chrome", // chrome Charleston Road Registry Inc.
@@ -473,6 +485,7 @@ public final class DomainValidator extends AbstractValidator {
         "college", // college XYZ.COM LLC
         "cologne", // cologne NetCologne Gesellschaft für Telekommunikation mbH
         "com", // com VeriSign Global Registry Services
+        "comcast", // comcast Comcast IP Holdings I, LLC
         "commbank", // commbank COMMONWEALTH BANK OF AUSTRALIA
         "community", // community Fox Orchard, LLC
         "company", // company Silver Avenue, LLC
@@ -485,6 +498,7 @@ public final class DomainValidator extends AbstractValidator {
         "contact", // contact Top Level Spectrum, Inc.
         "contractors", // contractors Magic Woods, LLC
         "cooking", // cooking Top Level Domain Holdings Limited
+        "cookingchannel", // cookingchannel Lifestyle Domain Holdings, Inc.
         "cool", // cool Koko Lake, LLC
         "coop", // coop DotCooperation LLC
         "corsica", // corsica Collectivité Territoriale de Corse
@@ -512,6 +526,7 @@ public final class DomainValidator extends AbstractValidator {
         "day", // day Charleston Road Registry Inc.
         "dclk", // dclk Charleston Road Registry Inc.
         "dds", // dds Minds + Machines Group Limited
+        "deal", // deal Amazon Registry Service, Inc.
         "dealer", // dealer Dealer Dot Com, Inc.
         "deals", // deals Sand Sunset, LLC
         "degree", // degree United TLD Holdco, Ltd
@@ -542,6 +557,8 @@ public final class DomainValidator extends AbstractValidator {
         "drive", // drive Charleston Road Registry Inc.
         "dtv", // dtv Dish DBS Corporation
         "dubai", // dubai Dubai Smart Government Department
+        "dunlop", // dunlop The Goodyear Tire & Rubber Company
+        "dupont", // dupont E. I. du Pont de Nemours and Company
         "durban", // durban ZA Central Registry NPC trading as ZA Central Registry
         "dvag", // dvag Deutsche Vermögensberatung Aktiengesellschaft DVAG
         "earth", // earth Interlink Co., Ltd.
@@ -555,8 +572,10 @@ public final class DomainValidator extends AbstractValidator {
         "engineer", // engineer United TLD Holdco Ltd.
         "engineering", // engineering Romeo Canyon
         "enterprises", // enterprises Snow Oaks, LLC
+        "epost", // epost Deutsche Post AG
         "epson", // epson Seiko Epson Corporation
         "equipment", // equipment Corn Station, LLC
+        "ericsson", // ericsson Telefonaktiebolaget L M Ericsson
         "erni", // erni ERNI Group Holding AG
         "esq", // esq Charleston Road Registry Inc.
         "estate", // estate Trixy Park, LLC
@@ -577,14 +596,17 @@ public final class DomainValidator extends AbstractValidator {
         "fan", // fan Asiamix Digital Ltd
         "fans", // fans Asiamix Digital Limited
         "farm", // farm Just Maple, LLC
+        "farmers", // farmers Farmers Insurance Exchange
         "fashion", // fashion Top Level Domain Holdings Limited
         "fast", // fast Amazon Registry Services, Inc.
+        "fedex", // fedex Federal Express Corporation
         "feedback", // feedback Top Level Spectrum, Inc.
         "ferrero", // ferrero Ferrero Trading Lux S.A.
         "film", // film Motion Picture Domain Registry Pty Ltd
         "final", // final Núcleo de Informação e Coordenação do Ponto BR - NIC.br
         "finance", // finance Cotton Cypress, LLC
         "financial", // financial Just Cover, LLC
+        "fire", // fire Amazon Registry Service, Inc.
         "firestone", // firestone Bridgestone Corporation
         "firmdale", // firmdale Firmdale Holdings Limited
         "fish", // fish Fox Woods, LLC
@@ -599,6 +621,7 @@ public final class DomainValidator extends AbstractValidator {
         "flsmidth", // flsmidth FLSmidth A/S
         "fly", // fly Charleston Road Registry Inc.
         "foo", // foo Charleston Road Registry Inc.
+        "foodnetwork", // foodnetwork Lifestyle Domain Holdings, Inc.
         "football", // football Foggy Farms, LLC
         "ford", // ford Ford Motor Company
         "forex", // forex DOTFOREX REGISTRY LTD
@@ -609,8 +632,10 @@ public final class DomainValidator extends AbstractValidator {
         "fresenius", // fresenius Fresenius Immobilien-Verwaltungs-GmbH
         "frl", // frl FRLregistry B.V.
         "frogans", // frogans OP3FT
+        "frontdoor", // frontdoor Lifestyle Domain Holdings, Inc.
         "frontier", // frontier Frontier Communications Corporation
         "ftr", // ftr Frontier Communications Corporation
+        "fujitsu", // fujitsu Fujitsu Limited
         "fund", // fund John Castle, LLC
         "furniture", // furniture Lone Fields, LLC
         "futbol", // futbol United TLD Holdco, Ltd.
@@ -640,10 +665,12 @@ public final class DomainValidator extends AbstractValidator {
         "gmbh", // gmbh Extra Dynamite, LLC
         "gmo", // gmo GMO Internet, Inc.
         "gmx", // gmx 1&1 Mail & Media GmbH
+        "godaddy", // godaddy Go Daddy East, LLC
         "gold", // gold June Edge, LLC
         "goldpoint", // goldpoint YODOBASHI CAMERA CO.,LTD.
         "golf", // golf Lone Falls, LLC
         "goo", // goo NTT Resonant Inc.
+        "goodyear", // goodyear The Goodyear Tire & Rubber Company
         "goog", // goog Charleston Road Registry Inc.
         "google", // google Charleston Road Registry Inc.
         "gop", // gop Republican State Leadership Committee, Inc.
@@ -671,6 +698,7 @@ public final class DomainValidator extends AbstractValidator {
         "helsinki", // helsinki City of Helsinki
         "here", // here Charleston Road Registry Inc.
         "hermes", // hermes Hermes International
+        "hgtv", // hgtv Lifestyle Domain Holdings, Inc.
         "hiphop", // hiphop Uniregistry, Corp.
         "hisamitsu", // hisamitsu Hisamitsu Pharmaceutical Co.,Inc.
         "hitachi", // hitachi Hitachi, Ltd.
@@ -698,7 +726,9 @@ public final class DomainValidator extends AbstractValidator {
         "icu", // icu One.com A/S
         "ifm", // ifm ifm electronic gmbh
         "iinet", // iinet Connect West Pty. Ltd.
+        "ikano", // ikano Ikano S.A.
         "imamat", // imamat Fondation Aga Khan (Aga Khan Foundation)
+        "imdb", // imdb Amazon Registry Service, Inc.
         "immo", // immo Auburn Bloom, LLC
         "immobilien", // immobilien United TLD Holdco Ltd.
         "industries", // industries Outer House, LLC
@@ -719,6 +749,7 @@ public final class DomainValidator extends AbstractValidator {
         "ist", // ist Istanbul Metropolitan Municipality
         "istanbul", // istanbul Istanbul Metropolitan Municipality / Medya A.S.
         "itau", // itau Itau Unibanco Holding S.A.
+        "itv", // itv ITV Services Limited
         "iwc", // iwc Richemont DNS Inc.
         "jaguar", // jaguar Jaguar Land Rover Ltd
         "java", // java Oracle Corporation
@@ -746,10 +777,12 @@ public final class DomainValidator extends AbstractValidator {
         "kia", // kia KIA MOTORS CORPORATION
         "kim", // kim Afilias Limited
         "kinder", // kinder Ferrero Trading Lux S.A.
+        "kindle", // kindle Amazon Registry Service, Inc.
         "kitchen", // kitchen Just Goodbye, LLC
         "kiwi", // kiwi DOT KIWI LIMITED
         "koeln", // koeln NetCologne Gesellschaft für Telekommunikation mbH
         "komatsu", // komatsu Komatsu Ltd.
+        "kosher", // kosher Kosher Marketing Assets LLC
         "kpmg", // kpmg KPMG International Cooperative (KPMG International Genossenschaft)
         "kpn", // kpn Koninklijke KPN N.V.
         "krd", // krd KRG Department of Information Technology
@@ -772,6 +805,7 @@ public final class DomainValidator extends AbstractValidator {
         "lease", // lease Victor Trail, LLC
         "leclerc", // leclerc A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
         "legal", // legal Blue Falls, LLC
+        "lego", // lego LEGO Juris A/S
         "lexus", // lexus TOYOTA MOTOR CORPORATION
         "lgbt", // lgbt Afilias Limited
         "liaison", // liaison Liaison Technologies, Incorporated
@@ -831,6 +865,8 @@ public final class DomainValidator extends AbstractValidator {
         "microsoft", // microsoft Microsoft Corporation
         "mil", // mil DoD Network Information Center
         "mini", // mini Bayerische Motoren Werke Aktiengesellschaft
+        "mit", // mit Massachusetts Institute of Technology
+        "mitsubishi", // mitsubishi Mitsubishi Corporation
         "mlb", // mlb MLB Advanced Media DH, LLC
         "mls", // mls The Canadian Real Estate Association
         "mma", // mma MMA IARD
@@ -872,9 +908,11 @@ public final class DomainValidator extends AbstractValidator {
         "next", // next Next plc
         "nextdirect", // nextdirect Next plc
         "nexus", // nexus Charleston Road Registry Inc.
+        "nfl", // nfl NFL Reg Ops LLC
         "ngo", // ngo Public Interest Registry
         "nhk", // nhk Japan Broadcasting Corporation (NHK)
         "nico", // nico DWANGO Co., Ltd.
+        "nike", // nike NIKE, Inc.
         "nikon", // nikon NIKON CORPORATION
         "ninja", // ninja United TLD Holdco Ltd.
         "nissan", // nissan NISSAN MOTOR CO., LTD.
@@ -882,6 +920,7 @@ public final class DomainValidator extends AbstractValidator {
         "nokia", // nokia Nokia Corporation
         "northwesternmutual", // northwesternmutual Northwestern Mutual Registry, LLC
         "norton", // norton Symantec Corporation
+        "now", // now Amazon Registry Service, Inc.
         "nowruz", // nowruz Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
         "nowtv", // nowtv Starbucks (HK) Limited
         "nra", // nra NRA Holdings Company, INC.
@@ -904,6 +943,7 @@ public final class DomainValidator extends AbstractValidator {
         "orange", // orange Orange Brand Services Limited
         "org", // org Public Interest Registry (PIR)
         "organic", // organic Afilias Limited
+        "orientexpress", // orientexpress Orient Express
         "origins", // origins The Estée Lauder Companies Inc.
         "osaka", // osaka Interlink Co., Ltd.
         "otsuka", // otsuka Otsuka Holdings Co., Ltd.
@@ -941,12 +981,15 @@ public final class DomainValidator extends AbstractValidator {
         "playstation", // playstation Sony Computer Entertainment Inc.
         "plumbing", // plumbing Spring Tigers, LLC
         "plus", // plus Sugar Mill, LLC
+        "pnc", // pnc PNC Domain Co., LLC
         "pohl", // pohl Deutsche Vermögensberatung Aktiengesellschaft DVAG
         "poker", // poker Afilias Domains No. 5 Limited
+        "politie", // politie Politie Nederland
         "porn", // porn ICM Registry PN LLC
         "post", // post Universal Postal Union
         "praxi", // praxi Praxi S.p.A.
         "press", // press DotPress Inc.
+        "prime", // prime Amazon Registry Service, Inc.
         "pro", // pro Registry Services Corporation dba RegistryPro
         "prod", // prod Charleston Road Registry Inc.
         "productions", // productions Magic Birch, LLC
@@ -1013,6 +1056,7 @@ public final class DomainValidator extends AbstractValidator {
         "sapo", // sapo PT Comunicacoes S.A.
         "sarl", // sarl Delta Orchard, LLC
         "sas", // sas Research IP LLC
+        "save", // save Amazon Registry Service, Inc.
         "saxo", // saxo Saxo Bank A/S
         "sbi", // sbi STATE BANK OF INDIA
         "sbs", // sbs SPECIAL BROADCASTING SERVICE CORPORATION
@@ -1033,11 +1077,13 @@ public final class DomainValidator extends AbstractValidator {
         "select", // select iSelect Ltd
         "sener", // sener Sener Ingeniería y Sistemas, S.A.
         "services", // services Fox Castle, LLC
+        "ses", // ses SES
         "seven", // seven Seven West Media Ltd
         "sew", // sew SEW-EURODRIVE GmbH & Co KG
         "sex", // sex ICM Registry SX LLC
         "sexy", // sexy Uniregistry, Corp.
         "sfr", // sfr Societe Francaise du Radiotelephone - SFR
+        "shangrila", // shangrila Shangri‐La International Hotel Management Limited
         "sharp", // sharp Sharp Corporation
         "shaw", // shaw Shaw Cablesystems G.P.
         "shell", // shell Shell Information Technology International Inc
@@ -1045,9 +1091,11 @@ public final class DomainValidator extends AbstractValidator {
         "shiksha", // shiksha Afilias Limited
         "shoes", // shoes Binky Galley, LLC
         "shop", // shop GMO Registry, Inc.
+        "shopping", // shopping Over Keep, LLC
         "shouji", // shouji QIHOO 360 TECHNOLOGY CO. LTD.
         "show", // show Snow Beach, LLC
         "shriram", // shriram Shriram Capital Ltd.
+        "silk", // silk Amazon Registry Service, Inc.
         "sina", // sina Sina Corporation
         "singles", // singles Fern Madison, LLC
         "site", // site DotSite Inc.
@@ -1109,6 +1157,7 @@ public final class DomainValidator extends AbstractValidator {
         "tax", // tax Storm Orchard, LLC
         "taxi", // taxi Pine Falls, LLC
         "tci", // tci Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+        "tdk", // tdk TDK Corporation
         "team", // team Atomic Lake, LLC
         "tech", // tech Dot Tech LLC
         "technology", // technology Auburn Falls, LLC
@@ -1143,6 +1192,7 @@ public final class DomainValidator extends AbstractValidator {
         "trading", // trading DOTTRADING REGISTRY LTD
         "training", // training Wild Willow, LLC
         "travel", // travel Tralliance Registry Management Company, LLC.
+        "travelchannel", // travelchannel Lifestyle Domain Holdings, Inc.
         "travelers", // travelers Travelers TLD, LLC
         "travelersinsurance", // travelersinsurance Travelers TLD, LLC
         "trust", // trust Artemis Internet Inc
@@ -1210,6 +1260,7 @@ public final class DomainValidator extends AbstractValidator {
         "wine", // wine June Station, LLC
         "wme", // wme William Morris Endeavor Entertainment, LLC
         "wolterskluwer", // wolterskluwer Wolters Kluwer N.V.
+        "woodside", // woodside Woodside Petroleum Limited
         "work", // work Top Level Domain Holdings Limited
         "works", // works Little Dynamite, LLC
         "world", // world Bitter Fields, LLC
@@ -1217,6 +1268,7 @@ public final class DomainValidator extends AbstractValidator {
         "wtf", // wtf Hidden Way, LLC
         "xbox", // xbox Microsoft Corporation
         "xerox", // xerox Xerox DNHC LLC
+        "xfinity", // xfinity Comcast IP Holdings I, LLC
         "xihuan", // xihuan QIHOO 360 TECHNOLOGY CO. LTD.
         "xin", // xin Elegant Leader Limited
         "xn--11b4c3d", // कॉम VeriSign Sarl
@@ -1231,6 +1283,7 @@ public final class DomainValidator extends AbstractValidator {
         "xn--4gbrim", // موقع Suhub Electronic Establishment
         "xn--55qw42g", // 公益 China Organizational Name Administration Center
         "xn--55qx5d", // 公司 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
+        "xn--5su34j936bgsg", // 香格里拉 Shangri‐La International Hotel Management Limited
         "xn--5tzm5g", // 网站 Global Website TLD Asia Limited
         "xn--6frz82g", // 移动 Afilias Limited
         "xn--6qq986b3xl", // 我爱你 Tycoon Treasure Limited
@@ -1238,6 +1291,7 @@ public final class DomainValidator extends AbstractValidator {
         "xn--80asehdb", // онлайн CORE Association
         "xn--80aswg", // сайт CORE Association
         "xn--8y0a063a", // 联通 China United Network Communications Corporation Limited
+        "xn--90ae", // бг Imena.BG Plc (NAMES.BG Plc)
         "xn--9dbq2a", // קום VeriSign Sarl
         "xn--9et52u", // 时尚 RISE VICTORY LIMITED
         "xn--9krt00a", // 微博 Sina Corporation
@@ -1322,6 +1376,7 @@ public final class DomainValidator extends AbstractValidator {
         "zara", // zara Industria de Diseño Textil, S.A. (INDITEX, S.A.)
         "zero", // zero Amazon Registry Services, Inc.
         "zip", // zip Charleston Road Registry Inc.
+        "zippo", // zippo Zadco Company
         "zone", // zone Outer Falls, LLC
         "zuerich", // zuerich Kanton Zürich (Canton of Zurich)
     };
@@ -1825,6 +1880,7 @@ public final class DomainValidator extends AbstractValidator {
                     return ascii;
             }
         } catch (IllegalArgumentException e) { // input is not valid
+            Main.trace(e);
             return input;
         }
     }
diff --git a/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java b/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
index f65169b..608ea11 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
@@ -31,7 +31,7 @@ import java.util.regex.Pattern;
  * This implementation is not guaranteed to catch all possible errors in an email address.
  * </p>.
  *
- * @version $Revision: 1723573 $
+ * @version $Revision: 1741724 $
  * @since Validator 1.4
  */
 public class EmailValidator extends AbstractValidator {
diff --git a/src/org/openstreetmap/josm/data/validation/routines/InetAddressValidator.java b/src/org/openstreetmap/josm/data/validation/routines/InetAddressValidator.java
index 4521ca7..d443964 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/InetAddressValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/InetAddressValidator.java
@@ -29,7 +29,7 @@ import java.util.List;
  * This class is a Singleton; you can retrieve the instance via the {@link #getInstance()} method.
  * </p>
  *
- * @version $Revision: 1715439 $
+ * @version $Revision: 1741724 $
  * @since Validator 1.4
  */
 public class InetAddressValidator extends AbstractValidator {
@@ -165,7 +165,7 @@ public class InetAddressValidator extends AbstractValidator {
                     if (!inet6Address.endsWith(octet)) {
                         return false;
                     }
-                    if (index > octets.length - 1 || index > 6) { // TODO magic number (sort of)
+                    if (index > octets.length - 1 || index > 6) { // CHECKSTYLE IGNORE MagicNumber
                         // IPV4 occupies last two octets
                         return false;
                     }
diff --git a/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java b/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
index 80396a8..ef354a8 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
@@ -63,7 +63,7 @@ import java.util.regex.Pattern;
  * to the {@link Pattern} API are safe to use in a multi-threaded environment.
  * </p>
  *
- * @version $Revision: 1713331 $
+ * @version $Revision: 1741724 $
  * @since Validator 1.4
  */
 public class RegexValidator extends AbstractValidator {
@@ -124,7 +124,7 @@ public class RegexValidator extends AbstractValidator {
             if (regexs[i] == null || regexs[i].isEmpty()) {
                 throw new IllegalArgumentException("Regular expression[" + i + "] is missing");
             }
-            patterns[i] =  Pattern.compile(regexs[i], flags);
+            patterns[i] = Pattern.compile(regexs[i], flags);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java b/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
index 1497627..3beb455 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/UrlValidator.java
@@ -27,6 +27,8 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.openstreetmap.josm.Main;
+
 /**
  * <p><b>URL Validation</b> routines.</p>
  * Behavior of validation is modified by passing in options:
@@ -67,7 +69,7 @@ import java.util.regex.Pattern;
  *   prints out "url is valid"
  *  </pre>
  *
- * @version $Revision: 1715435 $
+ * @version $Revision: 1741724 $
  * @see
  * <a href="http://www.ietf.org/rfc/rfc2396.txt">
  *  Uniform Resource Identifiers (URI): Generic Syntax
@@ -453,10 +455,11 @@ public class UrlValidator extends AbstractValidator {
             URI uri = new URI(null, null, path, null);
             String norm = uri.normalize().getPath();
             if (norm.startsWith("/../") // Trying to go via the parent dir
-             || norm.equals("/..")) {   // Trying to go to the parent dir
+             || "/..".equals(norm)) {   // Trying to go to the parent dir
                 return false;
             }
         } catch (URISyntaxException e) {
+            Main.trace(e);
             return false;
         }
 
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
index 29d0aeb..6da3735 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
@@ -43,11 +43,13 @@ public class Addresses extends Test {
     protected static final int MULTIPLE_STREET_RELATIONS = 2604;
     protected static final int HOUSE_NUMBER_TOO_FAR = 2605;
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     protected static final String ADDR_HOUSE_NUMBER  = "addr:housenumber";
     protected static final String ADDR_INTERPOLATION = "addr:interpolation";
     protected static final String ADDR_PLACE         = "addr:place";
     protected static final String ADDR_STREET        = "addr:street";
     protected static final String ASSOCIATED_STREET  = "associatedStreet";
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     protected static class AddressError extends TestError {
 
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java b/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
index 8b8914d..4089a5d 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Coastlines.java
@@ -11,7 +11,7 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
-import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.Node;
@@ -43,8 +43,7 @@ public class Coastlines extends Test {
      * Constructor
      */
     public Coastlines() {
-        super(tr("Coastlines"),
-                tr("This test checks that coastlines are correct."));
+        super(tr("Coastlines"), tr("This test checks that coastlines are correct."));
     }
 
     @Override
@@ -52,7 +51,7 @@ public class Coastlines extends Test {
 
         super.startTest(monitor);
 
-        OsmDataLayer layer = JosmAction.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
 
         if (layer != null) {
             downloadedArea = layer.data.getDataSourceArea();
diff --git a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
index 155141f..48ce6c8 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
@@ -12,6 +12,7 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.Test;
@@ -140,6 +141,7 @@ public class ConditionalKeys extends Test.TagTest {
                 }
             }
         } catch (ConditionalParsingException ex) {
+            Main.debug(ex);
             return ex.getMessage();
         }
         return null;
diff --git a/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java b/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
index aa34a39..6a53352 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
@@ -408,7 +408,7 @@ public class DuplicateNode extends Test {
             }
 
             if (DeleteCommand.checkAndConfirmOutlyingDelete(nodes, Collections.singleton(target)))
-                return MergeNodesAction.mergeNodes(Main.main.getEditLayer(), nodes, target);
+                return MergeNodesAction.mergeNodes(Main.getLayerManager().getEditLayer(), nodes, target);
         }
 
         return null; // undoRedo handling done in mergeNodes
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Highways.java b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
index 6b966da..a6634f2 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Highways.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
@@ -45,6 +45,7 @@ public class Highways extends Test {
     /**
      * Classified highways in order of importance
      */
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     private static final List<String> CLASSIFIED_HIGHWAYS = Arrays.asList(
             "motorway",  "motorway_link",
             "trunk",     "trunk_link",
@@ -54,6 +55,7 @@ public class Highways extends Test {
             "unclassified",
             "residential",
             "living_street");
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     private static final Set<String> KNOWN_SOURCE_MAXSPEED_CONTEXTS = new HashSet<>(Arrays.asList(
             "urban", "rural", "zone", "zone30", "zone:30", "nsl_single", "nsl_dual", "motorway", "trunk", "living_street", "bicycle_road"));
diff --git a/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java b/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
index 591ae2f..5de4192 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/InternetTags.java
@@ -3,9 +3,6 @@ package org.openstreetmap.josm.data.validation.tests;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.net.IDN;
-import java.util.regex.Pattern;
-
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -28,8 +25,6 @@ public class InternetTags extends Test {
     /** Error code for an invalid e-mail */
     public static final int INVALID_EMAIL = 3302;
 
-    private static final Pattern ASCII_PATTERN = Pattern.compile("^\\p{ASCII}+$");
-
     /**
      * List of keys subject to URL validation.
      */
@@ -84,34 +79,7 @@ public class InternetTags extends Test {
      * @since 7824
      */
     public TestError validateTag(OsmPrimitive p, String k, AbstractValidator validator, int code) {
-        TestError error = doValidateTag(p, k, null, validator, code);
-        if (error != null) {
-            // Workaround to https://issues.apache.org/jira/browse/VALIDATOR-290
-            // Apache Commons Validator 1.4.1-SNAPSHOT does not support yet IDN URLs
-            // To remove if it gets fixed on Apache side
-            String v = p.get(k);
-            if (!ASCII_PATTERN.matcher(v).matches()) {
-                try {
-                    String protocol = "";
-                    if (v.contains("://")) {
-                        protocol = v.substring(0, v.indexOf("://")+3);
-                    }
-                    String domain = !protocol.isEmpty() ? v.substring(protocol.length(), v.length()) : v;
-                    String ending = "";
-                    if (domain.contains("/")) {
-                        int idx = domain.indexOf('/');
-                        ending = domain.substring(idx, domain.length());
-                        domain = domain.substring(0, idx);
-                    }
-                    // Try to apply ToASCII algorithm
-                    error = doValidateTag(p, k, protocol+IDN.toASCII(domain)+ending, validator, code);
-                } catch (IllegalArgumentException e) {
-                    error.setMessage(error.getMessage() +
-                            tr(" URL cannot be converted to ASCII: {0}", e.getMessage()));
-                }
-            }
-        }
-        return error;
+        return doValidateTag(p, k, null, validator, code);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java b/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java
index 62f8bc4..7a02915 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/LongSegment.java
@@ -19,7 +19,7 @@ import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 public class LongSegment extends Test {
 
     /** Long segment error */
-    protected static final int LONG_SEGMENT    = 3501;
+    protected static final int LONG_SEGMENT = 3501;
     /** Maximum segment length for this test */
     protected int maxlength;
 
diff --git a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
index 64439f6..ad5afe5 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
@@ -300,7 +300,7 @@ public class MapCSSTagChecker extends Test.TagTest {
                             final Severity severity = Severity.valueOf(ai.key.substring("throw".length()).toUpperCase(Locale.ENGLISH));
                             check.errors.put(ai, severity);
                         } catch (IllegalArgumentException e) {
-                            Main.warn("Unsupported "+ai.key+" instruction. Allowed instructions are "+POSSIBLE_THROWS);
+                            Main.warn(e, "Unsupported "+ai.key+" instruction. Allowed instructions are "+POSSIBLE_THROWS+'.');
                         }
                     } else if ("fixAdd".equals(ai.key)) {
                         check.fixCommands.add(FixCommand.fixAdd(ai.val));
@@ -435,9 +435,7 @@ public class MapCSSTagChecker extends Test.TagTest {
                     return tag.toString();
                 }
             } catch (IndexOutOfBoundsException ignore) {
-                if (Main.isDebugEnabled()) {
-                    Main.debug(ignore.getMessage());
-                }
+                Main.debug(ignore);
             }
             return null;
         }
@@ -465,7 +463,7 @@ public class MapCSSTagChecker extends Test.TagTest {
                     // Perform replacement with null-safe + regex-safe handling
                     m.appendReplacement(sb, String.valueOf(argument).replace("^(", "").replace(")$", ""));
                 } catch (IndexOutOfBoundsException | IllegalArgumentException e) {
-                    Main.error(tr("Unable to replace argument {0} in {1}: {2}", argument, sb, e.getMessage()));
+                    Main.error(e, tr("Unable to replace argument {0} in {1}: {2}", argument, sb, e.getMessage()));
                 }
             }
             m.appendTail(sb);
diff --git a/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java b/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
index 664f1c8..72f4e33 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/OverlappingWays.java
@@ -61,7 +61,7 @@ public class OverlappingWays extends Test {
     }
 
     @Override
-    public void startTest(ProgressMonitor monitor)  {
+    public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
         nodePairs = new MultiMap<>(1000);
     }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
index 47f55ee..8fd2802 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
@@ -41,6 +41,8 @@ public class PowerLines extends Test {
     protected static final Collection<String> POWER_TOWER_TAGS = Arrays.asList("tower", "pole");
     /** Values for {@code power} key interpreted as power stations */
     protected static final Collection<String> POWER_STATION_TAGS = Arrays.asList("station", "sub_station", "substation", "plant", "generator");
+    /** Values for {@code building} key interpreted as power stations */
+    protected static final Collection<String> BUILDING_STATION_TAGS = Arrays.asList("transformer_tower");
     /** Values for {@code power} key interpreted as allowed power items */
     protected static final Collection<String> POWER_ALLOWED_TAGS = Arrays.asList("switch", "transformer", "busbar", "generator", "switchgear",
             "portal", "terminal", "insulator");
@@ -173,7 +175,7 @@ public class PowerLines extends Test {
      * @return {@code true} if power key is set and equal to station/sub_station/plant
      */
     protected static final boolean isPowerStation(OsmPrimitive p) {
-        return isPowerIn(p, POWER_STATION_TAGS);
+        return isPowerIn(p, POWER_STATION_TAGS) || isBuildingIn(p, BUILDING_STATION_TAGS);
     }
 
     /**
@@ -195,7 +197,7 @@ public class PowerLines extends Test {
     }
 
     /**
-     * Helper function to check if power tags is a certain value.
+     * Helper function to check if power tag is a certain value.
      * @param p The primitive to be tested
      * @param values List of possible values
      * @return {@code true} if power key is set and equal to possible values
@@ -205,6 +207,17 @@ public class PowerLines extends Test {
         return v != null && values != null && values.contains(v);
     }
 
+    /**
+     * Helper function to check if building tag is a certain value.
+     * @param p The primitive to be tested
+     * @param values List of possible values
+     * @return {@code true} if power key is set and equal to possible values
+     */
+    private static boolean isBuildingIn(OsmPrimitive p, Collection<String> values) {
+        String v = p.get("building");
+        return v != null && values != null && values.contains(v);
+    }
+
     protected static class PowerLineError extends TestError {
         private final Way line;
 
diff --git a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
index 46c6f3b..b57dc9b 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
@@ -35,22 +35,24 @@ import org.openstreetmap.josm.tools.Utils;
  */
 public class RelationChecker extends Test {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     /** Role {0} unknown in templates {1} */
-    public static final int ROLE_UNKNOWN      = 1701;
+    public static final int ROLE_UNKNOWN     = 1701;
     /** Empty role type found when expecting one of {0} */
-    public static final int ROLE_EMPTY        = 1702;
+    public static final int ROLE_EMPTY       = 1702;
     /** Role member does not match expression {0} in template {1} */
-    public static final int WRONG_TYPE        = 1703;
+    public static final int WRONG_TYPE       = 1703;
     /** Number of {0} roles too high ({1}) */
-    public static final int HIGH_COUNT        = 1704;
+    public static final int HIGH_COUNT       = 1704;
     /** Number of {0} roles too low ({1}) */
-    public static final int LOW_COUNT         = 1705;
+    public static final int LOW_COUNT        = 1705;
     /** Role {0} missing */
-    public static final int ROLE_MISSING      = 1706;
+    public static final int ROLE_MISSING     = 1706;
     /** Relation type is unknown */
-    public static final int RELATION_UNKNOWN  = 1707;
+    public static final int RELATION_UNKNOWN = 1707;
     /** Relation is empty */
-    public static final int RELATION_EMPTY    = 1708;
+    public static final int RELATION_EMPTY   = 1708;
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     /**
      * Error message used to group errors related to role problems.
diff --git a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
index 69e68d3..da8c9b5 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
@@ -114,6 +114,7 @@ public class TagChecker extends TagTest {
     protected JCheckBox prefCheckFixmesBeforeUpload;
     protected JCheckBox prefCheckPaintBeforeUpload;
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     protected static final int EMPTY_VALUES      = 1200;
     protected static final int INVALID_KEY       = 1201;
     protected static final int INVALID_VALUE     = 1202;
@@ -128,6 +129,7 @@ public class TagChecker extends TagTest {
     protected static final int MISSPELLED_VALUE  = 1212;
     protected static final int MISSPELLED_KEY    = 1213;
     protected static final int MULTIPLE_SPACES   = 1214;
+    // CHECKSTYLE.ON: SingleSpaceSeparator
     // 1250 and up is used by tagcheck
 
     protected EditableList sourcesList;
@@ -242,6 +244,7 @@ public class TagChecker extends TagTest {
                     }
                 }
             } catch (IOException e) {
+                Main.error(e);
                 errorSources.append(source).append('\n');
             }
         }
@@ -291,7 +294,7 @@ public class TagChecker extends TagTest {
                 presetsValueData.putAll(ky.key, values);
                 harmonizedKeys.put(harmonizeKey(ky.key), ky.key);
             } catch (NullPointerException e) {
-                Main.error(p+": Unable to initialize "+ky);
+                Main.error(e, p+": Unable to initialize "+ky+'.');
             }
         }
     }
@@ -706,9 +709,11 @@ public class TagChecker extends TagTest {
         private OsmPrimitiveType type;
         private int code;
         protected Severity severity;
-        protected static final int TAG_CHECK_ERROR  = 1250;
-        protected static final int TAG_CHECK_WARN   = 1260;
-        protected static final int TAG_CHECK_INFO   = 1270;
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        protected static final int TAG_CHECK_ERROR = 1250;
+        protected static final int TAG_CHECK_WARN  = 1260;
+        protected static final int TAG_CHECK_INFO  = 1270;
+        // CHECKSTYLE.ON: SingleSpaceSeparator
 
         protected static class CheckerElement {
             public Object tag;
@@ -778,6 +783,7 @@ public class TagChecker extends TagTest {
                     description = null;
                 }
             } catch (IllegalStateException e) {
+                Main.error(e);
                 description = null;
             }
             String[] n = SPLIT_TRIMMED_PATTERN.split(trimmed, 3);
@@ -820,8 +826,10 @@ public class TagChecker extends TagTest {
                 try {
                     data.add(new CheckerElement(exp));
                 } catch (IllegalStateException e) {
+                    Main.trace(e);
                     return tr("Illegal expression ''{0}''", exp);
                 } catch (PatternSyntaxException e) {
+                    Main.trace(e);
                     return tr("Illegal regular expression ''{0}''", exp);
                 }
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/UnclosedWays.java b/src/org/openstreetmap/josm/data/validation/tests/UnclosedWays.java
index d6fcda7..0ecc3e0 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/UnclosedWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/UnclosedWays.java
@@ -94,8 +94,10 @@ public class UnclosedWays extends Test {
         public final TestError getTestError(Way w) {
             String value = w.get(key);
             if (isValueErroneous(value)) {
+                // CHECKSTYLE.OFF: SingleSpaceSeparator
                 String  type = engMessage.contains("{0}") ? tr(engMessage, tr(value)) : tr(engMessage);
                 String etype = engMessage.contains("{0}") ? MessageFormat.format(engMessage, value) : engMessage;
+                // CHECKSTYLE.ON: SingleSpaceSeparator
                 return new TestError(UnclosedWays.this, Severity.WARNING, tr("Unclosed way"),
                         type, etype, code, Arrays.asList(w),
                         // The important parts of an unclosed way are the first and
@@ -135,8 +137,9 @@ public class UnclosedWays extends Test {
     }
 
     private final UnclosedWaysCheck[] checks = {
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         new UnclosedWaysCheck(1101, "natural",   marktr("natural type {0}"),
-                new HashSet<>(Arrays.asList("coastline", "cliff", "tree_row", "ridge", "valley", "arete", "gorge"))),
+                new HashSet<>(Arrays.asList("cave", "coastline", "cliff", "tree_row", "ridge", "valley", "arete", "gorge"))),
         new UnclosedWaysCheck(1102, "landuse",   marktr("landuse type {0}")),
         new UnclosedWaysCheck(1103, "amenities", marktr("amenities type {0}")),
         new UnclosedWaysCheck(1104, "sport",     marktr("sport type {0}"),
@@ -151,6 +154,7 @@ public class UnclosedWays extends Test {
         new UnclosedWaysCheck(1109, "boundary", marktr("boundary type {0}")),
         new UnclosedWaysBooleanCheck(1120, "building", marktr("building")),
         new UnclosedWaysBooleanCheck(1130, "area",     marktr("area")),
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     };
 
     /**
diff --git a/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java b/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
index 34ee4d6..411a734 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/UnconnectedWays.java
@@ -20,6 +20,7 @@ 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.BBox;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.QuadBuckets;
@@ -163,7 +164,8 @@ public abstract class UnconnectedWays extends Test {
         othernodes = new HashSet<>();
         mindist = Main.pref.getDouble(PREFIX + ".node_way_distance", 10.0);
         minmiddledist = Main.pref.getDouble(PREFIX + ".way_way_distance", 0.0);
-        dsArea = Main.main == null || !Main.main.hasEditLayer() ? null : Main.main.getCurrentDataSet().getDataSourceArea();
+        DataSet dataSet = Main.getLayerManager().getEditDataSet();
+        dsArea = dataSet == null ? null : dataSet.getDataSourceArea();
     }
 
     protected Map<Node, Way> getWayEndNodesNearOtherHighway() {
@@ -345,7 +347,7 @@ public abstract class UnconnectedWays extends Test {
                 y1 = y2;
                 y2 = tmpy;
             }
-            LatLon topLeft  = new LatLon(y2+fudge, x1-fudge);
+            LatLon topLeft = new LatLon(y2+fudge, x1-fudge);
             LatLon botRight = new LatLon(y1-fudge, x2+fudge);
             List<LatLon> ret = new ArrayList<>(2);
             ret.add(topLeft);
@@ -354,9 +356,8 @@ public abstract class UnconnectedWays extends Test {
         }
 
         public Collection<Node> nearbyNodes(double dist) {
-            // If you're looking for nodes that are farther
-            // away that we looked for last time, the cached
-            // result is no good
+            // If you're looking for nodes that are farther away that we looked for last time,
+            // the cached result is no good
             if (dist > nearbyNodeCacheDist) {
                 nearbyNodeCache = null;
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java b/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
index 1a68a43..9a49237 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/UntaggedWay.java
@@ -7,7 +7,7 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -26,18 +26,20 @@ import org.openstreetmap.josm.gui.progress.ProgressMonitor;
  */
 public class UntaggedWay extends Test {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     /** Empty way error */
-    protected static final int EMPTY_WAY    = 301;
+    protected static final int EMPTY_WAY        = 301;
     /** Untagged way error */
-    protected static final int UNTAGGED_WAY = 302;
+    protected static final int UNTAGGED_WAY     = 302;
     /** Unnamed way error */
-    protected static final int UNNAMED_WAY  = 303;
+    protected static final int UNNAMED_WAY      = 303;
     /** One node way error */
-    protected static final int ONE_NODE_WAY = 304;
+    protected static final int ONE_NODE_WAY     = 304;
     /** Unnamed junction error */
-    protected static final int UNNAMED_JUNCTION  = 305;
+    protected static final int UNNAMED_JUNCTION = 305;
     /** Untagged, but commented way error */
-    protected static final int COMMENTED_WAY = 306;
+    protected static final int COMMENTED_WAY    = 306;
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     private Set<Way> waysUsedInRelations;
 
@@ -120,7 +122,7 @@ public class UntaggedWay extends Test {
     @Override
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
-        DataSet ds = JosmAction.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds == null)
             return;
         waysUsedInRelations = new HashSet<>();
diff --git a/src/org/openstreetmap/josm/data/validation/tests/WronglyOrderedWays.java b/src/org/openstreetmap/josm/data/validation/tests/WronglyOrderedWays.java
index e30ed11..047846d 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/WronglyOrderedWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/WronglyOrderedWays.java
@@ -18,8 +18,10 @@ import org.openstreetmap.josm.tools.Geometry;
  */
 public class WronglyOrderedWays extends Test {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     protected static final int WRONGLY_ORDERED_COAST = 1001;
     protected static final int WRONGLY_ORDERED_LAND  = 1003;
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     /**
      * Constructor
diff --git a/src/org/openstreetmap/josm/data/validation/util/ValUtil.java b/src/org/openstreetmap/josm/data/validation/util/ValUtil.java
index 17960f7..9e371c4 100644
--- a/src/org/openstreetmap/josm/data/validation/util/ValUtil.java
+++ b/src/org/openstreetmap/josm/data/validation/util/ValUtil.java
@@ -44,10 +44,12 @@ public final class ValUtil {
         Point2D cell;
 
         // First, round coordinates
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         long x0 = Math.round(n1.getEastNorth().east()  * OsmValidator.griddetail);
         long y0 = Math.round(n1.getEastNorth().north() * OsmValidator.griddetail);
         long x1 = Math.round(n2.getEastNorth().east()  * OsmValidator.griddetail);
         long y1 = Math.round(n2.getEastNorth().north() * OsmValidator.griddetail);
+        // CHECKSTYLE.ON: SingleSpaceSeparator
 
         // Start of the way
         cell = new Point2D.Double(x0, y0);
@@ -72,10 +74,12 @@ public final class ValUtil {
         }
 
         // Then floor coordinates, in case the way is in the border of the cell.
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         x0 = (long) Math.floor(n1.getEastNorth().east()  * OsmValidator.griddetail);
         y0 = (long) Math.floor(n1.getEastNorth().north() * OsmValidator.griddetail);
         x1 = (long) Math.floor(n2.getEastNorth().east()  * OsmValidator.griddetail);
         y1 = (long) Math.floor(n2.getEastNorth().north() * OsmValidator.griddetail);
+        // CHECKSTYLE.ON: SingleSpaceSeparator
 
         // Start of the way
         cell = new Point2D.Double(x0, y0);
@@ -146,8 +150,8 @@ public final class ValUtil {
             aux = y0; y0 = y1; y1 = aux;
         }
 
-        double dx  = x1 - x0;
-        double dy  = y1 - y0;
+        double dx = x1 - x0;
+        double dy = y1 - y0;
         long stepY = y0 <= y1 ? 1 : -1;
         long gridX0 = (long) Math.floor(x0);
         long gridX1 = (long) Math.floor(x1);
diff --git a/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java b/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
index 49a5d7d..935bd41 100644
--- a/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
+++ b/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
@@ -160,7 +160,7 @@ public class DefaultNameFormatter implements NameFormatter, HistoryNameFormatter
                         if (t != null) {
                             /* I18n: house number, street as parameter, number should remain
                         before street for better visibility */
-                            n =  tr("House number {0} at {1}", s, t);
+                            n = tr("House number {0} at {1}", s, t);
                         } else {
                             /* I18n: house number as parameter */
                             n = tr("House number {0}", s);
@@ -252,7 +252,7 @@ public class DefaultNameFormatter implements NameFormatter, HistoryNameFormatter
                         if (t != null) {
                             /* I18n: house number, street as parameter, number should remain
                         before street for better visibility */
-                            n =  tr("House number {0} at {1}", s, t);
+                            n = tr("House number {0} at {1}", s, t);
                         } else {
                             /* I18n: house number as parameter */
                             n = tr("House number {0}", s);
@@ -404,7 +404,7 @@ public class DefaultNameFormatter implements NameFormatter, HistoryNameFormatter
             name = (relation.get("public_transport") != null) ? tr("public transport") : null;
         }
         if (name == null) {
-            String building  = relation.get("building");
+            String building = relation.get("building");
             if (OsmUtils.isTrue(building)) {
                 name = tr("building");
             } else if (building != null) {
diff --git a/src/org/openstreetmap/josm/gui/ExtendedDialog.java b/src/org/openstreetmap/josm/gui/ExtendedDialog.java
index 9997687..579429a 100644
--- a/src/org/openstreetmap/josm/gui/ExtendedDialog.java
+++ b/src/org/openstreetmap/josm/gui/ExtendedDialog.java
@@ -406,8 +406,8 @@ public class ExtendedDialog extends JDialog {
         boolean limitedInWidth = d.width > x.width;
         boolean limitedInHeight = d.height > x.height;
 
-        if (x.width  > 0 && d.width  > x.width) {
-            d.width  = x.width;
+        if (x.width > 0 && d.width > x.width) {
+            d.width = x.width;
         }
         if (x.height > 0 && d.height > x.height) {
             d.height = x.height;
diff --git a/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java b/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
index e104207..a90898d 100644
--- a/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
+++ b/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
@@ -213,7 +213,7 @@ public final class HelpAwareOptionPane {
      * @return the index of the selected option or {@link JOptionPane#CLOSED_OPTION}
      */
     public static int showOptionDialog(Component parentComponent, Object msg, String title, int messageType,
-            Icon icon, final ButtonSpec[] options, final ButtonSpec defaultOption, final String helpTopic)  {
+            Icon icon, final ButtonSpec[] options, final ButtonSpec defaultOption, final String helpTopic) {
         final List<JButton> buttons = createOptionButtons(options, helpTopic);
         if (helpTopic != null) {
             buttons.add(createHelpButton(helpTopic));
@@ -333,7 +333,7 @@ public final class HelpAwareOptionPane {
      * @return the index of the selected option or {@link JOptionPane#CLOSED_OPTION}
      * @see #showOptionDialog(Component, Object, String, int, Icon, ButtonSpec[], ButtonSpec, String)
      */
-    public static int showOptionDialog(Component parentComponent, Object msg, String title, int messageType, String helpTopic)  {
+    public static int showOptionDialog(Component parentComponent, Object msg, String title, int messageType, String helpTopic) {
         return showOptionDialog(parentComponent, msg, title, messageType, null, null, null, helpTopic);
     }
 
@@ -351,7 +351,7 @@ public final class HelpAwareOptionPane {
      * @param helpTopic the help topic. Can be null.
      */
     public static void showMessageDialogInEDT(final Component parentComponent, final Object msg, final String title,
-            final int messageType, final String helpTopic)  {
+            final int messageType, final String helpTopic) {
         GuiHelper.runInEDT(new Runnable() {
             @Override
             public void run() {
diff --git a/src/org/openstreetmap/josm/gui/IconToggleButton.java b/src/org/openstreetmap/josm/gui/IconToggleButton.java
index 330a7d5..4d81363 100644
--- a/src/org/openstreetmap/josm/gui/IconToggleButton.java
+++ b/src/org/openstreetmap/josm/gui/IconToggleButton.java
@@ -11,6 +11,7 @@ import javax.swing.JToggleButton;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Destroyable;
 
 /**
@@ -40,6 +41,7 @@ public class IconToggleButton extends JToggleButton implements HideableButton, P
      */
     public IconToggleButton(Action action, boolean isExpert) {
         super(action);
+        CheckParameterUtil.ensureParameterNotNull(action, "action");
         this.isExpert = isExpert;
         setText(null);
 
diff --git a/src/org/openstreetmap/josm/gui/ImageryMenu.java b/src/org/openstreetmap/josm/gui/ImageryMenu.java
index 45ee187..7f67482 100644
--- a/src/org/openstreetmap/josm/gui/ImageryMenu.java
+++ b/src/org/openstreetmap/josm/gui/ImageryMenu.java
@@ -32,9 +32,11 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
 import org.openstreetmap.josm.data.imagery.Shape;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -67,7 +69,7 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+            Collection<ImageryLayer> layers = Main.getLayerManager().getLayersOfType(ImageryLayer.class);
             if (layers.isEmpty()) {
                 setEnabled(false);
                 return;
@@ -110,7 +112,7 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
         /* I18N: mnemonic: I */
         super(trc("menu", "Imagery"));
         setupMenuScroller();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
         // build dynamically
         addMenuListener(new MenuListener() {
             @Override
@@ -209,11 +211,7 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
     }
 
     private JMenuItem getNewOffsetMenu() {
-        if (!Main.isDisplayingMapView()) {
-            offsetAction.setEnabled(false);
-            return singleOffset;
-        }
-        Collection<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        Collection<ImageryLayer> layers = Main.getLayerManager().getLayersOfType(ImageryLayer.class);
         if (layers.isEmpty()) {
             offsetAction.setEnabled(false);
             return singleOffset;
@@ -238,22 +236,22 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
+    public void layerAdded(LayerAddEvent e) {
+        if (e.getAddedLayer() instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof ImageryLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof ImageryLayer) {
             refreshOffsetMenu();
         }
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof ImageryLayer) {
-            refreshOffsetMenu();
-        }
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        refreshOffsetMenu();
     }
 
     /**
@@ -283,7 +281,7 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
     }
 
     private void addDynamicSeparator() {
-        JPopupMenu.Separator s =  new JPopupMenu.Separator();
+        JPopupMenu.Separator s = new JPopupMenu.Separator();
         dynamicItems.add(s);
         add(s);
     }
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index 400c83f..15dd555 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -5,10 +5,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.Dimension;
-import java.awt.Image;
-import java.awt.Toolkit;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -32,7 +28,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -40,7 +35,6 @@ import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.Callable;
 
-import javax.swing.JFrame;
 import javax.swing.JOptionPane;
 import javax.swing.RepaintManager;
 import javax.swing.SwingUtilities;
@@ -69,10 +63,10 @@ import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.tools.FontsManager;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.I18n;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
 import org.openstreetmap.josm.tools.PlatformHookWindows;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.WindowGeometry;
 import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
 
 import gnu.getopt.Getopt;
@@ -85,38 +79,42 @@ import gnu.getopt.LongOpt;
  */
 public class MainApplication extends Main {
 
+    private MainFrame mainFrame;
+
     /**
-     * Constructs a new {@code MainApplication}.
+     * Constructs a new {@code MainApplication} without a window.
      */
     public MainApplication() {
-       // Allow subclassing (see JOSM.java)
+        // Allow subclassing (see JOSM.java)
+        this(null);
     }
 
     /**
      * Constructs a main frame, ready sized and operating. Does not display the frame.
      * @param mainFrame The main JFrame of the application
+     * @since 10340
      */
-    public MainApplication(JFrame mainFrame) {
-        addListener();
-        mainFrame.setContentPane(contentPanePrivate);
-        mainFrame.setJMenuBar(menu);
-        geometry.applySafe(mainFrame);
-        List<Image> l = new LinkedList<>();
-        l.add(ImageProvider.get("logo_16x16x32").getImage());
-        l.add(ImageProvider.get("logo_16x16x8").getImage());
-        l.add(ImageProvider.get("logo_32x32x32").getImage());
-        l.add(ImageProvider.get("logo_32x32x8").getImage());
-        l.add(ImageProvider.get("logo_48x48x32").getImage());
-        l.add(ImageProvider.get("logo_48x48x8").getImage());
-        l.add(ImageProvider.get("logo").getImage());
-        mainFrame.setIconImages(l);
-        mainFrame.addWindowListener(new WindowAdapter() {
-            @Override
-            public void windowClosing(final WindowEvent arg0) {
-                Main.exitJosm(true, 0);
-            }
-        });
-        mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+    public MainApplication(MainFrame mainFrame) {
+        this.mainFrame = mainFrame;
+    }
+
+    @Override
+    protected void initializeMainWindow() {
+        mainPanel.reAddListeners();
+        if (mainFrame != null) {
+            mainFrame.initialize();
+
+            menu = mainFrame.getMenu();
+        } else {
+            // required for running some tests.
+            menu = new MainMenu();
+        }
+    }
+
+    @Override
+    protected void shutdown() {
+        mainFrame.storeState();
+        super.shutdown();
     }
 
     /**
@@ -148,10 +146,12 @@ public class MainApplication extends Main {
                 "\t--skip-plugins                            "+tr("Skip loading plugins")+"\n\n"+
                 "\t--offline=<osm_api|josm_website|all>      "+tr("Disable access to the given resource(s), separated by comma")+"\n\n"+
                 tr("options provided as Java system properties")+":\n"+
+                // CHECKSTYLE.OFF: SingleSpaceSeparator
                 "\t-Djosm.pref="    +tr("/PATH/TO/JOSM/PREF    ")+tr("Set the preferences directory")+"\n\n"+
                 "\t-Djosm.userdata="+tr("/PATH/TO/JOSM/USERDATA")+tr("Set the user data directory")+"\n\n"+
                 "\t-Djosm.cache="   +tr("/PATH/TO/JOSM/CACHE   ")+tr("Set the cache directory")+"\n\n"+
                 "\t-Djosm.home="    +tr("/PATH/TO/JOSM/HOMEDIR ")+
+                // CHECKSTYLE.ON: SingleSpaceSeparator
                 tr("Relocate all 3 directories to homedir. Cache directory will be in homedir/cache")+"\n\n"+
                 tr("-Djosm.home has lower precedence, i.e. the specific setting overrides the general one")+"\n\n"+
                 tr("note: For some tasks, JOSM needs a lot of memory. It can be necessary to add the following\n" +
@@ -396,7 +396,10 @@ public class MainApplication extends Main {
 
         I18n.setupLanguageFonts();
 
-        final JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor"));
+        WindowGeometry geometry = WindowGeometry.mainWindow("gui.geometry",
+                args.containsKey(Option.GEOMETRY) ? args.get(Option.GEOMETRY).iterator().next() : null,
+                !args.containsKey(Option.NO_MAXIMIZE) && Main.pref.getBoolean("gui.maximized", false));
+        final MainFrame mainFrame = new MainFrame(contentPanePrivate, mainPanel, geometry);
         Main.parent = mainFrame;
 
         if (args.containsKey(Option.LOAD_PREFERENCES)) {
@@ -463,6 +466,7 @@ public class MainApplication extends Main {
 
         monitor.indeterminateSubTask(tr("Creating main GUI"));
         final Main main = new MainApplication(mainFrame);
+        main.initialize();
 
         if (!skipLoadingPlugins) {
             loadLatePlugins(splash, monitor, pluginsToLoad);
@@ -482,12 +486,7 @@ public class MainApplication extends Main {
 
         boolean maximized = Main.pref.getBoolean("gui.maximized", false);
         if ((!args.containsKey(Option.NO_MAXIMIZE) && maximized) || args.containsKey(Option.MAXIMIZE)) {
-            if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
-                Main.windowState = JFrame.MAXIMIZED_BOTH;
-                mainFrame.setExtendedState(Main.windowState);
-            } else {
-                Main.debug("Main window: maximizing not supported");
-            }
+            mainFrame.setMaximized(true);
         }
         if (main.menu.fullscreenToggleAction != null) {
             main.menu.fullscreenToggleAction.initial();
diff --git a/src/org/openstreetmap/josm/gui/MainFrame.java b/src/org/openstreetmap/josm/gui/MainFrame.java
new file mode 100644
index 0000000..7b5a654
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/MainFrame.java
@@ -0,0 +1,246 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.WindowGeometry;
+
+/**
+ * This is the JOSM main window. It updates it's title.
+ * @author Michael Zangl
+ * @since 10340
+ */
+public class MainFrame extends JFrame {
+    private final transient LayerStateChangeListener updateTitleOnLayerStateChange = new LayerStateChangeListener() {
+        @Override
+        public void uploadDiscouragedChanged(OsmDataLayer layer, boolean newValue) {
+            onLayerChange(layer);
+        }
+    };
+
+    private final transient PropertyChangeListener updateTitleOnSaveChange = new PropertyChangeListener() {
+        @Override
+        public void propertyChange(PropertyChangeEvent evt) {
+            if (evt.getPropertyName().equals(OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP)
+                    || evt.getPropertyName().equals(OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP)) {
+                OsmDataLayer layer = (OsmDataLayer) evt.getSource();
+                onLayerChange(layer);
+            }
+        }
+    };
+
+    protected transient WindowGeometry geometry;
+    protected int windowState = JFrame.NORMAL;
+    private MainMenu menu;
+
+    /**
+     * Create a new main window.
+     */
+    public MainFrame() {
+        this(new JPanel(), new MainPanel(Main.getLayerManager()), new WindowGeometry(new Rectangle(10, 10, 500, 500)));
+    }
+
+    /**
+     * Create a new main window. The parameters will be removed in the future.
+     * @param contentPanePrivate The content
+     * @param mainPanel The main panel.
+     * @param geometry The inital geometry to use.
+     */
+    public MainFrame(Container contentPanePrivate, MainPanel mainPanel, WindowGeometry geometry) {
+        super();
+        this.geometry = geometry;
+        setContentPane(contentPanePrivate);
+    }
+
+    /**
+     * Initializes the content of the window and get the current status panel.
+     */
+    public void initialize() {
+        menu = new MainMenu();
+        addComponentListener(new WindowPositionSizeListener());
+        addWindowStateListener(new WindowPositionSizeListener());
+
+        setJMenuBar(menu);
+        geometry.applySafe(this);
+        List<Image> l = new LinkedList<>();
+        l.add(ImageProvider.get("logo_16x16x32").getImage());
+        l.add(ImageProvider.get("logo_16x16x8").getImage());
+        l.add(ImageProvider.get("logo_32x32x32").getImage());
+        l.add(ImageProvider.get("logo_32x32x8").getImage());
+        l.add(ImageProvider.get("logo_48x48x32").getImage());
+        l.add(ImageProvider.get("logo_48x48x8").getImage());
+        l.add(ImageProvider.get("logo").getImage());
+        setIconImages(l);
+        addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(final WindowEvent arg0) {
+                Main.exitJosm(true, 0);
+            }
+        });
+        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+
+        // This listener is never removed, since the main frame exists forever.
+        Main.getLayerManager().addActiveLayerChangeListener(new ActiveLayerChangeListener() {
+            @Override
+            public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+                refreshTitle();
+            }
+        });
+        Main.getLayerManager().addLayerChangeListener(new ManageLayerListeners(), true);
+
+        refreshTitle();
+
+        getContentPane().add(Main.panel, BorderLayout.CENTER);
+        menu.initialize();
+    }
+
+    /**
+     * Stores the current state of the main frame.
+     */
+    public void storeState() {
+        if (geometry != null) {
+            geometry.remember("gui.geometry");
+        }
+        Main.pref.put("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
+    }
+
+    /**
+     * Gets the main menu used for this window.
+     * @return The main menu.
+     */
+    public MainMenu getMenu() {
+        if (menu == null) {
+            throw new IllegalStateException("Not initialized.");
+        }
+        return menu;
+    }
+
+    /**
+     * Sets this frame to be maximized.
+     * @param maximized <code>true</code> if the window should be maximized.
+     */
+    public void setMaximized(boolean maximized) {
+        if (maximized) {
+            if (Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH)) {
+                windowState = JFrame.MAXIMIZED_BOTH;
+                setExtendedState(windowState);
+            } else {
+                Main.debug("Main window: maximizing not supported");
+            }
+        } else {
+            throw new UnsupportedOperationException("Unimplemented.");
+        }
+    }
+
+    /**
+     * Update the title of the window to reflect the current content.
+     */
+    public void refreshTitle() {
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
+        boolean dirty = editLayer != null && (editLayer.requiresSaveToFile()
+                || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged()));
+        setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor"));
+        getRootPane().putClientProperty("Window.documentModified", dirty);
+    }
+
+    private void onLayerChange(OsmDataLayer layer) {
+        if (layer == Main.getLayerManager().getEditLayer()) {
+            refreshTitle();
+        }
+    }
+
+    /**
+     * Manages the layer listeners, adds them to every layer.
+     */
+    private final class ManageLayerListeners implements LayerChangeListener {
+        @Override
+        public void layerAdded(LayerAddEvent e) {
+            if (e.getAddedLayer() instanceof OsmDataLayer) {
+                OsmDataLayer osmDataLayer = (OsmDataLayer) e.getAddedLayer();
+                osmDataLayer.addLayerStateChangeListener(updateTitleOnLayerStateChange);
+            }
+            e.getAddedLayer().addPropertyChangeListener(updateTitleOnSaveChange);
+        }
+
+        @Override
+        public void layerRemoving(LayerRemoveEvent e) {
+            if (e.getRemovedLayer() instanceof OsmDataLayer) {
+                OsmDataLayer osmDataLayer = (OsmDataLayer) e.getRemovedLayer();
+                osmDataLayer.removeLayerStateChangeListener(updateTitleOnLayerStateChange);
+            }
+            e.getRemovedLayer().removePropertyChangeListener(updateTitleOnSaveChange);
+        }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // not used
+        }
+    }
+
+    private class WindowPositionSizeListener extends WindowAdapter implements ComponentListener {
+        @Override
+        public void windowStateChanged(WindowEvent e) {
+            windowState = e.getNewState();
+        }
+
+        @Override
+        public void componentHidden(ComponentEvent e) {
+            // Do nothing
+        }
+
+        @Override
+        public void componentMoved(ComponentEvent e) {
+            handleComponentEvent(e);
+        }
+
+        @Override
+        public void componentResized(ComponentEvent e) {
+            handleComponentEvent(e);
+        }
+
+        @Override
+        public void componentShown(ComponentEvent e) {
+            // Do nothing
+        }
+
+        private void handleComponentEvent(ComponentEvent e) {
+            Component c = e.getComponent();
+            if (c instanceof JFrame && c.isVisible()) {
+                if (windowState == JFrame.NORMAL) {
+                    geometry = new WindowGeometry((JFrame) c);
+                } else {
+                    geometry.fixScreen((JFrame) c);
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index 15115e1..cd9f8b4 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -116,7 +116,8 @@ import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.gui.dialogs.MenuItemSearchDialog;
 import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.mappaint.MapPaintMenu;
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
@@ -632,9 +633,10 @@ public class MainMenu extends JMenuBar {
     }
 
     /**
-     * Constructs a new {@code MainMenu}.
+     * Initialize the main menu.
+     * @since 10340
      */
-    public MainMenu() {
+    public void initialize() {
         moreToolsMenu.setVisible(false);
         dataMenu.setVisible(false);
         gpsMenu.setVisible(false);
@@ -820,7 +822,7 @@ public class MainMenu extends JMenuBar {
 
         windowMenu.addMenuListener(menuSeparatorHandler);
 
-        new PresetsMenuEnabler(presetsMenu).refreshEnabled();
+        new PresetsMenuEnabler(presetsMenu);
     }
 
     /**
@@ -884,35 +886,17 @@ public class MainMenu extends JMenuBar {
         }
     }
 
-    static class PresetsMenuEnabler implements MapView.LayerChangeListener {
+    static class PresetsMenuEnabler implements ActiveLayerChangeListener {
         private final JMenu presetsMenu;
 
         PresetsMenuEnabler(JMenu presetsMenu) {
-            MapView.addLayerChangeListener(this);
             this.presetsMenu = presetsMenu;
-        }
-
-        /**
-         * Refreshes the enabled state
-         */
-        protected void refreshEnabled() {
-            presetsMenu.setEnabled(Main.main.hasEditLayer());
-        }
-
-        @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-            refreshEnabled();
+            Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
         }
 
         @Override
-        public void layerAdded(Layer newLayer) {
-            refreshEnabled();
-        }
-
-        @Override
-        public void layerRemoved(Layer oldLayer) {
-            refreshEnabled();
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            presetsMenu.setEnabled(e.getSource().getEditLayer() != null);
         }
     }
-
 }
diff --git a/src/org/openstreetmap/josm/gui/MainPanel.java b/src/org/openstreetmap/josm/gui/MainPanel.java
new file mode 100644
index 0000000..f7ffd64
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/MainPanel.java
@@ -0,0 +1,172 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import java.awt.BorderLayout;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.mapmode.MapMode;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityListener;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+
+/**
+ * This is the content panel inside the {@link MainFrame}. It displays the content the user is working with.
+ * <p>
+ * If there is no active layer, there is no content displayed. As soon as there are active layers, the {@link MapFrame} is displayed.
+ *
+ * @author Michael Zangl
+ * @since 10432
+ */
+public class MainPanel extends JPanel {
+    private MapFrame map;
+    // Needs to be lazy because we need to wait for preferences to set up.
+    private GettingStarted gettingStarted;
+    private final CopyOnWriteArrayList<MapFrameListener> mapFrameListeners = new CopyOnWriteArrayList<>();
+    private final transient MainLayerManager layerManager;
+
+    /**
+     * Create a new main panel
+     * @param layerManager The layer manager to use to display the content.
+     */
+    public MainPanel(MainLayerManager layerManager) {
+        super(new BorderLayout());
+        this.layerManager = layerManager;
+    }
+
+    /**
+     * Update the content of this {@link MainFrame} to either display the map or display the welcome screen.
+     * @param showMap If the map should be displayed.
+     */
+    protected void updateContent(boolean showMap) {
+        GuiHelper.assertCallFromEdt();
+        MapFrame old = map;
+        if (old != null && showMap) {
+            // no state change
+            return;
+        }
+
+        // remove old content
+        setVisible(false);
+        removeAll();
+        if (old != null) {
+            old.destroy();
+        }
+
+        // create new content
+        if (showMap) {
+            map = createNewMapFrame();
+        } else {
+            map = null;
+            Main.map = map;
+            add(getGettingStarted(), BorderLayout.CENTER);
+        }
+        setVisible(true);
+
+        if (old == null && !showMap) {
+            // listeners may not be able to handle this...
+            return;
+        }
+
+        // Notify map frame listeners, mostly plugins.
+        for (MapFrameListener listener : mapFrameListeners) {
+            MapView.fireDeprecatedListenerOnAdd = true;
+            listener.mapFrameInitialized(old, map);
+            MapView.fireDeprecatedListenerOnAdd = false;
+        }
+        if (map == null && Main.currentProgressMonitor != null) {
+            Main.currentProgressMonitor.showForegroundDialog();
+        }
+    }
+
+    private MapFrame createNewMapFrame() {
+        MapFrame mapFrame = new MapFrame(null, null);
+        // Required by many components.
+        Main.map = mapFrame;
+
+        mapFrame.fillPanel(this);
+
+        //TODO: Move this to some better place
+        List<Layer> layers = Main.getLayerManager().getLayers();
+        if (!layers.isEmpty()) {
+            mapFrame.selectMapMode((MapMode) mapFrame.getDefaultButtonAction(), layers.get(0));
+        }
+        mapFrame.initializeDialogsPane();
+        mapFrame.setVisible(true);
+        return mapFrame;
+    }
+
+    /**
+     * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes.
+     * <p>
+     * It will fire an initial mapFrameInitialized event
+     * when the MapFrame is present. Otherwise will only fire when the MapFrame is created
+     * or destroyed.
+     * @param listener The MapFrameListener
+     * @return {@code true} if the listeners collection changed as a result of the call.
+     */
+    public boolean addAndFireMapFrameListener(MapFrameListener listener) {
+        boolean changed = addMapFrameListener(listener);
+        if (changed && map != null) {
+            listener.mapFrameInitialized(null, map);
+        }
+        return changed;
+    }
+
+    /**
+     * Registers a new {@code MapFrameListener} that will be notified of MapFrame changes
+     * @param listener The MapFrameListener
+     * @return {@code true} if the listeners collection changed as a result of the call
+     */
+    public boolean addMapFrameListener(MapFrameListener listener) {
+        return listener != null && mapFrameListeners.add(listener);
+    }
+
+    /**
+     * Unregisters the given {@code MapFrameListener} from MapFrame changes
+     * @param listener The MapFrameListener
+     * @return {@code true} if the listeners collection changed as a result of the call
+     */
+    public boolean removeMapFrameListener(MapFrameListener listener) {
+        return listener != null && mapFrameListeners.remove(listener);
+    }
+
+    /**
+     * Gets the {@link GettingStarted} panel.
+     * @return The panel.
+     */
+    public GettingStarted getGettingStarted() {
+        if (gettingStarted == null) {
+            gettingStarted = new GettingStarted();
+        }
+        return gettingStarted;
+    }
+
+    /**
+     * Re-adds the layer listeners. Never call this in production, only needed for testing.
+     */
+    public void reAddListeners() {
+        layerManager.addLayerAvailabilityListener(new LayerAvailabilityListener() {
+            @Override
+            public void beforeFirstLayerAdded(LayerAvailabilityEvent e) {
+                updateContent(true);
+            }
+
+            @Override
+            public void afterLastLayerRemoved(LayerAvailabilityEvent e) {
+                updateContent(false);
+            }
+        });
+        GuiHelper.runInEDTAndWait(new Runnable() {
+            @Override
+            public void run() {
+                updateContent(!layerManager.getLayers().isEmpty());
+            }
+        });
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/MapFrame.java b/src/org/openstreetmap/josm/gui/MapFrame.java
index 6c0e557..e3ab5cc 100644
--- a/src/org/openstreetmap/josm/gui/MapFrame.java
+++ b/src/org/openstreetmap/josm/gui/MapFrame.java
@@ -37,7 +37,6 @@ import javax.swing.JPopupMenu;
 import javax.swing.JSplitPane;
 import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 import javax.swing.event.PopupMenuEvent;
 import javax.swing.event.PopupMenuListener;
@@ -58,7 +57,6 @@ import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.ViewportData;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.ChangesetDialog;
 import org.openstreetmap.josm.gui.dialogs.CommandStackDialog;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
@@ -76,6 +74,12 @@ import org.openstreetmap.josm.gui.dialogs.ValidatorDialog;
 import org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.LayerManager;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.AdvancedKeyPressDetector;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -89,7 +93,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * @author imi
  */
-public class MapFrame extends JPanel implements Destroyable, LayerChangeListener {
+public class MapFrame extends JPanel implements Destroyable, ActiveLayerChangeListener, LayerChangeListener {
 
     /**
      * The current mode, this frame operates.
@@ -183,8 +187,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
     /**
      * Constructs a new {@code MapFrame}.
-     * @param contentPane The content pane used to register shortcuts in its
-     * {@link javax.swing.InputMap} and {@link javax.swing.ActionMap}
+     * @param contentPane Ignored. Main content pane is used.
      * @param viewportData the initial viewport of the map. Can be null, then
      * the viewport is derived from the layer data.
      */
@@ -284,7 +287,8 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
         // status line below the map
         statusLine = new MapStatus(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
 
         boolean unregisterTab = Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null;
         if (unregisterTab) {
@@ -328,7 +332,8 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
      */
     @Override
     public void destroy() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         dialogsPanel.destroy();
         Main.pref.removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);
         for (int i = 0; i < toolBarActions.getComponentCount(); ++i) {
@@ -416,7 +421,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
      * @return {@code true} if mode is really selected
      */
     public boolean selectMapMode(MapMode newMapMode) {
-        return selectMapMode(newMapMode, mapView.getActiveLayer());
+        return selectMapMode(newMapMode, mapView.getLayerManager().getActiveLayer());
     }
 
     /**
@@ -592,7 +597,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
         }
 
         public void setButton(JButton button) {
-            this.button =  button;
+            this.button = button;
             final ImageIcon icon = ImageProvider.get("audio-fwd");
             putValue(SMALL_ICON, icon);
             button.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight() + 64));
@@ -756,8 +761,9 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         boolean modeChanged = false;
+        Layer newLayer = e.getSource().getActiveLayer();
         if (mapMode == null || !mapMode.layerIsSupported(newLayer)) {
             MapMode newMapMode = getLastMapMode(newLayer);
             modeChanged = newMapMode != mapMode;
@@ -770,7 +776,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
             }
         }
         // if this is really a change (and not the first active layer)
-        if (oldLayer != null) {
+        if (e.getPreviousActiveLayer() != null) {
             if (!modeChanged && mapMode != null) {
                 // Let mapmodes know about new active layer
                 mapMode.exitMode();
@@ -782,11 +788,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
         // After all listeners notice new layer, some buttons will be disabled/enabled
         // and possibly need to be hidden/shown.
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override public void run() {
-                validateToolBarsVisibility();
-            }
-        });
+        validateToolBarsVisibility();
     }
 
     private MapMode getLastMapMode(Layer newLayer) {
@@ -802,12 +804,18 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
+    public void layerAdded(LayerAddEvent e) {
+        // ignored
+    }
+
+    @Override
+    public void layerRemoving(LayerRemoveEvent e) {
+        lastMapMode.remove(e.getRemovedLayer());
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        lastMapMode.remove(oldLayer);
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
     }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/MapMover.java b/src/org/openstreetmap/josm/gui/MapMover.java
index 377580f..0905833 100644
--- a/src/org/openstreetmap/josm/gui/MapMover.java
+++ b/src/org/openstreetmap/josm/gui/MapMover.java
@@ -10,13 +10,10 @@ import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseWheelEvent;
+import java.util.ArrayList;
 
 import javax.swing.AbstractAction;
-import javax.swing.ActionMap;
-import javax.swing.InputMap;
-import javax.swing.JComponent;
 import javax.swing.JPanel;
-import javax.swing.KeyStroke;
 
 import org.openstreetmap.gui.jmapviewer.JMapViewer;
 import org.openstreetmap.josm.Main;
@@ -26,6 +23,7 @@ import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.tools.Destroyable;
+import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -63,7 +61,12 @@ public class MapMover extends MouseAdapter implements Destroyable {
         private final String action;
 
         ZoomerAction(String action) {
+            this(action, "MapMover.Zoomer." + action);
+        }
+
+        ZoomerAction(String action, String name) {
             this.action = action;
+            putValue(NAME, name);
         }
 
         @Override
@@ -106,62 +109,48 @@ public class MapMover extends MouseAdapter implements Destroyable {
      * The map to move around.
      */
     private final NavigatableComponent nc;
-    private final JPanel contentPane;
 
     private boolean movementInPlace;
 
+    private final ArrayList<Pair<ZoomerAction, Shortcut>> registeredShortcuts = new ArrayList<>();
+
     /**
      * Constructs a new {@code MapMover}.
      * @param navComp the navigatable component
-     * @param contentPane the content pane
+     * @param contentPane Ignored. The main action map is used.
      */
     public MapMover(NavigatableComponent navComp, JPanel contentPane) {
         this.nc = navComp;
-        this.contentPane = contentPane;
         nc.addMouseListener(this);
         nc.addMouseMotionListener(this);
         nc.addMouseWheelListener(this);
 
-        if (contentPane != null) {
-            // CHECKSTYLE.OFF: LineLength
-            contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                Shortcut.registerShortcut("system:movefocusright", tr("Map: {0}", tr("Move right")), KeyEvent.VK_RIGHT, Shortcut.CTRL).getKeyStroke(),
-                "MapMover.Zoomer.right");
-            contentPane.getActionMap().put("MapMover.Zoomer.right", new ZoomerAction("right"));
-
-            contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                Shortcut.registerShortcut("system:movefocusleft", tr("Map: {0}", tr("Move left")), KeyEvent.VK_LEFT, Shortcut.CTRL).getKeyStroke(),
-                "MapMover.Zoomer.left");
-            contentPane.getActionMap().put("MapMover.Zoomer.left", new ZoomerAction("left"));
-
-            contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                Shortcut.registerShortcut("system:movefocusup", tr("Map: {0}", tr("Move up")), KeyEvent.VK_UP, Shortcut.CTRL).getKeyStroke(),
-                "MapMover.Zoomer.up");
-            contentPane.getActionMap().put("MapMover.Zoomer.up", new ZoomerAction("up"));
-
-            contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                Shortcut.registerShortcut("system:movefocusdown", tr("Map: {0}", tr("Move down")), KeyEvent.VK_DOWN, Shortcut.CTRL).getKeyStroke(),
-                "MapMover.Zoomer.down");
-            contentPane.getActionMap().put("MapMover.Zoomer.down", new ZoomerAction("down"));
-            // CHECKSTYLE.ON: LineLength
-
-            // see #10592 - Disable these alternate shortcuts on OS X because of conflict with system shortcut
-            if (!Main.isPlatformOsx()) {
-                contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                    Shortcut.registerShortcut("view:zoominalternate",
-                            tr("Map: {0}", tr("Zoom in")), KeyEvent.VK_COMMA, Shortcut.CTRL).getKeyStroke(),
-                    "MapMover.Zoomer.in");
-                contentPane.getActionMap().put("MapMover.Zoomer.in", new ZoomerAction(","));
-
-                contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
-                    Shortcut.registerShortcut("view:zoomoutalternate",
-                            tr("Map: {0}", tr("Zoom out")), KeyEvent.VK_PERIOD, Shortcut.CTRL).getKeyStroke(),
-                    "MapMover.Zoomer.out");
-                contentPane.getActionMap().put("MapMover.Zoomer.out", new ZoomerAction("."));
-            }
+        registerActionShortcut(new ZoomerAction("right"),
+                Shortcut.registerShortcut("system:movefocusright", tr("Map: {0}", tr("Move right")), KeyEvent.VK_RIGHT, Shortcut.CTRL));
+
+        registerActionShortcut(new ZoomerAction("left"),
+                Shortcut.registerShortcut("system:movefocusleft", tr("Map: {0}", tr("Move left")), KeyEvent.VK_LEFT, Shortcut.CTRL));
+
+        registerActionShortcut(new ZoomerAction("up"),
+                Shortcut.registerShortcut("system:movefocusup", tr("Map: {0}", tr("Move up")), KeyEvent.VK_UP, Shortcut.CTRL));
+        registerActionShortcut(new ZoomerAction("down"),
+                Shortcut.registerShortcut("system:movefocusdown", tr("Map: {0}", tr("Move down")), KeyEvent.VK_DOWN, Shortcut.CTRL));
+
+        // see #10592 - Disable these alternate shortcuts on OS X because of conflict with system shortcut
+        if (!Main.isPlatformOsx()) {
+            registerActionShortcut(new ZoomerAction(",", "MapMover.Zoomer.in"),
+                    Shortcut.registerShortcut("view:zoominalternate", tr("Map: {0}", tr("Zoom in")), KeyEvent.VK_COMMA, Shortcut.CTRL));
+
+            registerActionShortcut(new ZoomerAction(".", "MapMover.Zoomer.out"),
+                    Shortcut.registerShortcut("view:zoomoutalternate", tr("Map: {0}", tr("Zoom out")), KeyEvent.VK_PERIOD, Shortcut.CTRL));
         }
     }
 
+    private void registerActionShortcut(ZoomerAction action, Shortcut shortcut) {
+        Main.registerActionShortcut(action, shortcut);
+        registeredShortcuts.add(new Pair<>(action, shortcut));
+    }
+
     /**
      * If the right (and only the right) mouse button is pressed, move the map.
      */
@@ -269,26 +258,8 @@ public class MapMover extends MouseAdapter implements Destroyable {
 
     @Override
     public void destroy() {
-        if (this.contentPane != null) {
-            InputMap inputMap = contentPane.getInputMap();
-            KeyStroke[] inputKeys = inputMap.keys();
-            if (inputKeys != null) {
-                for (KeyStroke key : inputKeys) {
-                    Object binding = inputMap.get(key);
-                    if (binding instanceof String && ((String) binding).startsWith("MapMover.")) {
-                        inputMap.remove(key);
-                    }
-                }
-            }
-            ActionMap actionMap = contentPane.getActionMap();
-            Object[] actionsKeys = actionMap.keys();
-            if (actionsKeys != null) {
-                for (Object key : actionsKeys) {
-                    if (key instanceof String && ((String) key).startsWith("MapMover.")) {
-                        actionMap.remove(key);
-                    }
-                }
-            }
+        for (Pair<ZoomerAction, Shortcut> shortcut : registeredShortcuts) {
+            Main.unregisterActionShortcut(shortcut.a, shortcut.b);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/MapScaler.java b/src/org/openstreetmap/josm/gui/MapScaler.java
index a52e163..4ec3b0a 100644
--- a/src/org/openstreetmap/josm/gui/MapScaler.java
+++ b/src/org/openstreetmap/josm/gui/MapScaler.java
@@ -113,7 +113,7 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
          */
         private final double spacingMeter;
         private final int steps;
-        private final int majorStepEvery;
+        private final int minorStepsPerMajor;
 
         /**
          * Creates a new tick mark helper.
@@ -126,26 +126,44 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
 
             double log10 = Math.log(lineDistance) / Math.log(10);
             double spacingLog10 = Math.pow(10, Math.floor(log10));
+            int minorStepsPerMajor;
+            double distanceBetweenMinor;
             if (log10 - Math.floor(log10) < .75) {
-                spacingMeter = spacingLog10 / 4;
-                majorStepEvery = 4;
+                // Add 2 ticks for every full unit
+                distanceBetweenMinor = spacingLog10 / 2;
+                minorStepsPerMajor = 2;
             } else {
-                spacingMeter = spacingLog10;
-                majorStepEvery = 5;
+                // Add 10 ticks for every full unit
+                distanceBetweenMinor = spacingLog10;
+                minorStepsPerMajor = 5;
             }
-            steps = (int) Math.floor(lineDistance / spacingMeter);
+            // round down to the last major step.
+            int majorSteps = (int) Math.floor(lineDistance / distanceBetweenMinor / minorStepsPerMajor);
+            if (majorSteps >= 4) {
+                // we have many major steps, do not paint the minor now.
+                this.spacingMeter = distanceBetweenMinor * minorStepsPerMajor;
+                this.minorStepsPerMajor = 1;
+            } else {
+                this.minorStepsPerMajor = minorStepsPerMajor;
+                this.spacingMeter = distanceBetweenMinor;
+            }
+            steps = majorSteps * this.minorStepsPerMajor;
         }
 
+        /**
+         * Paint the ticks to the graphics.
+         * @param g The graphics to paint on.
+         */
         public void paintTicks(Graphics g) {
             double spacingPixel = spacingMeter / (dist100Pixel / 100);
             double textBlockedUntil = -1;
             for (int step = 0; step <= steps; step++) {
                 int x = (int) (PADDING_LEFT + spacingPixel * step);
-                boolean isMajor = step % majorStepEvery == 0;
+                boolean isMajor = step % minorStepsPerMajor == 0;
                 int paddingY = isMajor ? 0 : 3;
                 g.drawLine(x, paddingY, x, 10 - paddingY);
 
-                if (isMajor || (step == steps && textBlockedUntil < 0)) {
+                if (step == 0 || step == steps) {
                     String text;
                     if (step == 0) {
                         text = "0";
@@ -154,10 +172,11 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
                     }
                     Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
                     int left = (int) (x - bound.getWidth() / 2);
-                    if (textBlockedUntil < left) {
-                        g.drawString(text, left, 23);
-                        textBlockedUntil = left + bound.getWidth() + 2;
+                    if (textBlockedUntil > left) {
+                        left = (int) (textBlockedUntil + 5);
                     }
+                    g.drawString(text, left, 23);
+                    textBlockedUntil = left + bound.getWidth() + 2;
                 }
             }
             g.drawLine(PADDING_LEFT + 0, 5, (int) (PADDING_LEFT + spacingPixel * steps), 5);
diff --git a/src/org/openstreetmap/josm/gui/MapStatus.java b/src/org/openstreetmap/josm/gui/MapStatus.java
index c46580e..7f7ab79 100644
--- a/src/org/openstreetmap/josm/gui/MapStatus.java
+++ b/src/org/openstreetmap/josm/gui/MapStatus.java
@@ -267,12 +267,11 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
                 // The popup != null check is required because a left-click produces several events as well,
                 // which would make this variable true. Of course we only want the popup to show
                 // if the middle mouse button has been pressed in the first place
-                boolean mouseNotMoved = oldMousePos != null
-                        && oldMousePos.equals(ms.mousePos);
+                boolean mouseNotMoved = oldMousePos != null && oldMousePos.equals(ms.mousePos);
                 boolean isAtOldPosition = mouseNotMoved && popup != null;
                 boolean middleMouseDown = (ms.modifiers & MouseEvent.BUTTON2_DOWN_MASK) != 0;
                 try {
-                    ds = mv.getCurrentDataSet();
+                    ds = mv.getLayerManager().getEditDataSet();
                     if (ds != null) {
                         // This is not perfect, if current dataset was changed during execution, the lock would be useless
                         if (isAtOldPosition && middleMouseDown) {
@@ -386,7 +385,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
                             return; // exit, if new parent.
 
                         // Do nothing, if required data is missing
-                        if (ms.mousePos == null || mv.center == null) {
+                        if (ms.mousePos == null || mv.getCenter() == null) {
                             continue;
                         }
 
@@ -461,7 +460,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
          * @param mods modifiers (i.e. control keys)
          */
         private void popupCycleSelection(Collection<OsmPrimitive> osms, int mods) {
-            DataSet ds = Main.main.getCurrentDataSet();
+            DataSet ds = Main.getLayerManager().getEditDataSet();
             // Find some items that are required for cycling through
             OsmPrimitive firstItem = null;
             OsmPrimitive firstSelected = null;
@@ -565,7 +564,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
          * @param osm The primitive to derive the colors from
          */
         private void popupSetLabelColors(JLabel lbl, OsmPrimitive osm) {
-            DataSet ds = Main.main.getCurrentDataSet();
+            DataSet ds = Main.getLayerManager().getEditDataSet();
             if (ds.isSelected(osm)) {
                 lbl.setBackground(SystemColor.textHighlight);
                 lbl.setForeground(SystemColor.textHighlightText);
@@ -637,7 +636,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
 
                 @Override
                 public void mouseClicked(MouseEvent e) {
-                    DataSet ds = Main.main.getCurrentDataSet();
+                    DataSet ds = Main.getLayerManager().getEditDataSet();
                     // Let the user toggle the selection
                     ds.toggleSelected(osm);
                     l.validate();
@@ -867,7 +866,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
 
             @Override
             public void mouseMoved(MouseEvent e) {
-                if (mv.center == null)
+                if (mv.getCenter() == null)
                     return;
                 // Do not update the view if ctrl is pressed.
                 if ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) == 0) {
@@ -1003,7 +1002,7 @@ public final class MapStatus extends JPanel implements Helpful, Destroyable, Pre
         setHelpText(null, t);
     }
 
-    public void setHelpText(Object id, final String text)  {
+    public void setHelpText(Object id, final String text) {
 
         StatusTextHistory entry = new StatusTextHistory(id, text);
 
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index d32dc94..da3079e 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -25,16 +25,14 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractButton;
-import javax.swing.ActionMap;
-import javax.swing.InputMap;
 import javax.swing.JComponent;
-import javax.swing.JFrame;
 import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
@@ -42,6 +40,7 @@ import org.openstreetmap.josm.actions.mapmode.MapMode;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.ViewportData;
 import org.openstreetmap.josm.data.coor.EastNorth;
@@ -52,6 +51,7 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
 import org.openstreetmap.josm.data.osm.visitor.paint.Rendering;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
+import org.openstreetmap.josm.gui.MapViewState.MapViewRectangle;
 import org.openstreetmap.josm.gui.layer.AbstractMapViewPaintable;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
@@ -63,14 +63,15 @@ import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.MapViewGraphics;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
+import org.openstreetmap.josm.gui.layer.MapViewPaintable.LayerPainter;
+import org.openstreetmap.josm.gui.layer.MapViewPaintable.MapViewEvent;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationEvent;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
-import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.PlayHeadMarker;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.AudioPlayer;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
@@ -90,7 +91,7 @@ import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
  * @author imi
  */
 public class MapView extends NavigatableComponent
-implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.LayerStateChangeListener,
+implements PropertyChangeListener, PreferenceChangedListener,
 LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     /**
      * Interface to notify listeners of a layer change.
@@ -317,6 +318,33 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     }
 
     /**
+     * A layer painter that issues a warning when being called.
+     * @author Michael Zangl
+     * @since 10474
+     */
+    private static class WarningLayerPainter implements LayerPainter {
+        boolean warningPrinted = false;
+        private Layer layer;
+
+        WarningLayerPainter(Layer layer) {
+            this.layer = layer;
+        }
+
+        @Override
+        public void paint(MapViewGraphics graphics) {
+            if (!warningPrinted) {
+                Main.debug("A layer triggered a repaint while being added: " + layer);
+                warningPrinted = true;
+            }
+        }
+
+        @Override
+        public void detachFromMapView(MapViewEvent event) {
+            // ignored
+        }
+    }
+
+    /**
      * Removes a layer change listener
      * <p>
      * To be removed: end of 2016.
@@ -375,7 +403,11 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
      */
     @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener) {
-        addLayerChangeListener(listener, false);
+        if (fireDeprecatedListenerOnAdd) {
+            Main.warn("Plugin seems to be adding listener during mapFrameInitialized(): " + BugReport.getCallingMethod(2)
+            + ". Layer listeners should be set on plugin load.");
+        }
+        addLayerChangeListener(listener, fireDeprecatedListenerOnAdd);
     }
 
     /**
@@ -391,11 +423,15 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener, boolean initialFire) {
         if (listener != null) {
-            initialFire = initialFire && Main.isDisplayingMapView();
+            initialFire = initialFire && (Main.isDisplayingMapView() || fireDeprecatedListenerOnAdd);
 
             LayerChangeAdapter adapter = new LayerChangeAdapter(listener, initialFire);
-            Main.getLayerManager().addLayerChangeListener(adapter, false);
-            Main.getLayerManager().addActiveLayerChangeListener(adapter, initialFire);
+            Main.getLayerManager().addLayerChangeListener(adapter, initialFire);
+            if (initialFire) {
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(adapter);
+            } else {
+                Main.getLayerManager().addActiveLayerChangeListener(adapter);
+            }
             adapter.receiveOneInitialFire = false;
         }
     }
@@ -413,8 +449,12 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     @Deprecated
     public static void addEditLayerChangeListener(EditLayerChangeListener listener, boolean initialFire) {
         if (listener != null) {
-            Main.getLayerManager().addActiveLayerChangeListener(new EditLayerChangeAdapter(listener),
-                    initialFire && Main.isDisplayingMapView() && Main.map.mapView.getEditLayer() != null);
+            boolean doFire = initialFire && Main.isDisplayingMapView() && Main.getLayerManager().getEditLayer() != null;
+            if (doFire) {
+                Main.getLayerManager().addAndFireActiveLayerChangeListener(new EditLayerChangeAdapter(listener));
+            } else {
+                Main.getLayerManager().addActiveLayerChangeListener(new EditLayerChangeAdapter(listener));
+            }
         }
     }
 
@@ -431,6 +471,16 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
         addEditLayerChangeListener(listener, false);
     }
 
+
+    /**
+     * Temporary. To be removed as soon as the {@link LayerChangeListener}s are removed.
+     * <p>
+     * Some plugins add their listeners in {@link Main#setMapFrame(MapFrame)}. This method is now called just after the first layer was added to
+     * the layer manager. So that listener would not receive the addition of the first layer. As long as this field is set, we fake an add call
+     * to that listener when it is added to immitate the old behaviour. You should not access it from anywhere else.
+     */
+    public static boolean fireDeprecatedListenerOnAdd;
+
     public boolean viewportFollowing;
 
     /**
@@ -471,10 +521,14 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     private final LayerInvalidatedListener invalidatedListener = new LayerInvalidatedListener();
 
     /**
+     * This is a map of all Layers that have been added to this view.
+     */
+    private final HashMap<Layer, LayerPainter> registeredLayers = new HashMap<>();
+
+    /**
      * Constructs a new {@code MapView}.
      * @param layerManager The layers to display.
-     * @param contentPane The content pane used to register shortcuts in its
-     * {@link InputMap} and {@link ActionMap}
+     * @param contentPane Ignored. Main content pane is used.
      * @param viewportData the initial viewport of the map. Can be null, then
      * the viewport is derived from the layer data.
      * @since 10279
@@ -482,8 +536,8 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     public MapView(MainLayerManager layerManager, final JPanel contentPane, final ViewportData viewportData) {
         this.layerManager = layerManager;
         initialViewport = viewportData;
-        layerManager.addLayerChangeListener(this);
-        layerManager.addActiveLayerChangeListener(this, false);
+        layerManager.addLayerChangeListener(this, true);
+        layerManager.addActiveLayerChangeListener(this);
         Main.pref.addPreferenceChangeListener(this);
 
         addComponentListener(new ComponentAdapter() {
@@ -556,7 +610,7 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
      */
     public void rememberLastPositionOnScreen() {
         oldSize = getSize();
-        oldLoc  = getLocationOnScreen();
+        oldLoc = getLocationOnScreen();
     }
 
     /**
@@ -573,27 +627,37 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
 
     @Override
     public void layerAdded(LayerAddEvent e) {
-        Layer layer = e.getAddedLayer();
-        if (layer instanceof MarkerLayer && playHeadMarker == null) {
-            playHeadMarker = PlayHeadMarker.create();
-        }
+        try {
+            Layer layer = e.getAddedLayer();
+            registeredLayers.put(layer, new WarningLayerPainter(layer));
+            // Layers may trigger a redraw during this call if they open dialogs.
+            LayerPainter painter = layer.attachToMapView(new MapViewEvent(this, false));
+            if (!registeredLayers.containsKey(layer)) {
+                // The layer may have removed itself during attachToMapView()
+                Main.warn("Layer was removed during attachToMapView()");
+            } else {
+                registeredLayers.put(layer, painter);
 
-        boolean isOsmDataLayer = layer instanceof OsmDataLayer;
-        if (isOsmDataLayer) {
-            ((OsmDataLayer) layer).addLayerStateChangeListener(this);
-        }
+                ProjectionBounds viewProjectionBounds = layer.getViewProjectionBounds();
+                if (viewProjectionBounds != null) {
+                    scheduleZoomTo(new ViewportData(viewProjectionBounds));
+                }
 
-        layer.addPropertyChangeListener(this);
-        Main.addProjectionChangeListener(layer);
-        invalidatedListener.addTo(layer);
-        AudioPlayer.reset();
+                layer.addPropertyChangeListener(this);
+                Main.addProjectionChangeListener(layer);
+                invalidatedListener.addTo(layer);
+                AudioPlayer.reset();
 
-        repaint();
+                repaint();
+            }
+        } catch (RuntimeException t) {
+            throw BugReport.intercept(t).put("layer", e.getAddedLayer());
+        }
     }
 
     /**
      * Returns current data set. To be removed: end of 2016.
-     * @deprecated Use {@link Main#getLayerManager()} instead.
+     * @deprecated Use {@link #getLayerManager()}.getEditDataSet() instead.
      */
     @Override
     @Deprecated
@@ -665,10 +729,13 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     @Override
     public void layerRemoving(LayerRemoveEvent e) {
         Layer layer = e.getRemovedLayer();
-        if (layer instanceof OsmDataLayer) {
-            ((OsmDataLayer) layer).removeLayerPropertyChangeListener(this);
-        }
 
+        LayerPainter painter = registeredLayers.remove(layer);
+        if (painter == null) {
+            Main.error("The painter for layer " + layer + " was not registered.");
+            return;
+        }
+        painter.detachFromMapView(new MapViewEvent(this, false));
         Main.removeProjectionChangeListener(layer);
         layer.removePropertyChangeListener(this);
         invalidatedListener.removeFrom(layer);
@@ -749,12 +816,20 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
 
     private void paintLayer(Layer layer, Graphics2D g, Bounds box) {
         try {
+            LayerPainter painter = registeredLayers.get(layer);
+            if (painter == null) {
+                throw new IllegalArgumentException("Cannot paint layer, it is not registered.");
+            }
+            MapViewRectangle clipBounds = getState().getViewArea(g.getClipBounds());
+            MapViewGraphics paintGraphics = new MapViewGraphics(this, g, clipBounds);
+
             if (layer.getOpacity() < 1) {
                 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) layer.getOpacity()));
             }
-            layer.paint(g, this, box);
+            painter.paint(paintGraphics);
             g.setPaintMode();
         } catch (RuntimeException t) {
+            //TODO: only display.
             throw BugReport.intercept(t).put("layer", layer).put("bounds", box);
         }
     }
@@ -936,6 +1011,7 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
      * @return <code>true</code> if the view can be drawn, <code>false</code> otherwise.
      */
     public boolean prepareToDraw() {
+        updateLocationState();
         if (initialViewport != null) {
             zoomTo(initialViewport);
             initialViewport = null;
@@ -948,7 +1024,7 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
 
         // if the position was remembered, we need to adjust center once before repainting
         if (oldLoc != null && oldSize != null) {
-            Point l1  = getLocationOnScreen();
+            Point l1 = getLocationOnScreen();
             final EastNorth newCenter = new EastNorth(
                     getCenter().getX()+ (l1.x-oldLoc.x - (oldSize.width-getWidth())/2.0)*getScale(),
                     getCenter().getY()+ (oldLoc.y-l1.y + (oldSize.height-getHeight())/2.0)*getScale()
@@ -1053,26 +1129,24 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
 
     @Override
     public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
-        /* This only makes the buttons look disabled. Disabling the actions as well requires
-         * the user to re-select the tool after i.e. moving a layer. While testing I found
-         * that I switch layers and actions at the same time and it was annoying to mind the
-         * order. This way it works as visual clue for new users */
-        for (final AbstractButton b: Main.map.allMapModeButtons) {
-            MapMode mode = (MapMode) b.getAction();
-            final boolean activeLayerSupported = mode.layerIsSupported(layerManager.getActiveLayer());
-            if (activeLayerSupported) {
-                Main.registerActionShortcut(mode, mode.getShortcut()); //fix #6876
-            } else {
-                Main.unregisterShortcut(mode.getShortcut());
-            }
-            GuiHelper.runInEDTAndWait(new Runnable() {
-                @Override public void run() {
-                    b.setEnabled(activeLayerSupported);
+        if (Main.map != null) {
+            /* This only makes the buttons look disabled. Disabling the actions as well requires
+             * the user to re-select the tool after i.e. moving a layer. While testing I found
+             * that I switch layers and actions at the same time and it was annoying to mind the
+             * order. This way it works as visual clue for new users */
+            // FIXME: This does not belong here.
+            for (final AbstractButton b: Main.map.allMapModeButtons) {
+                MapMode mode = (MapMode) b.getAction();
+                final boolean activeLayerSupported = mode.layerIsSupported(layerManager.getActiveLayer());
+                if (activeLayerSupported) {
+                    Main.registerActionShortcut(mode, mode.getShortcut()); //fix #6876
+                } else {
+                    Main.unregisterShortcut(mode.getShortcut());
                 }
-            });
+                b.setEnabled(activeLayerSupported);
+            }
         }
         AudioPlayer.reset();
-        refreshTitle();
         repaint();
     }
 
@@ -1155,26 +1229,18 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
                 changedLayer = l;
                 repaint();
             }
-        } else if (evt.getPropertyName().equals(OsmDataLayer.REQUIRES_SAVE_TO_DISK_PROP)
-                || evt.getPropertyName().equals(OsmDataLayer.REQUIRES_UPLOAD_TO_SERVER_PROP)) {
-            OsmDataLayer layer = (OsmDataLayer) evt.getSource();
-            if (layer == getEditLayer()) {
-                refreshTitle();
-            }
         }
     }
 
     /**
      * Sets the title of the JOSM main window, adding a star if there are dirty layers.
      * @see Main#parent
+     * @deprecated Replaced by {@link MainFrame#refreshTitle()}. The {@link MainFrame} should handle this by itself.
      */
+    @Deprecated
     protected void refreshTitle() {
         if (Main.parent != null) {
-            OsmDataLayer editLayer = layerManager.getEditLayer();
-            boolean dirty = editLayer != null &&
-                    (editLayer.requiresSaveToFile() || (editLayer.requiresUploadToServer() && !editLayer.isUploadDiscouraged()));
-            ((JFrame) Main.parent).setTitle((dirty ? "* " : "") + tr("Java OpenStreetMap Editor"));
-            ((JFrame) Main.parent).getRootPane().putClientProperty("Window.documentModified", dirty);
+            ((MainFrame) Main.parent).refreshTitle();
         }
     }
 
@@ -1192,8 +1258,11 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
         }
     };
 
+    /**
+     * Destroy this map view panel. Should be called once when it is not needed any more.
+     */
     public void destroy() {
-        layerManager.removeLayerChangeListener(this);
+        layerManager.removeLayerChangeListener(this, true);
         layerManager.removeActiveLayerChangeListener(this);
         Main.pref.removePreferenceChangeListener(this);
         DataSet.removeSelectionListener(repaintSelectionChangedListener);
@@ -1205,13 +1274,7 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
         synchronized (temporaryLayers) {
             temporaryLayers.clear();
         }
-    }
-
-    @Override
-    public void uploadDiscouragedChanged(OsmDataLayer layer, boolean newValue) {
-        if (layer == layerManager.getEditLayer()) {
-            refreshTitle();
-        }
+        nonChangedLayersBuffer = null;
     }
 
     /**
@@ -1302,4 +1365,14 @@ LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     public final MainLayerManager getLayerManager() {
         return layerManager;
     }
+
+    /**
+     * Schedule a zoom to the given position on the next redraw.
+     * Temporary, may be removed without warning.
+     * @param viewportData the viewport to zoom to
+     * @since 10394
+     */
+    public void scheduleZoomTo(ViewportData viewportData) {
+        initialViewport = viewportData;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/MapViewState.java b/src/org/openstreetmap/josm/gui/MapViewState.java
new file mode 100644
index 0000000..3167680
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/MapViewState.java
@@ -0,0 +1,454 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Point2D.Double;
+
+import javax.swing.JComponent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.ProjectionBounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.download.DownloadDialog;
+
+/**
+ * This class represents a state of the {@link MapView}.
+ * @author Michael Zangl
+ * @since 10343
+ */
+public final class MapViewState {
+
+    private final Projection projection;
+
+    private final int viewWidth;
+    private final int viewHeight;
+
+    private final double scale;
+
+    /**
+     * Top left {@link EastNorth} coordinate of the view.
+     */
+    private final EastNorth topLeft;
+
+    private final Point topLeftOnScreen;
+    private final Point topLeftInWindow;
+
+    /**
+     * Create a new {@link MapViewState}
+     * @param projection The projection to use.
+     * @param viewWidth The view width
+     * @param viewHeight The view height
+     * @param scale The scale to use
+     * @param topLeft The top left corner in east/north space.
+     */
+    private MapViewState(Projection projection, int viewWidth, int viewHeight, double scale, EastNorth topLeft) {
+        this.projection = projection;
+        this.scale = scale;
+        this.topLeft = topLeft;
+
+        this.viewWidth = viewWidth;
+        this.viewHeight = viewHeight;
+        topLeftInWindow = new Point(0, 0);
+        topLeftOnScreen = new Point(0, 0);
+    }
+
+    private MapViewState(EastNorth topLeft, MapViewState mapViewState) {
+        this.projection = mapViewState.projection;
+        this.scale = mapViewState.scale;
+        this.topLeft = topLeft;
+
+        viewWidth = mapViewState.viewWidth;
+        viewHeight = mapViewState.viewHeight;
+        topLeftInWindow = mapViewState.topLeftInWindow;
+        topLeftOnScreen = mapViewState.topLeftOnScreen;
+    }
+
+    private MapViewState(double scale, MapViewState mapViewState) {
+        this.projection = mapViewState.projection;
+        this.scale = scale;
+        this.topLeft = mapViewState.topLeft;
+
+        viewWidth = mapViewState.viewWidth;
+        viewHeight = mapViewState.viewHeight;
+        topLeftInWindow = mapViewState.topLeftInWindow;
+        topLeftOnScreen = mapViewState.topLeftOnScreen;
+    }
+
+    private MapViewState(JComponent position, MapViewState mapViewState) {
+        this.projection = mapViewState.projection;
+        this.scale = mapViewState.scale;
+        this.topLeft = mapViewState.topLeft;
+
+        viewWidth = position.getWidth();
+        viewHeight = position.getHeight();
+        topLeftInWindow = new Point();
+        // better than using swing utils, since this allows us to use the mehtod if no screen is present.
+        Container component = position;
+        while (component != null) {
+            topLeftInWindow.x += component.getX();
+            topLeftInWindow.y += component.getY();
+            component = component.getParent();
+        }
+        topLeftOnScreen = position.getLocationOnScreen();
+    }
+
+    private MapViewState(Projection projection, MapViewState mapViewState) {
+        this.projection = projection;
+        this.scale = mapViewState.scale;
+        this.topLeft = mapViewState.topLeft;
+
+        viewWidth = mapViewState.viewWidth;
+        viewHeight = mapViewState.viewHeight;
+        topLeftInWindow = mapViewState.topLeftInWindow;
+        topLeftOnScreen = mapViewState.topLeftOnScreen;
+    }
+
+    /**
+     * The scale in east/north units per pixel.
+     * @return The scale.
+     */
+    public double getScale() {
+        return scale;
+    }
+
+    /**
+     * Gets the MapViewPoint representation for a position in view coordinates.
+     * @param x The x coordinate inside the view.
+     * @param y The y coordinate inside the view.
+     * @return The MapViewPoint.
+     */
+    public MapViewPoint getForView(double x, double y) {
+        return new MapViewViewPoint(x, y);
+    }
+
+    /**
+     * Gets the {@link MapViewPoint} for the given {@link EastNorth} coordinate.
+     * @param eastNorth the position.
+     * @return The point for that position.
+     */
+    public MapViewPoint getPointFor(EastNorth eastNorth) {
+        return new MapViewEastNorthPoint(eastNorth);
+    }
+
+    /**
+     * Gets a rectangle representing the whole view area.
+     * @return The rectangle.
+     */
+    public MapViewRectangle getViewArea() {
+        return getForView(0, 0).rectTo(getForView(viewWidth, viewHeight));
+    }
+
+    /**
+     * Gets a rectangle of the view as map view area.
+     * @param rectangle The rectangle to get.
+     * @return The view area.
+     * @since 10458
+     */
+    public MapViewRectangle getViewArea(Rectangle rectangle) {
+        return getForView(rectangle.getMinX(), rectangle.getMinY()).rectTo(getForView(rectangle.getMaxX(), rectangle.getMaxY()));
+    }
+
+    /**
+     * Gets the center of the view.
+     * @return The center position.
+     */
+    public MapViewPoint getCenter() {
+        return getForView(viewWidth / 2.0, viewHeight / 2.0);
+    }
+
+    /**
+     * Gets the width of the view on the Screen;
+     * @return The width of the view component in screen pixel.
+     */
+    public double getViewWidth() {
+        return viewWidth;
+    }
+
+    /**
+     * Gets the height of the view on the Screen;
+     * @return The height of the view component in screen pixel.
+     */
+    public double getViewHeight() {
+        return viewHeight;
+    }
+
+    /**
+     * Gets the current projection used for the MapView.
+     * @return The projection.
+     */
+    public Projection getProjection() {
+        return projection;
+    }
+
+    /**
+     * Creates an affine transform that is used to convert the east/north coordinates to view coordinates.
+     * @return The affine transform. It should not be changed.
+     * @since 10375
+     */
+    public AffineTransform getAffineTransform() {
+        return new AffineTransform(1.0 / scale, 0.0, 0.0, -1.0 / scale, -topLeft.east() / scale,
+                topLeft.north() / scale);
+    }
+
+    /**
+     * Creates a new state that is the same as the current state except for that it is using a new center.
+     * @param newCenter The new center coordinate.
+     * @return The new state.
+     * @since 10375
+     */
+    public MapViewState usingCenter(EastNorth newCenter) {
+        return movedTo(getCenter(), newCenter);
+    }
+
+    /**
+     * @param mapViewPoint The reference point.
+     * @param newEastNorthThere The east/north coordinate that should be there.
+     * @return The new state.
+     * @since 10375
+     */
+    public MapViewState movedTo(MapViewPoint mapViewPoint, EastNorth newEastNorthThere) {
+        EastNorth delta = newEastNorthThere.subtract(mapViewPoint.getEastNorth());
+        if (delta.distanceSq(0, 0) < .1e-20) {
+            return this;
+        } else {
+            return new MapViewState(topLeft.add(delta), this);
+        }
+    }
+
+    /**
+     * Creates a new state that is the same as the current state except for that it is using a new scale.
+     * @param newScale The new scale to use.
+     * @return The new state.
+     * @since 10375
+     */
+    public MapViewState usingScale(double newScale) {
+        return new MapViewState(newScale, this);
+    }
+
+    /**
+     * Creates a new state that is the same as the current state except for that it is using the location of the given component.
+     * <p>
+     * The view is moved so that the center is the same as the old center.
+     * @param positon The new location to use.
+     * @return The new state.
+     * @since 10375
+     */
+    public MapViewState usingLocation(JComponent positon) {
+        EastNorth center = this.getCenter().getEastNorth();
+        return new MapViewState(positon, this).usingCenter(center);
+    }
+
+    /**
+     * Creates a state that uses the projection.
+     * @param projection The projection to use.
+     * @return The new state.
+     * @since 10486
+     */
+    public MapViewState usingProjection(Projection projection) {
+        if (projection.equals(this.projection)) {
+            return this;
+        } else {
+            return new MapViewState(projection, this);
+        }
+    }
+
+    /**
+     * Create the default {@link MapViewState} object for the given map view. The screen position won't be set so that this method can be used
+     * before the view was added to the hirarchy.
+     * @param width The view width
+     * @param height The view height
+     * @return The state
+     * @since 10375
+     */
+    public static MapViewState createDefaultState(int width, int height) {
+        Projection projection = Main.getProjection();
+        double scale = projection.getDefaultZoomInPPD();
+        MapViewState state = new MapViewState(projection, width, height, scale, new EastNorth(0, 0));
+        EastNorth center = calculateDefaultCenter();
+        return state.movedTo(state.getCenter(), center);
+    }
+
+    private static EastNorth calculateDefaultCenter() {
+        Bounds b = DownloadDialog.getSavedDownloadBounds();
+        if (b == null) {
+            b = Main.getProjection().getWorldBoundsLatLon();
+        }
+        return Main.getProjection().latlon2eastNorth(b.getCenter());
+    }
+
+    /**
+     * A class representing a point in the map view. It allows to convert between the different coordinate systems.
+     * @author Michael Zangl
+     */
+    public abstract class MapViewPoint {
+
+        /**
+         * Get this point in view coordinates.
+         * @return The point in view coordinates.
+         */
+        public Point2D getInView() {
+            return new Point2D.Double(getInViewX(), getInViewY());
+        }
+
+        protected abstract double getInViewX();
+
+        protected abstract double getInViewY();
+
+        /**
+         * Convert this point to window coordinates.
+         * @return The point in window coordinates.
+         */
+        public Point2D getInWindow() {
+            return getUsingCorner(topLeftInWindow);
+        }
+
+        /**
+         * Convert this point to screen coordinates.
+         * @return The point in screen coordinates.
+         */
+        public Point2D getOnScreen() {
+            return getUsingCorner(topLeftOnScreen);
+        }
+
+        private Double getUsingCorner(Point corner) {
+            return new Point2D.Double(corner.getX() + getInViewX(), corner.getY() + getInViewY());
+        }
+
+        /**
+         * Gets the {@link EastNorth} coordinate of this point.
+         * @return The east/north coordinate.
+         */
+        public EastNorth getEastNorth() {
+            return new EastNorth(topLeft.east() + getInViewX() * scale, topLeft.north() - getInViewY() * scale);
+        }
+
+        /**
+         * Create a rectangle from this to the other point.
+         * @param other The other point. Needs to be of the same {@link MapViewState}
+         * @return A rectangle.
+         */
+        public MapViewRectangle rectTo(MapViewPoint other) {
+            return new MapViewRectangle(this, other);
+        }
+
+        /**
+         * Gets the current position in LatLon coordinates according to the current projection.
+         * @return The positon as LatLon.
+         */
+        public LatLon getLatLon() {
+            return projection.eastNorth2latlon(getEastNorth());
+        }
+    }
+
+    private class MapViewViewPoint extends MapViewPoint {
+        private final double x;
+        private final double y;
+
+        MapViewViewPoint(double x, double y) {
+            this.x = x;
+            this.y = y;
+        }
+
+        @Override
+        protected double getInViewX() {
+            return x;
+        }
+
+        @Override
+        protected double getInViewY() {
+            return y;
+        }
+
+        @Override
+        public String toString() {
+            return "MapViewViewPoint [x=" + x + ", y=" + y + ']';
+        }
+    }
+
+    private class MapViewEastNorthPoint extends MapViewPoint {
+
+        private final EastNorth eastNorth;
+
+        MapViewEastNorthPoint(EastNorth eastNorth) {
+            this.eastNorth = eastNorth;
+        }
+
+        @Override
+        protected double getInViewX() {
+            return (eastNorth.east() - topLeft.east()) / scale;
+        }
+
+        @Override
+        protected double getInViewY() {
+            return (topLeft.north() - eastNorth.north()) / scale;
+        }
+
+        @Override
+        public EastNorth getEastNorth() {
+            return eastNorth;
+        }
+
+        @Override
+        public String toString() {
+            return "MapViewEastNorthPoint [eastNorth=" + eastNorth + ']';
+        }
+    }
+
+    /**
+     * A rectangle on the MapView. It is rectangular in screen / EastNorth space.
+     * @author Michael Zangl
+     */
+    public class MapViewRectangle {
+        private final MapViewPoint p1;
+        private final MapViewPoint p2;
+
+        /**
+         * Create a new MapViewRectangle
+         * @param p1 The first point to use
+         * @param p2 The second point to use.
+         */
+        MapViewRectangle(MapViewPoint p1, MapViewPoint p2) {
+            this.p1 = p1;
+            this.p2 = p2;
+        }
+
+        /**
+         * Gets the projection bounds for this rectangle.
+         * @return The projection bounds.
+         */
+        public ProjectionBounds getProjectionBounds() {
+            ProjectionBounds b = new ProjectionBounds(p1.getEastNorth());
+            b.extend(p2.getEastNorth());
+            return b;
+        }
+
+        /**
+         * Gets a rough estimate of the bounds by assuming lat/lon are parallel to x/y.
+         * @return The bounds computed by converting the corners of this rectangle.
+         * @see #getLatLonBoundsBox()
+         */
+        public Bounds getCornerBounds() {
+            Bounds b = new Bounds(p1.getLatLon());
+            b.extend(p2.getLatLon());
+            return b;
+        }
+
+        /**
+         * Gets the real bounds that enclose this rectangle.
+         * This is computed respecting that the borders of this rectangle may not be a straignt line in latlon coordinates.
+         * @return The bounds.
+         * @since 10458
+         */
+        public Bounds getLatLonBoundsBox() {
+            return projection.getLatLonBoundsBox(getProjectionBounds());
+        }
+    }
+
+}
diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
index 9334562..3fcd541 100644
--- a/src/org/openstreetmap/josm/gui/NavigatableComponent.java
+++ b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
@@ -2,10 +2,12 @@
 package org.openstreetmap.josm.gui;
 
 import java.awt.Cursor;
-import java.awt.Graphics;
 import java.awt.Point;
-import java.awt.Polygon;
 import java.awt.Rectangle;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.nio.charset.StandardCharsets;
@@ -26,6 +28,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.zip.CRC32;
 
 import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
@@ -43,13 +46,12 @@ import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
-import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.DoubleProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
 import org.openstreetmap.josm.data.projection.Projections;
-import org.openstreetmap.josm.gui.download.DownloadDialog;
 import org.openstreetmap.josm.gui.help.Helpful;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer.Scale;
@@ -98,7 +100,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     public static final BooleanProperty PROP_ZOOM_INTERMEDIATE_STEPS = new BooleanProperty("zoom.intermediate-steps", true);
 
     public static final String PROPNAME_CENTER = "center";
-    public static final String PROPNAME_SCALE  = "scale";
+    public static final String PROPNAME_SCALE = "scale";
 
     /**
      * The layer which scale is set to.
@@ -136,25 +138,67 @@ public class NavigatableComponent extends JComponent implements Helpful {
         }
     }
 
-    private double scale = Main.getProjection().getDefaultZoomInPPD();
-    /**
-     * Center n/e coordinate of the desired screen center.
-     */
-    protected EastNorth center = calculateDefaultCenter();
+    // The only events that may move/resize this map view are window movements or changes to the map view size.
+    // We can clean this up more by only recalculating the state on repaint.
+    private final transient HierarchyListener hierarchyListener = new HierarchyListener() {
+        @Override
+        public void hierarchyChanged(HierarchyEvent e) {
+            long interestingFlags = HierarchyEvent.ANCESTOR_MOVED | HierarchyEvent.SHOWING_CHANGED;
+            if ((e.getChangeFlags() & interestingFlags) != 0) {
+                updateLocationState();
+            }
+        }
+    };
 
-    private final transient Object paintRequestLock = new Object();
-    private Rectangle paintRect;
-    private Polygon paintPoly;
+    private final transient ComponentAdapter componentListener = new ComponentAdapter() {
+        @Override
+        public void componentShown(ComponentEvent e) {
+            updateLocationState();
+        }
+
+        @Override
+        public void componentResized(ComponentEvent e) {
+            updateLocationState();
+        }
+    };
 
     protected transient ViewportData initialViewport;
 
     protected final transient CursorManager cursorManager = new CursorManager(this);
 
     /**
+     * The current state (scale, center, ...) of this map view.
+     */
+    private transient MapViewState state;
+
+    /**
      * Constructs a new {@code NavigatableComponent}.
      */
     public NavigatableComponent() {
         setLayout(null);
+        state = MapViewState.createDefaultState(getWidth(), getHeight());
+        // uses weak link.
+        Main.addProjectionChangeListener(new ProjectionChangeListener() {
+            @Override
+            public void projectionChanged(Projection oldValue, Projection newValue) {
+                fixProjection();
+            }
+        });
+    }
+
+    @Override
+    public void addNotify() {
+        updateLocationState();
+        addHierarchyListener(hierarchyListener);
+        addComponentListener(componentListener);
+        super.addNotify();
+    }
+
+    @Override
+    public void removeNotify() {
+        removeHierarchyListener(hierarchyListener);
+        removeComponentListener(componentListener);
+        super.removeNotify();
     }
 
     /**
@@ -163,7 +207,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      */
     public void setNativeScaleLayer(NativeScaleLayer nativeScaleLayer) {
         this.nativeScaleLayer = nativeScaleLayer;
-        zoomTo(center, scaleRound(scale));
+        zoomTo(getCenter(), scaleRound(getScale()));
         repaint();
     }
 
@@ -245,6 +289,9 @@ public class NavigatableComponent extends JComponent implements Helpful {
         if (nativeScaleLayer != null) {
             ScaleList scaleList = nativeScaleLayer.getNativeScales();
             if (scaleList != null) {
+                if (PROP_ZOOM_INTERMEDIATE_STEPS.get()) {
+                    scaleList = scaleList.withIntermediateSteps(PROP_ZOOM_RATIO.get());
+                }
                 Scale snapscale = scaleList.getSnapScale(scale, PROP_ZOOM_RATIO.get(), floor);
                 return snapscale != null ? snapscale.getScale() : scale;
             }
@@ -256,26 +303,52 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * Zoom in current view. Use configured zoom step and scaling settings.
      */
     public void zoomIn() {
-        zoomTo(center, scaleZoomIn());
+        zoomTo(getCenter(), scaleZoomIn());
     }
 
     /**
      * Zoom out current view. Use configured zoom step and scaling settings.
      */
     public void zoomOut() {
-        zoomTo(center, scaleZoomOut());
+        zoomTo(getCenter(), scaleZoomOut());
     }
 
+    /**
+     * Returns current data set. To be removed: end of 2016.
+     * @return current data set
+     * @deprecated Use {@link Main#getLayerManager()}.getEditDataSet() instead.
+     */
+    @Deprecated
     protected DataSet getCurrentDataSet() {
-        return Main.main.getCurrentDataSet();
+        return Main.getLayerManager().getEditDataSet();
     }
 
-    private static EastNorth calculateDefaultCenter() {
-        Bounds b = DownloadDialog.getSavedDownloadBounds();
-        if (b == null) {
-            b = Main.getProjection().getWorldBoundsLatLon();
+    protected void updateLocationState() {
+        if (isVisibleOnScreen()) {
+            state = state.usingLocation(this);
         }
-        return Main.getProjection().latlon2eastNorth(b.getCenter());
+    }
+
+    protected boolean isVisibleOnScreen() {
+        return SwingUtilities.getWindowAncestor(this) != null && isShowing();
+    }
+
+    /**
+     * Changes the projection settings used for this map view.
+     * <p>
+     * Made public temporarely, will be made private later.
+     */
+    public void fixProjection() {
+        state = state.usingProjection(Main.getProjection());
+        repaint();
+    }
+
+    /**
+     * Gets the current view state. This includes the scale, the current view area and the position.
+     * @return The current state.
+     */
+    public MapViewState getState() {
+        return state;
     }
 
     /**
@@ -301,28 +374,6 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     /**
-     * Returns the text describing the given area in the current system of measurement.
-     * @param area The distance in square metres.
-     * @return the text describing the given area in the current system of measurement.
-     * @since 5560
-     */
-    public static String getAreaText(double area) {
-        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area);
-    }
-
-    /**
-     * Returns the text describing the given area in the current system of measurement.
-     * @param area The area in square metres
-     * @param format A {@link NumberFormat} to format the area value
-     * @param threshold Values lower than this {@code threshold} are displayed as {@code "< [threshold]"}
-     * @return the text describing the given area in the current system of measurement.
-     * @since 7135
-     */
-    public static String getAreaText(final double area, final NumberFormat format, final double threshold) {
-        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area, format, threshold);
-    }
-
-    /**
      * Returns the text describing the distance in meter that correspond to 100 px on screen.
      * @return the text describing the distance in meter that correspond to 100 px on screen
      */
@@ -366,7 +417,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return the current center of the viewport
      */
     public EastNorth getCenter() {
-        return center;
+        return state.getCenter().getEastNorth();
     }
 
     /**
@@ -377,7 +428,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return the current scale
      */
     public double getScale() {
-        return scale;
+        return state.getScale();
     }
 
     /**
@@ -387,19 +438,11 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return Geographic coordinates from a specific pixel coordination on the screen.
      */
     public EastNorth getEastNorth(int x, int y) {
-        return new EastNorth(
-                center.east() + (x - getWidth()/2.0)*scale,
-                center.north() - (y - getHeight()/2.0)*scale);
+        return state.getForView(x, y).getEastNorth();
     }
 
     public ProjectionBounds getProjectionBounds() {
-        return new ProjectionBounds(
-                new EastNorth(
-                        center.east() - getWidth()/2.0*scale,
-                        center.north() - getHeight()/2.0*scale),
-                        new EastNorth(
-                                center.east() + getWidth()/2.0*scale,
-                                center.north() + getHeight()/2.0*scale));
+        return getState().getViewArea().getProjectionBounds();
     }
 
     /* FIXME: replace with better method - used by MapSlider */
@@ -411,13 +454,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
 
     /* FIXME: replace with better method - used by Main to reset Bounds when projection changes, don't use otherwise */
     public Bounds getRealBounds() {
-        return new Bounds(
-                getProjection().eastNorth2latlon(new EastNorth(
-                        center.east() - getWidth()/2.0*scale,
-                        center.north() - getHeight()/2.0*scale)),
-                        getProjection().eastNorth2latlon(new EastNorth(
-                                center.east() + getWidth()/2.0*scale,
-                                center.north() + getHeight()/2.0*scale)));
+        return getState().getViewArea().getCornerBounds();
     }
 
     /**
@@ -436,11 +473,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     public ProjectionBounds getProjectionBounds(Rectangle r) {
-        EastNorth p1 = getEastNorth(r.x, r.y);
-        EastNorth p2 = getEastNorth(r.x + r.width, r.y + r.height);
-        ProjectionBounds pb = new ProjectionBounds(p1);
-        pb.extend(p2);
-        return pb;
+        return getState().getViewArea(r).getProjectionBounds();
     }
 
     /**
@@ -452,8 +485,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     public AffineTransform getAffineTransform() {
-        return new AffineTransform(
-                1.0/scale, 0.0, 0.0, -1.0/scale, getWidth()/2.0 - center.east()/scale, getHeight()/2.0 + center.north()/scale);
+        return getState().getAffineTransform();
     }
 
     /**
@@ -465,9 +497,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     public Point2D getPoint2D(EastNorth p) {
         if (null == p)
             return new Point();
-        double x = (p.east()-center.east())/scale + getWidth()/2d;
-        double y = (center.north()-p.north())/scale + getHeight()/2d;
-        return new Point2D.Double(x, y);
+        return getState().getPointFor(p).getInView();
     }
 
     public Point2D getPoint2D(LatLon latlon) {
@@ -553,7 +583,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
         LatLon ll2 = getLatLon(width / 2 + 50, height / 2);
         if (ll1.isValid() && ll2.isValid() && b.contains(ll1) && b.contains(ll2)) {
             double dm = ll1.greatCircleDistance(ll2);
-            double den = 100 * scale;
+            double den = 100 * getScale();
             double scaleMin = 0.01 * den / dm / 100;
             if (!Double.isInfinite(scaleMin) && newScale < scaleMin) {
                 newScale = scaleMin;
@@ -561,11 +591,11 @@ public class NavigatableComponent extends JComponent implements Helpful {
         }
 
         // snap scale to imagery if needed
-        scale = scaleRound(scale);
+        newScale = scaleRound(newScale);
 
-        if (!newCenter.equals(center) || !Utils.equalsEpsilon(scale, newScale)) {
+        if (!newCenter.equals(getCenter()) || !Utils.equalsEpsilon(getScale(), newScale)) {
             if (!initial) {
-                pushZoomUndo(center, scale);
+                pushZoomUndo(getCenter(), getScale());
             }
             zoomNoUndoTo(newCenter, newScale, initial);
         }
@@ -579,16 +609,18 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @param initial true if this call initializes the viewport.
      */
     private void zoomNoUndoTo(EastNorth newCenter, double newScale, boolean initial) {
-        if (!newCenter.equals(center)) {
-            EastNorth oldCenter = center;
-            center = newCenter;
+        if (!newCenter.equals(getCenter())) {
+            EastNorth oldCenter = getCenter();
+            state = state.usingCenter(newCenter);
             if (!initial) {
                 firePropertyChange(PROPNAME_CENTER, oldCenter, newCenter);
             }
         }
-        if (!Utils.equalsEpsilon(scale, newScale)) {
-            double oldScale = scale;
-            scale = newScale;
+        if (!Utils.equalsEpsilon(getScale(), newScale)) {
+            double oldScale = getScale();
+            state = state.usingScale(newScale);
+            // temporary. Zoom logic needs to be moved.
+            state = state.movedTo(state.getCenter(), newCenter);
             if (!initial) {
                 firePropertyChange(PROPNAME_SCALE, oldScale, newScale);
             }
@@ -601,17 +633,13 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     public void zoomTo(EastNorth newCenter) {
-        zoomTo(newCenter, scale);
+        zoomTo(newCenter, getScale());
     }
 
     public void zoomTo(LatLon newCenter) {
         zoomTo(Projections.project(newCenter));
     }
 
-    public void smoothScrollTo(LatLon newCenter) {
-        smoothScrollTo(Projections.project(newCenter));
-    }
-
     /**
      * Create a thread that moves the viewport to the given center in an animated fashion.
      * @param newCenter new east/north center
@@ -620,9 +648,9 @@ public class NavigatableComponent extends JComponent implements Helpful {
         // FIXME make these configurable.
         final int fps = 20;     // animation frames per second
         final int speed = 1500; // milliseconds for full-screen-width pan
-        if (!newCenter.equals(center)) {
-            final EastNorth oldCenter = center;
-            final double distance = newCenter.distance(oldCenter) / scale;
+        if (!newCenter.equals(getCenter())) {
+            final EastNorth oldCenter = getCenter();
+            final double distance = newCenter.distance(oldCenter) / getScale();
             final double milliseconds = distance / getWidth() * speed;
             final double frames = milliseconds * fps / 1000;
             final EastNorth finalNewCenter = newCenter;
@@ -645,27 +673,25 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     public void zoomManyTimes(double x, double y, int times) {
-        double oldScale = scale;
+        double oldScale = getScale();
         double newScale = scaleZoomManyTimes(times);
         zoomToFactor(x, y, newScale / oldScale);
     }
 
     public void zoomToFactor(double x, double y, double factor) {
-        double newScale = scale*factor;
-        // New center position so that point under the mouse pointer stays the same place as it was before zooming
-        // You will get the formula by simplifying this expression: newCenter = oldCenter + mouseCoordinatesInNewZoom - mouseCoordinatesInOldZoom
-        zoomTo(new EastNorth(
-                center.east() - (x - getWidth()/2.0) * (newScale - scale),
-                center.north() + (y - getHeight()/2.0) * (newScale - scale)),
-                newScale);
+        double newScale = getScale()*factor;
+        EastNorth oldUnderMouse = getState().getForView(x, y).getEastNorth();
+        MapViewState newState = getState().usingScale(newScale);
+        newState = newState.movedTo(newState.getForView(x, y), oldUnderMouse);
+        zoomTo(newState.getCenter().getEastNorth(), newScale);
     }
 
     public void zoomToFactor(EastNorth newCenter, double factor) {
-        zoomTo(newCenter, scale*factor);
+        zoomTo(newCenter, getScale()*factor);
     }
 
     public void zoomToFactor(double factor) {
-        zoomTo(center, scale*factor);
+        zoomTo(getCenter(), getScale()*factor);
     }
 
     public void zoomTo(ProjectionBounds box) {
@@ -758,7 +784,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     public void zoomPrevious() {
         if (!zoomUndoBuffer.isEmpty()) {
             ZoomData zoom = zoomUndoBuffer.pop();
-            zoomRedoBuffer.push(new ZoomData(center, scale));
+            zoomRedoBuffer.push(new ZoomData(getCenter(), getScale()));
             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
         }
     }
@@ -766,7 +792,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
     public void zoomNext() {
         if (!zoomRedoBuffer.isEmpty()) {
             ZoomData zoom = zoomRedoBuffer.pop();
-            zoomUndoBuffer.push(new ZoomData(center, scale));
+            zoomUndoBuffer.push(new ZoomData(getCenter(), getScale()));
             zoomNoUndoTo(zoom.getCenterEastNorth(), zoom.getScale(), false);
         }
     }
@@ -794,7 +820,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      */
     private Map<Double, List<Node>> getNearestNodesImpl(Point p, Predicate<OsmPrimitive> predicate) {
         Map<Double, List<Node>> nearestMap = new TreeMap<>();
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
 
         if (ds != null) {
             double dist, snapDistanceSq = PROP_SNAP_DISTANCE.get();
@@ -1003,7 +1029,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      */
     private Map<Double, List<WaySegment>> getNearestWaySegmentsImpl(Point p, Predicate<OsmPrimitive> predicate) {
         Map<Double, List<WaySegment>> nearestMap = new TreeMap<>();
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
 
         if (ds != null) {
             double snapDistanceSq = Main.pref.getInteger("mappaint.segment.snap-distance", 10);
@@ -1364,7 +1390,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      */
     public final OsmPrimitive getNearestNodeOrWay(Point p, Predicate<OsmPrimitive> predicate, boolean useSelected) {
         Collection<OsmPrimitive> sel;
-        DataSet ds = getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (useSelected && ds != null) {
             sel = ds.getSelected();
         } else {
@@ -1401,35 +1427,6 @@ public class NavigatableComponent extends JComponent implements Helpful {
         return osm;
     }
 
-    public static double perDist(Point2D pt, Point2D a, Point2D b) {
-        if (pt != null && a != null && b != null) {
-            double pd =
-                    (a.getX()-pt.getX())*(b.getX()-a.getX()) -
-                    (a.getY()-pt.getY())*(b.getY()-a.getY());
-            return Math.abs(pd) / a.distance(b);
-        }
-        return 0d;
-    }
-
-    /**
-     *
-     * @param pt point to project onto (ab)
-     * @param a root of vector
-     * @param b vector
-     * @return point of intersection of line given by (ab)
-     *      with its orthogonal line running through pt
-     */
-    public static Point2D project(Point2D pt, Point2D a, Point2D b) {
-        if (pt != null && a != null && b != null) {
-            double r = (
-                    (pt.getX()-a.getX())*(b.getX()-a.getX()) +
-                    (pt.getY()-a.getY())*(b.getY()-a.getY()))
-                    / a.distanceSq(b);
-            return project(r, a, b);
-        }
-        return null;
-    }
-
     /**
      * if r = 0 returns a, if r=1 returns b,
      * if r = 0.5 returns center between a and b, etc..
@@ -1516,7 +1513,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return The projection to be used in calculating stuff.
      */
     public Projection getProjection() {
-        return Main.getProjection();
+        return state.getProjection();
     }
 
     @Override
@@ -1530,8 +1527,13 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @return A unique ID, as long as viewport dimensions are the same
      */
     public int getViewID() {
-        String x = center.east() + '_' + center.north() + '_' + scale + '_' +
-                getWidth() + '_' + getHeight() + '_' + getProjection().toString();
+        EastNorth center = getCenter();
+        String x = new StringBuilder().append(center.east())
+                          .append('_').append(center.north())
+                          .append('_').append(getScale())
+                          .append('_').append(getWidth())
+                          .append('_').append(getHeight())
+                          .append('_').append(getProjection()).toString();
         CRC32 id = new CRC32();
         id.update(x.getBytes(StandardCharsets.UTF_8));
         return (int) id.getValue();
@@ -1571,79 +1573,6 @@ public class NavigatableComponent extends JComponent implements Helpful {
         return cursorManager;
     }
 
-    @Override
-    public void paint(Graphics g) {
-        synchronized (paintRequestLock) {
-            if (paintRect != null) {
-                Graphics g2 = g.create();
-                g2.setColor(Utils.complement(PaintColors.getBackgroundColor()));
-                g2.drawRect(paintRect.x, paintRect.y, paintRect.width, paintRect.height);
-                g2.dispose();
-            }
-            if (paintPoly != null) {
-                Graphics g2 = g.create();
-                g2.setColor(Utils.complement(PaintColors.getBackgroundColor()));
-                g2.drawPolyline(paintPoly.xpoints, paintPoly.ypoints, paintPoly.npoints);
-                g2.dispose();
-            }
-        }
-        super.paint(g);
-    }
-
-    /**
-     * Requests to paint the given {@code Rectangle}.
-     * @param r The Rectangle to draw
-     * @see #requestClearRect
-     * @since 5500
-     */
-    public void requestPaintRect(Rectangle r) {
-        if (r != null) {
-            synchronized (paintRequestLock) {
-                paintRect = r;
-            }
-            repaint();
-        }
-    }
-
-    /**
-     * Requests to paint the given {@code Polygon} as a polyline (unclosed polygon).
-     * @param p The Polygon to draw
-     * @see #requestClearPoly
-     * @since 5500
-     */
-    public void requestPaintPoly(Polygon p) {
-        if (p != null) {
-            synchronized (paintRequestLock) {
-                paintPoly = p;
-            }
-            repaint();
-        }
-    }
-
-    /**
-     * Requests to clear the rectangled previously drawn.
-     * @see #requestPaintRect
-     * @since 5500
-     */
-    public void requestClearRect() {
-        synchronized (paintRequestLock) {
-            paintRect = null;
-        }
-        repaint();
-    }
-
-    /**
-     * Requests to clear the polyline previously drawn.
-     * @see #requestPaintPoly
-     * @since 5500
-     */
-    public void requestClearPoly() {
-        synchronized (paintRequestLock) {
-            paintPoly = null;
-        }
-        repaint();
-    }
-
     /**
      * Get a max scale for projection that describes world in 1/512 of the projection unit
      * @return max scale
diff --git a/src/org/openstreetmap/josm/gui/ScrollViewport.java b/src/org/openstreetmap/josm/gui/ScrollViewport.java
index ab8204a..b1672f5 100644
--- a/src/org/openstreetmap/josm/gui/ScrollViewport.java
+++ b/src/org/openstreetmap/josm/gui/ScrollViewport.java
@@ -131,7 +131,7 @@ public class ScrollViewport extends JPanel {
         add(vp, BorderLayout.CENTER);
 
         this.addComponentListener(new ComponentAdapter() {
-            @Override public void  componentResized(ComponentEvent e) {
+            @Override public void componentResized(ComponentEvent e) {
                 showOrHideButtons();
             }
         });
diff --git a/src/org/openstreetmap/josm/gui/SelectionManager.java b/src/org/openstreetmap/josm/gui/SelectionManager.java
index 94301d7..046e3be 100644
--- a/src/org/openstreetmap/josm/gui/SelectionManager.java
+++ b/src/org/openstreetmap/josm/gui/SelectionManager.java
@@ -198,7 +198,7 @@ public class SelectionManager implements MouseListener, MouseMotionListener, Pro
      */
     @Override
     public void mousePressed(MouseEvent e) {
-        if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() > 1 && Main.main.getCurrentDataSet() != null) {
+        if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() > 1 && Main.getLayerManager().getEditDataSet() != null) {
             SelectByInternalPointAction.performSelection(Main.map.mapView.getEastNorth(e.getX(), e.getY()),
                     (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0,
                     (e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) != 0);
@@ -397,14 +397,14 @@ public class SelectionManager implements MouseListener, MouseMotionListener, Pro
             }
         } else {
             // nodes
-            for (Node n : nc.getCurrentDataSet().getNodes()) {
+            for (Node n : Main.getLayerManager().getEditDataSet().getNodes()) {
                 if (n.isSelectable() && selectionResult.contains(nc.getPoint2D(n))) {
                     selection.add(n);
                 }
             }
 
             // ways
-            for (Way w : nc.getCurrentDataSet().getWays()) {
+            for (Way w : Main.getLayerManager().getEditDataSet().getWays()) {
                 if (!w.isSelectable() || w.getNodesCount() == 0) {
                     continue;
                 }
diff --git a/src/org/openstreetmap/josm/gui/SideButton.java b/src/org/openstreetmap/josm/gui/SideButton.java
index 5760f1f..682cbce 100644
--- a/src/org/openstreetmap/josm/gui/SideButton.java
+++ b/src/org/openstreetmap/josm/gui/SideButton.java
@@ -17,25 +17,34 @@ import javax.swing.JButton;
 import javax.swing.SwingConstants;
 import javax.swing.plaf.basic.BasicArrowButton;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.ImageResource;
 
 /**
  * Button that is usually used in toggle dialogs.
  * @since 744
  */
 public class SideButton extends JButton implements Destroyable {
-    private static final int iconHeight = ImageProvider.ImageSizes.SIDEBUTTON.getImageSize();
 
     private transient PropertyChangeListener propertyChangeListener;
 
     /**
      * Constructs a new {@code SideButton}.
      * @param action action used to specify the new button
+     * @since 744
      */
     public SideButton(Action action) {
         super(action);
-        fixIcon(action);
+        ImageResource icon = (ImageResource) action.getValue("ImageResource");
+        if (icon != null) {
+            setIcon(icon.getImageIconBounded(
+                ImageProvider.ImageSizes.SIDEBUTTON.getImageDimension()));
+        } else if (getIcon() != null) { /* TODO: remove when calling code is fixed, replace by exception */
+            Main.warn("Old style SideButton usage for action " + action);
+            fixIcon(action);
+        }
         doStyle();
     }
 
@@ -43,13 +52,12 @@ public class SideButton extends JButton implements Destroyable {
      * Constructs a new {@code SideButton}.
      * @param action action used to specify the new button
      * @param usename use action name
+     * @since 2710
      */
     public SideButton(Action action, boolean usename) {
-        super(action);
+        this(action);
         if (!usename) {
             setText(null);
-            fixIcon(action);
-            doStyle();
         }
     }
 
@@ -57,13 +65,21 @@ public class SideButton extends JButton implements Destroyable {
      * Constructs a new {@code SideButton}.
      * @param action action used to specify the new button
      * @param imagename image name in "dialogs" directory
+     * @since 2747
      */
     public SideButton(Action action, String imagename) {
         super(action);
-        setIcon(getScaledImage(ImageProvider.get("dialogs", imagename).getImage()));
+        setIcon(ImageProvider.get("dialogs", imagename, ImageProvider.ImageSizes.SIDEBUTTON));
         doStyle();
     }
 
+    /**
+     * Fix icon size
+     * @param action the action
+     * @deprecated This method is old style and will be removed together with the removal
+     * of old constructor code
+     */
+    @Deprecated
     private void fixIcon(Action action) {
         // need to listen for changes, so that putValue() that are called after the
         // SideButton is constructed get the proper icon size
@@ -78,28 +94,31 @@ public class SideButton extends JButton implements Destroyable {
             };
             action.addPropertyChangeListener(propertyChangeListener);
         }
+        int iconHeight = ImageProvider.ImageSizes.SIDEBUTTON.getImageDimension().height;
         Icon i = getIcon();
         if (i instanceof ImageIcon && i.getIconHeight() != iconHeight) {
-            setIcon(getScaledImage(((ImageIcon) i).getImage()));
+            Image im = ((ImageIcon) i).getImage();
+            int newWidth = im.getWidth(null) * iconHeight / im.getHeight(null);
+            ImageIcon icon = new ImageIcon(im.getScaledInstance(newWidth, iconHeight, Image.SCALE_SMOOTH));
+            setIcon(icon);
         }
     }
 
     /**
-     * Scales the given image proportionally so that the height is "iconHeight"
-     * @param im original image
-     * @return scaled image
+     * Do the style settings for the side button layout
      */
-    private static ImageIcon getScaledImage(Image im) {
-        int newWidth = im.getWidth(null) *  iconHeight / im.getHeight(null);
-        return new ImageIcon(im.getScaledInstance(newWidth, iconHeight, Image.SCALE_SMOOTH));
-    }
-
     private void doStyle() {
         setLayout(new BorderLayout());
         setIconTextGap(2);
         setMargin(new Insets(0, 0, 0, 0));
     }
 
+    /**
+     * Create the arrow for opening a drop-down menu
+     * @param listener listener to use for button actions (e.g. pressing)
+     * @return the created button
+     * @since 9668
+     */
     public BasicArrowButton createArrow(ActionListener listener) {
         setMargin(new Insets(0, 0, 0, 0));
         BasicArrowButton arrowButton = new BasicArrowButton(SwingConstants.SOUTH, null, null, Color.BLACK, null);
diff --git a/src/org/openstreetmap/josm/gui/SplashScreen.java b/src/org/openstreetmap/josm/gui/SplashScreen.java
index 656fc63..6d4f98b 100644
--- a/src/org/openstreetmap/josm/gui/SplashScreen.java
+++ b/src/org/openstreetmap/josm/gui/SplashScreen.java
@@ -8,7 +8,6 @@ import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.Insets;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -17,7 +16,6 @@ import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -69,7 +67,7 @@ public class SplashScreen extends JFrame implements ChangeListener {
         contentPane.add(innerContentPane);
 
         // Add the logo
-        JLabel logo = new JLabel(new ImageIcon(ImageProvider.get("logo.svg").getImage().getScaledInstance(128, 129, Image.SCALE_SMOOTH)));
+        JLabel logo = new JLabel(ImageProvider.get("logo.svg", ImageProvider.ImageSizes.SPLASH_LOGO));
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridheight = 2;
         gbc.insets = new Insets(0, 0, 0, 70);
diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
index e742cf4..213edcb 100644
--- a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
+++ b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
@@ -136,7 +136,7 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
         Map<String, String> headers = new HashMap<>();
         headers.put("User-Agent", Version.getInstance().getFullAgentString());
 
-        cachedLoader = AbstractCachedTileSourceLayer.getTileLoaderFactory("TMS", TMSCachedTileLoader.class).makeTileLoader(this,  headers);
+        cachedLoader = AbstractCachedTileSourceLayer.getTileLoaderFactory("TMS", TMSCachedTileLoader.class).makeTileLoader(this, headers);
 
         uncachedLoader = new OsmTileLoader(this);
         uncachedLoader.headers.putAll(headers);
@@ -239,7 +239,7 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
         Point pMin = new Point(Math.min(aEnd.x, aStart.x), Math.min(aEnd.y, aStart.y));
 
         iSelectionRectStart = getPosition(pMin);
-        iSelectionRectEnd =   getPosition(pMax);
+        iSelectionRectEnd = getPosition(pMax);
 
         Bounds b = new Bounds(
                 new LatLon(
diff --git a/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
index c2f50b2..f16b864 100644
--- a/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
+++ b/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
@@ -182,8 +182,8 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
      * @return lat/lon of the north/west-corner of a tile at a specific zoom level
      */
     protected LatLon getNorthWestLatLonOfTile(Point tile, int zoom) {
-        double lon =  tile.x / Math.pow(2.0, zoom) * 360.0 - 180;
-        double lat =  Math.toDegrees(Math.atan(Math.sinh(Math.PI - (2.0 * Math.PI * tile.y) / Math.pow(2.0, zoom))));
+        double lon = tile.x / Math.pow(2.0, zoom) * 360.0 - 180;
+        double lat = Math.toDegrees(Math.atan(Math.sinh(Math.PI - (2.0 * Math.PI * tile.y) / Math.pow(2.0, zoom))));
         return new LatLon(lat, lon);
     }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java b/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
index 1af4adc..cb8528d 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ComparePairType.java
@@ -21,12 +21,12 @@ public enum ComparePairType {
     /**
      * compare my version of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive} with the merged version
      */
-    MY_WITH_MERGED(tr("My with Merged"),  new ListRole[] {MY_ENTRIES, MERGED_ENTRIES}),
+    MY_WITH_MERGED(tr("My with Merged"), new ListRole[] {MY_ENTRIES, MERGED_ENTRIES}),
 
     /**
      * compare their version of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive} with the merged veresion
      */
-    THEIR_WITH_MERGED(tr("Their with Merged"),  new ListRole[] {THEIR_ENTRIES, MERGED_ENTRIES});
+    THEIR_WITH_MERGED(tr("Their with Merged"), new ListRole[] {THEIR_ENTRIES, MERGED_ENTRIES});
 
     /** the localized display name */
     private final String displayName;
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java b/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java
index b5b2d2e..733f0bb 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java
@@ -47,7 +47,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * </ul>
  *
  */
-public class ConflictResolver extends JPanel implements PropertyChangeListener  {
+public class ConflictResolver extends JPanel implements PropertyChangeListener {
 
     /* -------------------------------------------------------------------------------------- */
     /* Property names                                                                         */
@@ -319,16 +319,16 @@ public class ConflictResolver extends JPanel implements PropertyChangeListener
             //
             this.resolvedCompletely =
                 tagMerger.getModel().isResolvedCompletely()
-                &&  propertiesMerger.getModel().isResolvedCompletely()
+                && propertiesMerger.getModel().isResolvedCompletely()
                 && nodeListMerger.getModel().isFrozen();
-        }  else if (my instanceof Relation) {
+        } else if (my instanceof Relation) {
             // resolve the version conflict if this is a relation, all tag
             // conflicts and all conflicts in the member list
             // have been resolved
             //
             this.resolvedCompletely =
                 tagMerger.getModel().isResolvedCompletely()
-                &&  propertiesMerger.getModel().isResolvedCompletely()
+                && propertiesMerger.getModel().isResolvedCompletely()
                 && relationMemberMerger.getModel().isFrozen();
         }
         if (this.resolvedCompletely != oldValueResolvedCompletely) {
@@ -346,11 +346,21 @@ public class ConflictResolver extends JPanel implements PropertyChangeListener
     }
 
     /**
+     * Adds all registered listeners by this conflict resolver
+     * @see #unregisterListeners()
+     * @since 10454
+     */
+    public void registerListeners() {
+        nodeListMerger.registerListeners();
+        relationMemberMerger.registerListeners();
+    }
+
+    /**
      * Removes all registered listeners by this conflict resolver
      */
     public void unregisterListeners() {
-        nodeListMerger.unlinkAsListener();
-        relationMemberMerger.unlinkAsListener();
+        nodeListMerger.unregisterListeners();
+        relationMemberMerger.unregisterListeners();
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java b/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
index e7f1544..f84b3c3 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
@@ -198,7 +198,7 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends ChangeNotifi
 
         myEntriesSelectionModel = new EntriesSelectionModel(entries.get(MY_ENTRIES));
         theirEntriesSelectionModel = new EntriesSelectionModel(entries.get(THEIR_ENTRIES));
-        mergedEntriesSelectionModel =  new EntriesSelectionModel(entries.get(MERGED_ENTRIES));
+        mergedEntriesSelectionModel = new EntriesSelectionModel(entries.get(MERGED_ENTRIES));
 
         listeners = new HashSet<>();
         comparePairListModel = new ComparePairListModel();
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
index 468b2ee..8d093c9 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
@@ -782,7 +782,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
      * Action for freezing the current state of the list merger
      *
      */
-    private final class FreezeAction extends AbstractAction implements ItemListener, FreezeActionProperties  {
+    private final class FreezeAction extends AbstractAction implements ItemListener, FreezeActionProperties {
 
         private FreezeAction() {
             putValue(Action.NAME, tr("Freeze"));
@@ -882,15 +882,30 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         );
     }
 
-    public void unlinkAsListener() {
-        myEntriesTable.unlinkAsListener();
-        mergedEntriesTable.unlinkAsListener();
-        theirEntriesTable.unlinkAsListener();
+    /**
+     * Adds all registered listeners by this merger
+     * @see #unregisterListeners()
+     * @since 10454
+     */
+    public void registerListeners() {
+        myEntriesTable.registerListeners();
+        mergedEntriesTable.registerListeners();
+        theirEntriesTable.registerListeners();
+    }
+
+    /**
+     * Removes all registered listeners by this merger
+     * @since 10454
+     */
+    public void unregisterListeners() {
+        myEntriesTable.unregisterListeners();
+        mergedEntriesTable.unregisterListeners();
+        theirEntriesTable.unregisterListeners();
     }
 
     protected final <P extends OsmPrimitive> OsmDataLayer findLayerFor(P primitive) {
         if (primitive != null) {
-            Iterable<OsmDataLayer> layers = Main.map.mapView.getLayersOfType(OsmDataLayer.class);
+            Iterable<OsmDataLayer> layers = Main.getLayerManager().getLayersOfType(OsmDataLayer.class);
             // Find layer with same dataset
             for (OsmDataLayer layer : layers) {
                 if (layer.data == primitive.getDataSet()) {
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java
index 49907ac..b933fff 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java
@@ -24,7 +24,7 @@ public class NodeListMerger extends ListMerger<Node> {
 
     @Override
     protected JScrollPane buildMyElementsTable() {
-        myEntriesTable  = new NodeListTable(
+        myEntriesTable = new NodeListTable(
                 "table.mynodes",
                 model,
                 model.getMyTableModel(),
@@ -35,7 +35,7 @@ public class NodeListMerger extends ListMerger<Node> {
 
     @Override
     protected JScrollPane buildMergedElementsTable() {
-        mergedEntriesTable  = new NodeListTable(
+        mergedEntriesTable = new NodeListTable(
                 "table.mergednodes",
                 model,
                 model.getMergedTableModel(),
@@ -46,7 +46,7 @@ public class NodeListMerger extends ListMerger<Node> {
 
     @Override
     protected JScrollPane buildTheirElementsTable() {
-        theirEntriesTable  = new NodeListTable(
+        theirEntriesTable = new NodeListTable(
                 "table.theirnodes",
                 model,
                 model.getTheirTableModel(),
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java b/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
index be8631e..976ba5f 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
@@ -136,7 +136,7 @@ public class PropertiesMergeModel extends ChangeNotifier {
             theirCoords = null;
         }
 
-        myDeletedState =  conflict.isMyDeleted() || my.isDeleted();
+        myDeletedState = conflict.isMyDeleted() || my.isDeleted();
         theirDeletedState = their.isDeleted();
 
         myReferrers = my.getDataSet() == null ? Collections.<OsmPrimitive>emptyList() : my.getReferrers();
@@ -210,7 +210,7 @@ public class PropertiesMergeModel extends ChangeNotifier {
      * Replies deleted state of Server dataset
      * @return The state of deleted flag
      */
-    public  Boolean getTheirDeletedState() {
+    public Boolean getTheirDeletedState() {
         return theirDeletedState;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java
index e0d4d7f..2248e53 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java
@@ -24,7 +24,7 @@ public class RelationMemberMerger extends ListMerger<RelationMember> {
 
     @Override
     protected JScrollPane buildMyElementsTable() {
-        myEntriesTable  = new RelationMemberTable(
+        myEntriesTable = new RelationMemberTable(
                 "table.mymembers",
                 model,
                 model.getMyTableModel(),
@@ -35,7 +35,7 @@ public class RelationMemberMerger extends ListMerger<RelationMember> {
 
     @Override
     protected JScrollPane buildMergedElementsTable() {
-        mergedEntriesTable  = new RelationMemberTable(
+        mergedEntriesTable = new RelationMemberTable(
                 "table.mergedmembers",
                 model,
                 model.getMergedTableModel(),
@@ -47,7 +47,7 @@ public class RelationMemberMerger extends ListMerger<RelationMember> {
 
     @Override
     protected JScrollPane buildTheirElementsTable() {
-        theirEntriesTable  = new RelationMemberTable(
+        theirEntriesTable = new RelationMemberTable(
                 "table.theirmembers",
                 model,
                 model.getTheirTableModel(),
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRenderer.java b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRenderer.java
index c31a342..46708ca 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRenderer.java
@@ -21,7 +21,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * This is the {@link TableCellRenderer} used in the tables of {@link RelationMemberMerger}.
  *
  */
-public  class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer {
+public class RelationMemberTableCellRenderer extends JLabel implements TableCellRenderer {
     private final transient Border rowNumberBorder;
 
     /**
@@ -100,7 +100,7 @@ public  class RelationMemberTableCellRenderer extends JLabel implements TableCel
      * render the row id
      * @param row the row index
      */
-    protected  void renderRowId(int row) {
+    protected void renderRowId(int row) {
         setBorder(rowNumberBorder);
         setText(Integer.toString(row+1));
     }
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItem.java b/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItem.java
index 99621f9..979bd65 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItem.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItem.java
@@ -31,7 +31,7 @@ public class TagMergeItem {
      */
     public TagMergeItem(String key, String myTagValue, String theirTagValue) {
         CheckParameterUtil.ensureParameterNotNull(key, "key");
-        this.key  = key;
+        this.key = key;
         this.myTagValue = myTagValue;
         this.theirTagValue = theirTagValue;
         this.mergeDecision = MergeDecisionType.UNDECIDED;
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
index fd71bc5..8fc1d8f 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
@@ -385,7 +385,7 @@ public class TagMerger extends JPanel implements IConflictResolver {
      * {@link MergeDecisionType#UNDECIDED}
      *
      */
-    class UndecideAction extends AbstractAction implements ListSelectionListener  {
+    class UndecideAction extends AbstractAction implements ListSelectionListener {
 
         UndecideAction() {
             ImageIcon icon = ImageProvider.get("dialogs/conflict", "tagundecide");
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java b/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
index 6aa9ca9..1a1b582 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
@@ -366,7 +366,7 @@ public class CombinePrimitiveResolverDialog extends JDialog {
         CancelAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Cancel conflict resolution"));
             putValue(Action.NAME, tr("Cancel"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("", "cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             setEnabled(true);
         }
 
@@ -381,7 +381,7 @@ public class CombinePrimitiveResolverDialog extends JDialog {
         public ApplyAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Apply resolved conflicts"));
             putValue(Action.NAME, tr("Apply"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java b/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
index 383b4ad..38cf3ea 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
@@ -42,7 +42,7 @@ import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.WindowGeometry;
 
-public class PasteTagsConflictResolverDialog extends JDialog  implements PropertyChangeListener {
+public class PasteTagsConflictResolverDialog extends JDialog implements PropertyChangeListener {
     static final Map<OsmPrimitiveType, String> PANE_TITLES;
     static {
         PANE_TITLES = new EnumMap<>(OsmPrimitiveType.class);
@@ -264,7 +264,7 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
         private CancelAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Cancel conflict resolution"));
             putValue(Action.NAME, tr("Cancel"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("", "cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             setEnabled(true);
         }
 
@@ -280,7 +280,7 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
         private ApplyAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Apply resolved conflicts"));
             putValue(Action.NAME, tr("Apply"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
index 62bf6e4..b8bc626 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictDecision.java
@@ -26,7 +26,7 @@ public class RelationMemberConflictDecision {
             throw new IndexOutOfBoundsException(
                     tr("Position {0} is out of range. Current number of members is {1}.", pos, relation.getMembersCount()));
         this.relation = relation;
-        this.pos  = pos;
+        this.pos = pos;
         this.originalPrimitive = member.getMember();
         this.role = member.hasRole() ? member.getRole() : "";
         this.decision = UNDECIDED;
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
index e8f119f..c0eb683 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
@@ -154,7 +154,7 @@ public class RelationMemberConflictResolver extends JPanel {
     class ApplyRoleAction extends AbstractAction {
         ApplyRoleAction() {
             putValue(NAME, tr("Apply"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Apply this role to all members"));
         }
 
@@ -195,14 +195,14 @@ public class RelationMemberConflictResolver extends JPanel {
 
     public void prepareForEditing() {
         AutoCompletionList acList = new AutoCompletionList();
-        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithMemberRoles(acList);
+        Main.getLayerManager().getEditLayer().data.getAutoCompletionManager().populateWithMemberRoles(acList);
         tfRole.setAutoCompletionList(acList);
         AutoCompletingTextField editor = (AutoCompletingTextField) tblResolver.getColumnModel().getColumn(2).getCellEditor();
         if (editor != null) {
             editor.setAutoCompletionList(acList);
         }
         AutoCompletionList acList2 = new AutoCompletionList();
-        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithKeys(acList2);
+        Main.getLayerManager().getEditLayer().data.getAutoCompletionManager().populateWithKeys(acList2);
         tfKey.setAutoCompletionList(acList2);
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
index d137cb3..e882c95 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
@@ -42,7 +42,6 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager;
 import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetInSelectionListModel;
@@ -114,14 +113,14 @@ public class ChangesetDialog extends ToggleDialog {
     protected void registerAsListener() {
         // let the model for changesets in the current selection listen to various events
         ChangesetCache.getInstance().addChangesetCacheListener(inSelectionModel);
-        MapView.addEditLayerChangeListener(inSelectionModel);
+        Main.getLayerManager().addActiveLayerChangeListener(inSelectionModel);
         DataSet.addSelectionListener(inSelectionModel);
 
         // let the model for changesets in the current layer listen to various
         // events and bootstrap it's content
         ChangesetCache.getInstance().addChangesetCacheListener(inActiveDataLayerModel);
-        MapView.addEditLayerChangeListener(inActiveDataLayerModel);
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        Main.getLayerManager().addActiveLayerChangeListener(inActiveDataLayerModel);
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer != null) {
             editLayer.data.addDataSetListener(inActiveDataLayerModel);
             inActiveDataLayerModel.initFromDataSet(editLayer.data);
@@ -133,8 +132,8 @@ public class ChangesetDialog extends ToggleDialog {
         // remove the list model for the current edit layer as listener
         //
         ChangesetCache.getInstance().removeChangesetCacheListener(inActiveDataLayerModel);
-        MapView.removeEditLayerChangeListener(inActiveDataLayerModel);
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        Main.getLayerManager().removeActiveLayerChangeListener(inActiveDataLayerModel);
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer != null) {
             editLayer.data.removeDataSetListener(inActiveDataLayerModel);
         }
@@ -142,7 +141,7 @@ public class ChangesetDialog extends ToggleDialog {
         // remove the list model for the changesets in the current selection as
         // listener
         //
-        MapView.removeEditLayerChangeListener(inSelectionModel);
+        Main.getLayerManager().removeActiveLayerChangeListener(inSelectionModel);
         DataSet.removeSelectionListener(inSelectionModel);
     }
 
@@ -237,7 +236,7 @@ public class ChangesetDialog extends ToggleDialog {
     }
 
     protected void initWithCurrentData() {
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer != null) {
             inSelectionModel.initFromPrimitives(editLayer.data.getAllSelected());
             inActiveDataLayerModel.initFromDataSet(editLayer.data);
@@ -268,9 +267,9 @@ public class ChangesetDialog extends ToggleDialog {
             Set<Integer> sel = getCurrentChangesetListModel().getSelectedChangesetIds();
             if (sel.isEmpty())
                 return;
-            if (Main.main.getCurrentDataSet() == null)
+            if (Main.getLayerManager().getEditDataSet() == null)
                 return;
-            new SelectObjectsAction().selectObjectsByChangesetIds(Main.main.getCurrentDataSet(), sel);
+            new SelectObjectsAction().selectObjectsByChangesetIds(Main.getLayerManager().getEditDataSet(), sel);
         }
 
     }
@@ -298,7 +297,7 @@ public class ChangesetDialog extends ToggleDialog {
         SelectObjectsAction() {
             putValue(NAME, tr("Select"));
             putValue(SHORT_DESCRIPTION, tr("Select all objects assigned to the currently selected changesets"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+            new ImageProvider("dialogs", "select").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -316,14 +315,14 @@ public class ChangesetDialog extends ToggleDialog {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            if (!Main.main.hasEditLayer())
+            if (Main.getLayerManager().getEditLayer() == null)
                 return;
             ChangesetListModel model = getCurrentChangesetListModel();
             Set<Integer> sel = model.getSelectedChangesetIds();
             if (sel.isEmpty())
                 return;
 
-            DataSet ds = Main.main.getEditLayer().data;
+            DataSet ds = Main.getLayerManager().getEditLayer().data;
             selectObjectsByChangesetIds(ds, sel);
         }
 
@@ -351,7 +350,7 @@ public class ChangesetDialog extends ToggleDialog {
         ReadChangesetsAction() {
             putValue(NAME, tr("Download"));
             putValue(SHORT_DESCRIPTION, tr("Download information about the selected changesets from the OSM server"));
-            putValue(SMALL_ICON, ImageProvider.get("download"));
+            new ImageProvider("download").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -388,7 +387,7 @@ public class ChangesetDialog extends ToggleDialog {
         CloseOpenChangesetsAction() {
             putValue(NAME, tr("Close open changesets"));
             putValue(SHORT_DESCRIPTION, tr("Closes the selected open changesets"));
-            putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
+            new ImageProvider("closechangeset").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -423,7 +422,7 @@ public class ChangesetDialog extends ToggleDialog {
         ShowChangesetInfoAction() {
             putValue(NAME, tr("Show info"));
             putValue(SHORT_DESCRIPTION, tr("Open a web page for each selected changeset"));
-            putValue(SMALL_ICON, ImageProvider.get("help/internet"));
+            new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -463,7 +462,7 @@ public class ChangesetDialog extends ToggleDialog {
         LaunchChangesetManagerAction() {
             putValue(NAME, tr("Details"));
             putValue(SHORT_DESCRIPTION, tr("Opens the Changeset Manager window for the selected changesets"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "changesetmanager"));
+            new ImageProvider("dialogs/changeset", "changesetmanager").getResource().attachImageIcon(this, true);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
index e86f031..8cb5934 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
@@ -38,6 +38,7 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.PseudoCommand;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -267,7 +268,7 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
      */
     private void buildTrees() {
         setTitle(tr("Command Stack"));
-        if (!Main.main.hasEditLayer())
+        if (Main.getLayerManager().getEditLayer() == null)
             return;
 
         List<Command> undoCommands = Main.main.undoRedo.commands;
@@ -344,7 +345,7 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
      */
     protected static FilteredCollection<? extends OsmPrimitive> getAffectedPrimitives(TreePath path) {
         PseudoCommand c = ((CommandListMutableTreeNode) path.getLastPathComponent()).getCommand();
-        final OsmDataLayer currentLayer = Main.main.getEditLayer();
+        final OsmDataLayer currentLayer = Main.getLayerManager().getEditLayer();
         return new FilteredCollection<>(
                 c.getParticipatingPrimitives(),
                 new Predicate<OsmPrimitive>() {
@@ -375,7 +376,7 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
         public SelectAction() {
             putValue(NAME, tr("Select"));
             putValue(SHORT_DESCRIPTION, tr("Selects the objects that take part in this command (unless currently deleted)"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+            new ImageProvider("dialogs", "select").getResource().attachImageIcon(this, true);
         }
 
         @Override
@@ -388,9 +389,9 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
             } else
                 throw new IllegalStateException();
 
-            OsmDataLayer editLayer = Main.main.getEditLayer();
-            if (editLayer == null) return;
-            editLayer.data.setSelected(getAffectedPrimitives(path));
+            DataSet dataSet = Main.getLayerManager().getEditDataSet();
+            if (dataSet == null) return;
+            dataSet.setSelected(getAffectedPrimitives(path));
         }
 
         @Override
@@ -410,13 +411,12 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
             putValue(NAME, tr("Select and zoom"));
             putValue(SHORT_DESCRIPTION,
                     tr("Selects the objects that take part in this command (unless currently deleted), then and zooms to it"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/autoscale", "selection"));
+            new ImageProvider("dialogs/autoscale", "selection").getResource().attachImageIcon(this, true);
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             super.actionPerformed(e);
-            if (!Main.main.hasEditLayer()) return;
             AutoScaleAction.autoScale("selection");
         }
     }
@@ -446,12 +446,12 @@ public class CommandStackDialog extends ToggleDialog implements CommandQueueList
                 tree = undoTree;
                 putValue(NAME, tr("Undo"));
                 putValue(SHORT_DESCRIPTION, tr("Undo the selected and all later commands"));
-                putValue(SMALL_ICON, ImageProvider.get("undo"));
+                new ImageProvider("undo").getResource().attachImageIcon(this, true);
             } else {
                 tree = redoTree;
                 putValue(NAME, tr("Redo"));
                 putValue(SHORT_DESCRIPTION, tr("Redo the selected and all earlier commands"));
-                putValue(SMALL_ICON, ImageProvider.get("redo"));
+                new ImageProvider("redo").getResource().attachImageIcon(this, true);
             }
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
index 0b3bb7e..a58dacf 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
@@ -54,13 +54,14 @@ import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.conflict.pair.ConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -72,7 +73,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  * dialog on the right of the main frame.
  * @since 86
  */
-public final class ConflictDialog extends ToggleDialog implements MapView.EditLayerChangeListener, IConflictListener, SelectionChangedListener {
+public final class ConflictDialog extends ToggleDialog implements ActiveLayerChangeListener, IConflictListener, SelectionChangedListener {
 
     /** the collection of conflicts displayed by this conflict dialog */
     private transient ConflictCollection conflicts;
@@ -169,13 +170,13 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
     @Override
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        MapView.addEditLayerChangeListener(this, true);
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
         refreshView();
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
 
@@ -232,7 +233,7 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
      * refreshes the view of this dialog
      */
     public void refreshView() {
-        OsmDataLayer editLayer =  Main.main.getEditLayer();
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         conflicts = editLayer == null ? new ConflictCollection() : editLayer.getConflicts();
         GuiHelper.runInEDT(new Runnable() {
             @Override
@@ -278,10 +279,12 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
     }
 
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        OsmDataLayer oldLayer = e.getPreviousEditLayer();
         if (oldLayer != null) {
             oldLayer.getConflicts().removeConflictListener(this);
         }
+        OsmDataLayer newLayer = e.getSource().getEditLayer();
         if (newLayer != null) {
             newLayer.getConflicts().addConflictListener(this);
         }
@@ -429,8 +432,8 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
     class ResolveAction extends AbstractAction implements ListSelectionListener {
         ResolveAction() {
             putValue(NAME, tr("Resolve"));
-            putValue(SHORT_DESCRIPTION,  tr("Open a merge dialog of all selected items in the list above."));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "conflict"));
+            putValue(SHORT_DESCRIPTION, tr("Open a merge dialog of all selected items in the list above."));
+            new ImageProvider("dialogs", "conflict").getResource().attachImageIcon(this, true);
             putValue("help", ht("/Dialog/ConflictList#ResolveAction"));
         }
 
@@ -456,7 +459,7 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
             for (OsmPrimitive o : lstConflicts.getSelectedValuesList()) {
                 sel.add(o);
             }
-            DataSet ds = Main.main.getCurrentDataSet();
+            DataSet ds = Main.getLayerManager().getEditDataSet();
             if (ds != null) { // Can't see how it is possible but it happened in #7942
                 ds.setSelected(sel);
             }
@@ -476,7 +479,7 @@ public final class ConflictDialog extends ToggleDialog implements MapView.EditLa
             this.name = name;
             this.type = type;
             putValue(NAME, name);
-            putValue(SHORT_DESCRIPTION,  description);
+            putValue(SHORT_DESCRIPTION, description);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
index b826c4e..fcd2344 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
@@ -51,6 +51,12 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
     }
 
     @Override
+    public void addNotify() {
+        super.addNotify();
+        registerListeners();
+    }
+
+    @Override
     public void setVisible(boolean isVisible) {
         String geom = getClass().getName() + ".geometry";
         if (isVisible) {
@@ -61,7 +67,6 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
             if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
                 new WindowGeometry(this).remember(geom);
             }
-            unregisterListeners();
         }
         super.setVisible(isVisible);
     }
@@ -98,6 +103,7 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
 
     private void registerListeners() {
         resolver.addPropertyChangeListener(applyResolutionAction);
+        resolver.registerListeners();
     }
 
     private void unregisterListeners() {
@@ -125,8 +131,6 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
 
         resolver.addPropertyChangeListener(this);
         HelpUtil.setHelpContext(this.getRootPane(), ht("Dialog/Conflict"));
-
-        registerListeners();
     }
 
     /**
@@ -157,7 +161,7 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
         CancelAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Cancel conflict resolution and close the dialog"));
             putValue(Action.NAME, tr("Cancel"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("", "cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             setEnabled(true);
         }
 
@@ -174,7 +178,7 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
         HelpAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Show help information"));
             putValue(Action.NAME, tr("Help"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("help"));
+            new ImageProvider("help").getResource().attachImageIcon(this);
             setEnabled(true);
         }
 
@@ -192,7 +196,7 @@ public class ConflictResolutionDialog extends JDialog implements PropertyChangeL
         ApplyResolutionAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Apply resolved conflicts and close the dialog"));
             putValue(Action.NAME, tr("Apply Resolution"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("dialogs", "conflict"));
+            new ImageProvider("dialogs", "conflict").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java b/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
index 0419334..4e4a590 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
@@ -161,7 +161,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
     public void setVisible(boolean visible) {
         if (visible) {
             new WindowGeometry(
-                    getClass().getName()  + ".geometry",
+                    getClass().getName() + ".geometry",
                     WindowGeometry.centerInWindow(
                             Main.parent,
                             new Dimension(400, 200)
@@ -318,7 +318,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
     class OKAction extends AbstractAction {
         OKAction() {
             putValue(NAME, tr("OK"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and remove the object from the relations"));
         }
 
@@ -332,7 +332,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
     class CancelAction extends AbstractAction {
         CancelAction() {
             putValue(NAME, tr("Cancel"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and to abort deleting the objects"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
index 0f700f8..1e30b81 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
@@ -16,6 +16,7 @@ import org.openstreetmap.josm.gui.widgets.MultiSplitLayout.Split;
 import org.openstreetmap.josm.gui.widgets.MultiSplitPane;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Destroyable;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
 
 /**
  * This is the panel displayed on the right side of JOSM. It displays a list of panels.
@@ -322,7 +323,11 @@ public class DialogsPanel extends JPanel implements Destroyable {
     @Override
     public void destroy() {
         for (ToggleDialog t : allDialogs) {
-            t.destroy();
+            try {
+                t.destroy();
+            } catch (RuntimeException e) {
+                throw BugReport.intercept(e).put("dialog", t).put("dialog-class", t.getClass());
+            }
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
index 1be255e..3ebf398 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
@@ -139,8 +139,8 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
         SideButton addButton = new SideButton(new AbstractAction() {
             {
                 putValue(NAME, tr("Add"));
-                putValue(SHORT_DESCRIPTION,  tr("Add filter."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "add"));
+                putValue(SHORT_DESCRIPTION, tr("Add filter."));
+                new ImageProvider("dialogs", "add").getResource().attachImageIcon(this, true);
             }
 
             @Override
@@ -155,7 +155,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
             {
                 putValue(NAME, tr("Edit"));
                 putValue(SHORT_DESCRIPTION, tr("Edit filter."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+                new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);
             }
 
             @Override
@@ -173,7 +173,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
             {
                 putValue(NAME, tr("Delete"));
                 putValue(SHORT_DESCRIPTION, tr("Delete filter."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+                new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
             }
 
             @Override
@@ -188,7 +188,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
             {
                 putValue(NAME, tr("Up"));
                 putValue(SHORT_DESCRIPTION, tr("Move filter up."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "up"));
+                new ImageProvider("dialogs", "up").getResource().attachImageIcon(this, true);
             }
 
             @Override
@@ -204,7 +204,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
             {
                 putValue(NAME, tr("Down"));
                 putValue(SHORT_DESCRIPTION, tr("Move filter down."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "down"));
+                new ImageProvider("dialogs", "down").getResource().attachImageIcon(this, true);
             }
 
             @Override
@@ -409,7 +409,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
         }
     }
 
-    private class EnableFilterAction extends AbstractFilterAction  {
+    private class EnableFilterAction extends AbstractFilterAction {
 
         EnableFilterAction() {
             putValue(SHORT_DESCRIPTION, tr("Enable filter"));
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
index 79a56b2..ac59460 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
@@ -76,7 +76,7 @@ public class FilterTableModel extends AbstractTableModel {
     }
 
     public void executeFilters() {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         boolean changed = false;
         if (ds == null) {
             disabledAndHiddenCount = 0;
@@ -123,7 +123,7 @@ public class FilterTableModel extends AbstractTableModel {
     }
 
     public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds == null)
             return;
 
@@ -176,7 +176,7 @@ public class FilterTableModel extends AbstractTableModel {
     }
 
     public void clearFilterFlags() {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds != null) {
             FilterWorker.clearFilterFlags(ds.allPrimitives());
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
index 26b3fc3..a83517a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
@@ -124,7 +124,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
     }
 
     protected static String buildMapPaintText() {
-        final Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getAllSelected();
+        final Collection<OsmPrimitive> sel = Main.getLayerManager().getEditDataSet().getAllSelected();
         ElemStyles elemstyles = MapPaintStyles.getStyles();
         NavigatableComponent nc = Main.map.mapView;
         double scale = nc.getDist100Pixel();
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
index d1917bd..dadfdb3 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
@@ -174,8 +174,9 @@ public class LayerListDialog extends ToggleDialog {
     /**
      * Creates a layer list and attach it to the given mapView.
      * @param layerManager The layer manager this list is for
+     * @since 10467
      */
-    private LayerListDialog(MainLayerManager layerManager) {
+    public LayerListDialog(MainLayerManager layerManager) {
         super(tr("Layers"), "layerlist", tr("Open a list of all loaded layers."),
                 Shortcut.registerShortcut("subwindow:layers", tr("Toggle: {0}", tr("Layers")), KeyEvent.VK_L,
                         Shortcut.ALT_SHIFT), 100, true);
@@ -185,11 +186,11 @@ public class LayerListDialog extends ToggleDialog {
         //
         DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
         selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-        model = new LayerListModel(selectionModel);
+        model = new LayerListModel(layerManager, selectionModel);
 
         // create the list control
         //
-        layerList = new LayerList(model, layerManager);
+        layerList = new LayerList(model);
         layerList.setSelectionModel(selectionModel);
         layerList.addMouseListener(new PopupMenuHandler());
         layerList.setBackground(UIManager.getColor("Button.background"));
@@ -329,17 +330,17 @@ public class LayerListDialog extends ToggleDialog {
 
     @Override
     public void showNotify() {
-        MapView.addLayerChangeListener(activateLayerAction);
-        layerManager.addLayerChangeListener(model);
-        layerManager.addActiveLayerChangeListener(model, true);
+        layerManager.addActiveLayerChangeListener(activateLayerAction);
+        layerManager.addLayerChangeListener(model, true);
+        layerManager.addAndFireActiveLayerChangeListener(model);
         model.populate();
     }
 
     @Override
     public void hideNotify() {
-        layerManager.removeLayerChangeListener(model);
+        layerManager.removeLayerChangeListener(model, true);
         layerManager.removeActiveLayerChangeListener(model);
-        MapView.removeLayerChangeListener(activateLayerAction);
+        layerManager.removeActiveLayerChangeListener(activateLayerAction);
     }
 
     /**
@@ -648,13 +649,15 @@ public class LayerListDialog extends ToggleDialog {
         private final DefaultListSelectionModel selectionModel;
         private final CopyOnWriteArrayList<LayerListModelListener> listeners;
         private LayerList layerList;
+        private final MainLayerManager layerManager;
 
         /**
          * constructor
-         *
+         * @param layerManager The layer manager to use for the list.
          * @param selectionModel the list selection model
          */
-        LayerListModel(DefaultListSelectionModel selectionModel) {
+        LayerListModel(MainLayerManager layerManager, DefaultListSelectionModel selectionModel) {
+            this.layerManager = layerManager;
             this.selectionModel = selectionModel;
             listeners = new CopyOnWriteArrayList<>();
         }
@@ -663,13 +666,12 @@ public class LayerListDialog extends ToggleDialog {
             this.layerList = layerList;
         }
 
-        private MainLayerManager getLayerManager() {
-            // layerList should never be null. But if it is, we should not crash.
-            if (layerList == null) {
-                return new MainLayerManager();
-            } else {
-                return layerList.getLayerManager();
-            }
+        /**
+         * The layer manager this model is for.
+         * @return The layer manager.
+         */
+        public MainLayerManager getLayerManager() {
+            return layerManager;
         }
 
         /**
@@ -1124,11 +1126,9 @@ public class LayerListDialog extends ToggleDialog {
      * This component displays a list of layers and provides the methods needed by {@link LayerListModel}.
      */
     static class LayerList extends JTable {
-        private final transient MainLayerManager layerManager;
 
-        LayerList(LayerListModel dataModel, MainLayerManager layerManager) {
+        LayerList(LayerListModel dataModel) {
             super(dataModel);
-            this.layerManager = layerManager;
             dataModel.setLayerList(this);
         }
 
@@ -1141,15 +1141,6 @@ public class LayerListDialog extends ToggleDialog {
             rect.setLocation(rect.x - pt.x, rect.y - pt.y);
             viewport.scrollRectToVisible(rect);
         }
-
-        /**
-         * Gets you the layer manager used for this list.
-         * @return The layer manager.
-         * @since 10288
-         */
-        public MainLayerManager getLayerManager() {
-            return layerManager;
-        }
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
index 29e34e7..5192081 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
@@ -341,7 +341,7 @@ public class MapPaintDialog extends ToggleDialog {
         public OnOffAction() {
             putValue(NAME, tr("On/Off"));
             putValue(SHORT_DESCRIPTION, tr("Turn selected styles on or off"));
-            putValue(SMALL_ICON, ImageProvider.get("apply"));
+            new ImageProvider("apply").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -379,7 +379,7 @@ public class MapPaintDialog extends ToggleDialog {
         public MoveUpDownAction(boolean isDown) {
             increment = isDown ? 1 : -1;
             putValue(NAME, isDown ? tr("Down") : tr("Up"));
-            putValue(SMALL_ICON, isDown ? ImageProvider.get("dialogs", "down") : ImageProvider.get("dialogs", "up"));
+            new ImageProvider("dialogs", isDown ? "down" : "up").getResource().attachImageIcon(this, true);
             putValue(SHORT_DESCRIPTION, isDown ? tr("Move the selected entry one row down.") : tr("Move the selected entry one row up."));
             updateEnabledState();
         }
@@ -414,7 +414,7 @@ public class MapPaintDialog extends ToggleDialog {
         public ReloadAction() {
             putValue(NAME, tr("Reload from file"));
             putValue(SHORT_DESCRIPTION, tr("reload selected styles from file"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
+            new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
             setEnabled(getEnabledState());
         }
 
@@ -465,7 +465,7 @@ public class MapPaintDialog extends ToggleDialog {
         public SaveAsAction() {
             putValue(NAME, tr("Save as..."));
             putValue(SHORT_DESCRIPTION, tr("Save a copy of this Style to file and add it to the list"));
-            putValue(SMALL_ICON, ImageProvider.get("copy"));
+            new ImageProvider("copy").getResource().attachImageIcon(this);
             setEnabled(tblStyles.getSelectedRows().length == 1);
         }
 
@@ -561,7 +561,7 @@ public class MapPaintDialog extends ToggleDialog {
         public InfoAction() {
             putValue(NAME, tr("Info"));
             putValue(SHORT_DESCRIPTION, tr("view meta information, error log and source definition"));
-            putValue(SMALL_ICON, ImageProvider.get("info"));
+            new ImageProvider("info").getResource().attachImageIcon(this);
             setEnabled(tblStyles.getSelectedRows().length == 1);
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
index 7659768..c543630 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
@@ -5,7 +5,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Image;
 import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -38,12 +37,13 @@ import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.notes.Note.State;
 import org.openstreetmap.josm.data.notes.NoteComment;
 import org.openstreetmap.josm.data.osm.NoteData;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NoteInputDialog;
 import org.openstreetmap.josm.gui.NoteSortDialog;
 import org.openstreetmap.josm.gui.SideButton;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.NoteLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.date.DateUtils;
@@ -55,26 +55,6 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  */
 public class NotesDialog extends ToggleDialog implements LayerChangeListener {
 
-    /** Small icon size for use in graphics calculations */
-    public static final int ICON_SMALL_SIZE = 16;
-    /** 24x24 icon for unresolved notes */
-    public static final ImageIcon ICON_OPEN = ImageProvider.get("dialogs/notes", "note_open");
-    /** 16x16 icon for unresolved notes */
-    public static final ImageIcon ICON_OPEN_SMALL =
-            new ImageIcon(ICON_OPEN.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** 24x24 icon for resolved notes */
-    public static final ImageIcon ICON_CLOSED = ImageProvider.get("dialogs/notes", "note_closed");
-    /** 16x16 icon for resolved notes */
-    public static final ImageIcon ICON_CLOSED_SMALL =
-            new ImageIcon(ICON_CLOSED.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** 24x24 icon for new notes */
-    public static final ImageIcon ICON_NEW = ImageProvider.get("dialogs/notes", "note_new");
-    /** 16x16 icon for new notes */
-    public static final ImageIcon ICON_NEW_SMALL =
-            new ImageIcon(ICON_NEW.getImage().getScaledInstance(ICON_SMALL_SIZE, ICON_SMALL_SIZE, Image.SCALE_SMOOTH));
-    /** Icon for note comments */
-    public static final ImageIcon ICON_COMMENT = ImageProvider.get("dialogs/notes", "note_comment");
-
     private NoteTableModel model;
     private JList<Note> displayList;
     private final AddCommentAction addCommentAction;
@@ -98,7 +78,7 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         sortAction = new SortAction();
         uploadAction = new UploadNotesAction();
         buildDialog();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     private void buildDialog() {
@@ -169,22 +149,17 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        if (newLayer instanceof NoteLayer) {
-            noteData = ((NoteLayer) newLayer).getNoteData();
+    public void layerAdded(LayerAddEvent e) {
+        if (e.getAddedLayer() instanceof NoteLayer) {
+            noteData = ((NoteLayer) e.getAddedLayer()).getNoteData();
             model.setData(noteData.getNotes());
             setNotes(noteData.getSortedNotes());
         }
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof NoteLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() instanceof NoteLayer) {
             noteData = null;
             model.clearData();
             if (Main.map.mapMode instanceof AddNoteAction) {
@@ -193,6 +168,11 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         }
     }
 
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
+    }
+
     /**
      * Sets the list of notes to be displayed in the dialog.
      * The dialog should match the notes displayed in the note layer.
@@ -255,11 +235,11 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
                 }
                 ImageIcon icon;
                 if (note.getId() < 0) {
-                    icon = ICON_NEW_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_new", ImageProvider.ImageSizes.SMALLICON);
                 } else if (note.getState() == State.CLOSED) {
-                    icon = ICON_CLOSED_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_closed", ImageProvider.ImageSizes.SMALLICON);
                 } else {
-                    icon = ICON_OPEN_SMALL;
+                    icon = ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
                 }
                 jlabel.setIcon(icon);
             }
@@ -311,7 +291,7 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         AddCommentAction() {
             putValue(SHORT_DESCRIPTION, tr("Add comment"));
             putValue(NAME, tr("Comment"));
-            putValue(SMALL_ICON, ICON_COMMENT);
+            new ImageProvider("dialogs/notes", "note_comment").getResource().attachImageIcon(this, true);
         }
 
         @Override
@@ -325,7 +305,7 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
                 return;
             }
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Comment on note"), tr("Add comment"));
-            dialog.showNoteDialog(tr("Add comment to note:"), NotesDialog.ICON_COMMENT);
+            dialog.showNoteDialog(tr("Add comment to note:"), ImageProvider.get("dialogs/notes", "note_comment"));
             if (dialog.getValue() != 1) {
                 return;
             }
@@ -343,13 +323,13 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         CloseAction() {
             putValue(SHORT_DESCRIPTION, tr("Close note"));
             putValue(NAME, tr("Close"));
-            putValue(SMALL_ICON, ICON_CLOSED);
+            new ImageProvider("dialogs/notes", "note_closed").getResource().attachImageIcon(this, true);
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Close note"), tr("Close note"));
-            dialog.showNoteDialog(tr("Close note with message:"), NotesDialog.ICON_CLOSED);
+            dialog.showNoteDialog(tr("Close note with message:"), ImageProvider.get("dialogs/notes", "note_closed"));
             if (dialog.getValue() != 1) {
                 return;
             }
@@ -368,13 +348,13 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         NewAction() {
             putValue(SHORT_DESCRIPTION, tr("Create a new note"));
             putValue(NAME, tr("Create"));
-            putValue(SMALL_ICON, ICON_NEW);
+            new ImageProvider("dialogs/notes", "note_new").getResource().attachImageIcon(this, true);
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             if (noteData == null) { //there is no notes layer. Create one first
-                Main.map.mapView.addLayer(new NoteLayer());
+                Main.getLayerManager().addLayer(new NoteLayer());
             }
             Main.map.selectMapMode(new AddNoteAction(Main.map, noteData));
         }
@@ -388,13 +368,13 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         ReopenAction() {
             putValue(SHORT_DESCRIPTION, tr("Reopen note"));
             putValue(NAME, tr("Reopen"));
-            putValue(SMALL_ICON, ICON_OPEN);
+            new ImageProvider("dialogs/notes", "note_open").getResource().attachImageIcon(this, true);
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
             NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Reopen note"), tr("Reopen note"));
-            dialog.showNoteDialog(tr("Reopen note with message:"), NotesDialog.ICON_OPEN);
+            dialog.showNoteDialog(tr("Reopen note with message:"), ImageProvider.get("dialogs/notes", "note_open"));
             if (dialog.getValue() != 1) {
                 return;
             }
@@ -414,7 +394,7 @@ public class NotesDialog extends ToggleDialog implements LayerChangeListener {
         SortAction() {
             putValue(SHORT_DESCRIPTION, tr("Sort notes"));
             putValue(NAME, tr("Sort"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "sort"));
+            new ImageProvider("dialogs", "sort").getResource().attachImageIcon(this, true);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
index 290475d..1d21f39 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
@@ -61,13 +61,18 @@ import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
@@ -82,8 +87,7 @@ import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
- * A dialog showing all known relations, with buttons to add, edit, and
- * delete them.
+ * A dialog showing all known relations, with buttons to add, edit, and delete them.
  *
  * We don't have such dialogs for nodes, segments, and ways, because those
  * objects are visible on the map and can be selected there. Relations are not.
@@ -219,7 +223,8 @@ public class RelationListDialog extends ToggleDialog
 
     @Override
     public void showNotify() {
-        MapView.addLayerChangeListener(newAction);
+        Main.getLayerManager().addLayerChangeListener(newAction);
+        Main.getLayerManager().addActiveLayerChangeListener(newAction);
         MapView.addZoomChangeListener(this);
         newAction.updateEnabledState();
         DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT);
@@ -231,7 +236,8 @@ public class RelationListDialog extends ToggleDialog
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(newAction);
+        Main.getLayerManager().removeActiveLayerChangeListener(newAction);
+        Main.getLayerManager().removeLayerChangeListener(newAction);
         MapView.removeZoomChangeListener(this);
         DatasetEventManager.getInstance().removeDatasetListener(this);
         DataSet.removeSelectionListener(addSelectionToRelations);
@@ -298,7 +304,7 @@ public class RelationListDialog extends ToggleDialog
         }
     }
 
-    private JosmTextField  setupFilter() {
+    private JosmTextField setupFilter() {
         final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
         f.setToolTipText(tr("Relation list filter"));
         final CompileSearchTextDecorator decorator = CompileSearchTextDecorator.decorate(f);
@@ -323,7 +329,7 @@ public class RelationListDialog extends ToggleDialog
         }
 
         protected void setCurrentRelationAsSelection() {
-            Main.main.getCurrentDataSet().setSelected(displaylist.getSelectedValue());
+            Main.getLayerManager().getEditDataSet().setSelected(displaylist.getSelectedValue());
         }
 
         protected void editCurrentRelation() {
@@ -332,7 +338,7 @@ public class RelationListDialog extends ToggleDialog
 
         @Override
         public void mouseClicked(MouseEvent e) {
-            if (!Main.main.hasEditLayer()) return;
+            if (Main.getLayerManager().getEditLayer() == null) return;
             if (isDoubleClick(e)) {
                 if (e.isControlDown()) {
                     editCurrentRelation();
@@ -344,19 +350,18 @@ public class RelationListDialog extends ToggleDialog
     }
 
     /**
-     * The action for creating a new relation
-     *
+     * The action for creating a new relation.
      */
-    static class NewAction extends AbstractAction implements LayerChangeListener {
+    static class NewAction extends AbstractAction implements LayerChangeListener, ActiveLayerChangeListener {
         NewAction() {
             putValue(SHORT_DESCRIPTION, tr("Create a new relation"));
             putValue(NAME, tr("New"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "addrelation"));
+            new ImageProvider("dialogs", "addrelation").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
         public void run() {
-            RelationEditor.getEditor(Main.main.getEditLayer(), null, null).setVisible(true);
+            RelationEditor.getEditor(Main.getLayerManager().getEditLayer(), null, null).setVisible(true);
         }
 
         @Override
@@ -365,23 +370,28 @@ public class RelationListDialog extends ToggleDialog
         }
 
         protected void updateEnabledState() {
-            setEnabled(Main.main != null && Main.main.hasEditLayer());
+            setEnabled(Main.getLayerManager().getEditLayer() != null);
         }
 
         @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
 
         @Override
-        public void layerAdded(Layer newLayer) {
+        public void layerAdded(LayerAddEvent e) {
             updateEnabledState();
         }
 
         @Override
-        public void layerRemoved(Layer oldLayer) {
+        public void layerRemoving(LayerRemoveEvent e) {
             updateEnabledState();
         }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // Do nothing
+        }
     }
 
     /**
@@ -410,7 +420,7 @@ public class RelationListDialog extends ToggleDialog
         }
 
         public void setRelations(Collection<Relation> relations) {
-            List<Relation> sel =  getSelectedRelations();
+            List<Relation> sel = getSelectedRelations();
             this.relations.clear();
             this.filteredRelations = null;
             if (relations == null) {
@@ -683,7 +693,7 @@ public class RelationListDialog extends ToggleDialog
 
     @Override
     public void dataChanged(DataChangedEvent event) {
-        initFromLayer(Main.main.getEditLayer());
+        initFromLayer(Main.getLayerManager().getEditLayer());
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
index 2b5cc22..3f56870 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
@@ -45,6 +45,7 @@ import org.openstreetmap.josm.actions.relation.SelectInRelationListAction;
 import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 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;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
@@ -64,13 +65,13 @@ import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
@@ -86,7 +87,7 @@ import org.openstreetmap.josm.tools.Utils;
  * A small tool dialog for displaying the current selection.
  * @since 8
  */
-public class SelectionListDialog extends ToggleDialog  {
+public class SelectionListDialog extends ToggleDialog {
     private JList<OsmPrimitive> lstPrimitives;
     private final DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
     private final SelectionListModel model = new SelectionListModel(selectionModel);
@@ -176,24 +177,19 @@ public class SelectionListDialog extends ToggleDialog  {
 
     @Override
     public void showNotify() {
-        MapView.addEditLayerChangeListener(model);
         SelectionEventManager.getInstance().addSelectionListener(actShowHistory, FireMode.IN_EDT_CONSOLIDATED);
         SelectionEventManager.getInstance().addSelectionListener(model, FireMode.IN_EDT_CONSOLIDATED);
         DatasetEventManager.getInstance().addDatasetListener(model, FireMode.IN_EDT);
-        MapView.addEditLayerChangeListener(actSearch);
-        // editLayerChanged also gets the selection history of the level
-        OsmDataLayer editLayer = Main.main.getEditLayer();
-        model.editLayerChanged(null, editLayer);
-        if (editLayer != null) {
-            model.setJOSMSelection(editLayer.data.getAllSelected());
-        }
+        Main.getLayerManager().addActiveLayerChangeListener(actSearch);
+        // editLayerChanged also gets the selection history of the level. Listener calls setJOSMSelection when fired.
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(model);
         actSearch.updateEnabledState();
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeEditLayerChangeListener(actSearch);
-        MapView.removeEditLayerChangeListener(model);
+        Main.getLayerManager().removeActiveLayerChangeListener(actSearch);
+        Main.getLayerManager().removeActiveLayerChangeListener(model);
         SelectionEventManager.getInstance().removeSelectionListener(actShowHistory);
         SelectionEventManager.getInstance().removeSelectionListener(model);
         DatasetEventManager.getInstance().removeDatasetListener(model);
@@ -215,7 +211,7 @@ public class SelectionListDialog extends ToggleDialog  {
             int idx = lstPrimitives.locationToIndex(e.getPoint());
             if (idx < 0) return;
             if (isDoubleClick(e)) {
-                OsmDataLayer layer = Main.main.getEditLayer();
+                OsmDataLayer layer = Main.getLayerManager().getEditLayer();
                 if (layer == null) return;
                 OsmPrimitive osm = model.getElementAt(idx);
                 Collection<OsmPrimitive> sel = layer.data.getSelected();
@@ -295,14 +291,14 @@ public class SelectionListDialog extends ToggleDialog  {
     /**
      * Launches the search dialog
      */
-    static class SearchAction extends AbstractAction implements EditLayerChangeListener {
+    static class SearchAction extends AbstractAction implements ActiveLayerChangeListener {
         /**
          * Constructs a new {@code SearchAction}.
          */
         SearchAction() {
             putValue(NAME, tr("Search"));
-            putValue(SHORT_DESCRIPTION,   tr("Search for objects"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+            putValue(SHORT_DESCRIPTION, tr("Search for objects"));
+            new ImageProvider("dialogs", "search").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -313,11 +309,11 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         protected void updateEnabledState() {
-            setEnabled(Main.main != null && Main.main.hasEditLayer());
+            setEnabled(Main.getLayerManager().getEditLayer() != null);
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
@@ -338,14 +334,14 @@ public class SelectionListDialog extends ToggleDialog  {
         public void actionPerformed(ActionEvent e) {
             Collection<OsmPrimitive> sel = model.getSelected();
             if (sel.isEmpty()) return;
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer == null) return;
             editLayer.data.setSelected(sel);
             model.selectionModel.setSelectionInterval(0, sel.size()-1);
         }
 
         protected void updateEnabledState() {
-            setEnabled(!model.getSelected().isEmpty());
+            setEnabled(!model.isSelectionEmpty());
         }
 
         @Override
@@ -364,7 +360,7 @@ public class SelectionListDialog extends ToggleDialog  {
         ShowHistoryAction() {
             putValue(NAME, tr("History"));
             putValue(SHORT_DESCRIPTION, tr("Display the history of the selected objects."));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "history"));
+            new ImageProvider("dialogs", "history").getResource().attachImageIcon(this, true);
             updateEnabledState(model.getSize());
         }
 
@@ -381,7 +377,7 @@ public class SelectionListDialog extends ToggleDialog  {
 
         protected void updateEnabledState(int osmSelectionSize) {
             // See #10830 - allow to click on history button is a single object is selected, even if not selected again in the list
-            setEnabled(!model.getSelected().isEmpty() || osmSelectionSize == 1);
+            setEnabled(!model.isSelectionEmpty() || osmSelectionSize == 1);
         }
 
         @Override
@@ -404,7 +400,7 @@ public class SelectionListDialog extends ToggleDialog  {
         ZoomToJOSMSelectionAction() {
             putValue(NAME, tr("Zoom to selection"));
             putValue(SHORT_DESCRIPTION, tr("Zoom to selection"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/autoscale", "selection"));
+            new ImageProvider("dialogs/autoscale", "selection").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -445,7 +441,7 @@ public class SelectionListDialog extends ToggleDialog  {
         ZoomToListSelection() {
             putValue(NAME, tr("Zoom to selected element(s)"));
             putValue(SHORT_DESCRIPTION, tr("Zoom to selected element(s)"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/autoscale", "selection"));
+            new ImageProvider("dialogs/autoscale", "selection").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -462,7 +458,7 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         protected void updateEnabledState() {
-            setEnabled(!model.getSelected().isEmpty());
+            setEnabled(!model.isSelectionEmpty());
         }
 
         @Override
@@ -479,7 +475,7 @@ public class SelectionListDialog extends ToggleDialog  {
      *
      */
     private static class SelectionListModel extends AbstractListModel<OsmPrimitive>
-    implements EditLayerChangeListener, SelectionChangedListener, DataSetListener {
+    implements ActiveLayerChangeListener, SelectionChangedListener, DataSetListener {
 
         private static final int SELECTION_HISTORY_SIZE = 10;
 
@@ -564,8 +560,16 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         /**
-         * Replies the collection of OSM primitives currently selected in the view
-         * of this model
+         * Determines if no OSM primitives are currently selected.
+         * @return {@code true} if no OSM primitives are currently selected
+         * @since 10383
+         */
+        public boolean isSelectionEmpty() {
+            return selectionModel.isSelectionEmpty();
+        }
+
+        /**
+         * Replies the collection of OSM primitives currently selected in the view of this model
          *
          * @return choosen elements in the view
          */
@@ -671,16 +675,17 @@ public class SelectionListDialog extends ToggleDialog  {
         }
 
         /* ------------------------------------------------------------------------ */
-        /* interface EditLayerChangeListener                                        */
+        /* interface ActiveLayerChangeListener                                      */
         /* ------------------------------------------------------------------------ */
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-            if (newLayer == null) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            DataSet newData = e.getSource().getEditDataSet();
+            if (newData == null) {
                 setJOSMSelection(null);
                 history = null;
             } else {
-                history = newLayer.data.getSelectionHistory();
-                setJOSMSelection(newLayer.data.getAllSelected());
+                history = newData.getSelectionHistory();
+                setJOSMSelection(newData.getAllSelected());
             }
         }
 
@@ -841,7 +846,7 @@ public class SelectionListDialog extends ToggleDialog  {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            Main.main.getCurrentDataSet().setSelected(sel);
+            Main.getLayerManager().getEditDataSet().setSelected(sel);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
index 936241b..18f3f09 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
@@ -33,6 +33,7 @@ import java.util.List;
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
@@ -161,14 +162,14 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
      */
     protected JCheckBoxMenuItem windowMenuItem;
 
-    private final JRadioButtonMenuItem alwaysShown  = new JRadioButtonMenuItem(new AbstractAction(tr("Always shown")) {
+    private final JRadioButtonMenuItem alwaysShown = new JRadioButtonMenuItem(new AbstractAction(tr("Always shown")) {
         @Override
         public void actionPerformed(ActionEvent e) {
             setIsButtonHiding(ButtonHidingType.ALWAYS_SHOWN);
         }
     });
 
-    private final JRadioButtonMenuItem dynamic      = new JRadioButtonMenuItem(new AbstractAction(tr("Dynamic")) {
+    private final JRadioButtonMenuItem dynamic = new JRadioButtonMenuItem(new AbstractAction(tr("Dynamic")) {
         @Override
         public void actionPerformed(ActionEvent e) {
             setIsButtonHiding(ButtonHidingType.DYNAMIC);
@@ -255,6 +256,14 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
         Main.redirectToMainContentPane(this);
         Main.pref.addPreferenceChangeListener(this);
 
+        registerInWindowMenu();
+    }
+
+    /**
+     * Registers this dialog in the window menu. Called in the constructor.
+     * @since 10467
+     */
+    protected void registerInWindowMenu() {
         windowMenuItem = MainMenu.addWithCheckbox(Main.main.menu.windowMenu,
                 (JosmAction) getToggleAction(),
                 MainMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG);
@@ -299,6 +308,11 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
                 showNotify();
             }
         }
+
+        @Override
+        public String toString() {
+            return "ToggleDialogAction [" + ToggleDialog.this.toString() + ']';
+        }
     }
 
     /**
@@ -505,7 +519,8 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
             add(lblMinimized);
 
             // scale down the dialog icon
-            lblTitle = new JLabel("", new ImageProvider("dialogs", iconName).setWidth(16).get(), JLabel.TRAILING);
+            ImageIcon icon = ImageProvider.get("dialogs", iconName, ImageProvider.ImageSizes.SMALLICON);
+            lblTitle = new JLabel("", icon, JLabel.TRAILING);
             lblTitle.setIconTextGap(8);
 
             JPanel conceal = new JPanel();
@@ -542,7 +557,7 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
 
             // show the pref button if applicable
             if (preferenceClass != null) {
-                JButton pref = new JButton(new ImageProvider("preference").setWidth(16).get());
+                JButton pref = new JButton(ImageProvider.get("preference", ImageProvider.ImageSizes.SMALLICON));
                 pref.setToolTipText(tr("Open preferences for this panel"));
                 pref.setBorder(BorderFactory.createEmptyBorder());
                 pref.addActionListener(
@@ -713,7 +728,7 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
         }
 
         protected void rememberGeometry() {
-            if (detachedDialog != null) {
+            if (detachedDialog != null && detachedDialog.isShowing()) {
                 new WindowGeometry(detachedDialog).remember(preferencePrefix+".geometry");
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
index 57ac553..8d0d0af 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
@@ -34,9 +34,10 @@ import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -49,7 +50,7 @@ import org.openstreetmap.josm.tools.Utils;
  * selection area, along with the number of objects.
  *
  */
-public class UserListDialog extends ToggleDialog implements SelectionChangedListener, MapView.LayerChangeListener {
+public class UserListDialog extends ToggleDialog implements SelectionChangedListener, ActiveLayerChangeListener {
 
     /**
      * The display list.
@@ -71,12 +72,12 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
     @Override
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
 
@@ -112,24 +113,15 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            refresh(((OsmDataLayer) newLayer).data.getAllSelected());
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        Layer activeLayer = e.getSource().getActiveLayer();
+        if (activeLayer instanceof OsmDataLayer) {
+            refresh(((OsmDataLayer) activeLayer).data.getAllSelected());
         } else {
             refresh(null);
         }
     }
 
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // do nothing
-    }
-
     /**
      * Refreshes user list from given collection of OSM primitives.
      * @param fromPrimitives OSM primitives to fetch users from
@@ -151,7 +143,7 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
     @Override
     public void showDialog() {
         super.showDialog();
-        Layer layer = Main.main.getActiveLayer();
+        Layer layer = Main.getLayerManager().getActiveLayer();
         if (layer instanceof OsmDataLayer) {
             refresh(((OsmDataLayer) layer).data.getAllSelected());
         }
@@ -165,7 +157,7 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
         SelectUsersPrimitivesAction() {
             putValue(NAME, tr("Select"));
             putValue(SHORT_DESCRIPTION, tr("Select objects submitted by this user"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+            new ImageProvider("dialogs", "select").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -200,7 +192,7 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
             super(false);
             putValue(NAME, tr("Show info"));
             putValue(SHORT_DESCRIPTION, tr("Launches a browser with information about the user"));
-            putValue(SMALL_ICON, ImageProvider.get("help/internet"));
+            new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
             updateEnabledState();
         }
 
@@ -323,7 +315,7 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
             data.clear();
             if (primitives != null) {
                 for (Map.Entry<User, Integer> entry: statistics.entrySet()) {
-                    data.add(new UserInfo(entry.getKey(), entry.getValue(), (double) entry.getValue() /  (double) primitives.size()));
+                    data.add(new UserInfo(entry.getKey(), entry.getValue(), (double) entry.getValue() / (double) primitives.size()));
                 }
             }
             Collections.sort(data);
@@ -363,14 +355,14 @@ public class UserListDialog extends ToggleDialog implements SelectionChangedList
             for (int index: rows) {
                 users.add(data.get(index).user);
             }
-            Collection<OsmPrimitive> selected = Main.main.getCurrentDataSet().getAllSelected();
+            Collection<OsmPrimitive> selected = Main.getLayerManager().getEditDataSet().getAllSelected();
             Collection<OsmPrimitive> byUser = new LinkedList<>();
             for (OsmPrimitive p : selected) {
                 if (users.contains(p.getUser())) {
                     byUser.add(p);
                 }
             }
-            Main.main.getCurrentDataSet().setSelected(byUser);
+            Main.getLayerManager().getEditDataSet().setSelected(byUser);
         }
 
         public List<User> getSelectedUsers(int[] rows) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
index 93cd671..28febcc 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
@@ -41,13 +41,12 @@ import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.ValidatorVisitor;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.validator.ValidatorTreePanel;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -65,7 +64,7 @@ import org.xml.sax.SAXException;
  *
  * @author frsantos
  */
-public class ValidatorDialog extends ToggleDialog implements SelectionChangedListener, LayerChangeListener {
+public class ValidatorDialog extends ToggleDialog implements SelectionChangedListener, ActiveLayerChangeListener {
 
     /** The display tree */
     public ValidatorTreePanel tree;
@@ -120,12 +119,12 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
             {
                 putValue(NAME, tr("Lookup"));
                 putValue(SHORT_DESCRIPTION, tr("Looks up the selected primitives in the error list."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+                new ImageProvider("dialogs", "search").getResource().attachImageIcon(this, true);
             }
 
             @Override
             public void actionPerformed(ActionEvent e) {
-                final DataSet ds = Main.main.getCurrentDataSet();
+                final DataSet ds = Main.getLayerManager().getEditDataSet();
                 if (ds == null) {
                     return;
                 }
@@ -140,8 +139,8 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
         fixButton = new SideButton(new AbstractAction() {
             {
                 putValue(NAME, tr("Fix"));
-                putValue(SHORT_DESCRIPTION,  tr("Fix the selected issue."));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "fix"));
+                putValue(SHORT_DESCRIPTION, tr("Fix the selected issue."));
+                new ImageProvider("dialogs", "fix").getResource().attachImageIcon(this, true);
             }
             @Override
             public void actionPerformed(ActionEvent e) {
@@ -155,8 +154,8 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
             ignoreButton = new SideButton(new AbstractAction() {
                 {
                     putValue(NAME, tr("Ignore"));
-                    putValue(SHORT_DESCRIPTION,  tr("Ignore the selected issue next time."));
-                    putValue(SMALL_ICON, ImageProvider.get("dialogs", "fix"));
+                    putValue(SHORT_DESCRIPTION, tr("Ignore the selected issue next time."));
+                    new ImageProvider("dialogs", "fix").getResource().attachImageIcon(this, true);
                 }
                 @Override
                 public void actionPerformed(ActionEvent e) {
@@ -174,20 +173,16 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
     @Override
     public void showNotify() {
         DataSet.addSelectionListener(this);
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds != null) {
             updateSelection(ds.getAllSelected());
         }
-        MapView.addLayerChangeListener(this);
-        Layer activeLayer = Main.map.mapView.getActiveLayer();
-        if (activeLayer != null) {
-            activeLayerChange(null, activeLayer);
-        }
+        Main.getLayerManager().addAndFireActiveLayerChangeListener(this);
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         DataSet.removeSelectionListener(this);
     }
 
@@ -346,7 +341,7 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
                 }
             }
         }
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds != null) {
             ds.setSelected(sel);
         }
@@ -406,22 +401,12 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (newLayer instanceof OsmDataLayer) {
-            linkedLayer = (OsmDataLayer) newLayer;
-            tree.setErrorList(linkedLayer.validationErrors);
-        }
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer == linkedLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        OsmDataLayer editLayer = e.getSource().getEditLayer();
+        if (editLayer == null) {
             tree.setErrorList(new ArrayList<TestError>());
+        } else {
+            tree.setErrorList(editLayer.validationErrors);
         }
     }
 
@@ -493,7 +478,7 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
             fixButton.setEnabled(hasFixes);
 
             if (isDblClick) {
-                Main.main.getCurrentDataSet().setSelected(sel);
+                Main.getLayerManager().getEditDataSet().setSelected(sel);
                 if (Main.pref.getBoolean("validator.autozoom", false)) {
                     AutoScaleAction.zoomTo(sel);
                 }
@@ -622,16 +607,16 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
         }
 
         @Override
-        protected void realRun() throws SAXException, IOException,
-        OsmTransferException {
+        protected void realRun() throws SAXException, IOException, OsmTransferException {
             ProgressMonitor monitor = getProgressMonitor();
             try {
                 monitor.setTicksCount(testErrors.size());
+                final DataSet ds = Main.getLayerManager().getEditDataSet();
                 int i = 0;
                 SwingUtilities.invokeAndWait(new Runnable() {
                     @Override
                     public void run() {
-                        Main.main.getCurrentDataSet().beginUpdate();
+                        ds.beginUpdate();
                     }
                 });
                 try {
@@ -647,7 +632,7 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
                     SwingUtilities.invokeAndWait(new Runnable() {
                         @Override
                         public void run() {
-                            Main.main.getCurrentDataSet().endUpdate();
+                            ds.endUpdate();
                         }
                     });
                 }
@@ -658,7 +643,7 @@ public class ValidatorDialog extends ToggleDialog implements SelectionChangedLis
                         Main.main.undoRedo.afterAdd();
                         Main.map.repaint();
                         tree.resetErrors();
-                        Main.main.getCurrentDataSet().fireSelectionChanged();
+                        ds.fireSelectionChanged();
                     }
                 });
             } catch (InterruptedException | InvocationTargetException e) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
index f6fb6a8..b4ccde9 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
@@ -22,7 +22,7 @@ import java.util.Set;
 
 import javax.swing.AbstractAction;
 import javax.swing.DefaultListSelectionModel;
-import javax.swing.ImageIcon;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JOptionPane;
@@ -48,7 +48,6 @@ import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.changeset.query.ChangesetQueryDialog;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -70,11 +69,6 @@ import org.openstreetmap.josm.tools.WindowGeometry;
  */
 public class ChangesetCacheManager extends JFrame {
 
-    /** The changeset download icon **/
-    public static final ImageIcon DOWNLOAD_CONTENT_ICON = ImageProvider.get("dialogs/changeset", "downloadchangesetcontent");
-    /** The changeset update icon **/
-    public static final ImageIcon UPDATE_CONTENT_ICON   = ImageProvider.get("dialogs/changeset", "updatechangesetcontent");
-
     /** the unique instance of the cache manager  */
     private static volatile ChangesetCacheManager instance;
     private JTabbedPane pnlChangesetDetailTabs;
@@ -131,10 +125,10 @@ public class ChangesetCacheManager extends JFrame {
     static JPanel buildToolbarPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
 
-        SideButton btn = new SideButton(new QueryAction());
+        JButton btn = new JButton(new QueryAction());
         pnl.add(btn);
         pnl.add(new SingleChangesetDownloadPanel());
-        pnl.add(new SideButton(new DownloadMyChangesets()));
+        pnl.add(new JButton(new DownloadMyChangesets()));
 
         return pnl;
     }
@@ -148,10 +142,10 @@ public class ChangesetCacheManager extends JFrame {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
         //-- cancel and close action
-        pnl.add(new SideButton(new CancelAction()));
+        pnl.add(new JButton(new CancelAction()));
 
         //-- help action
-        pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetManager"))));
+        pnl.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetManager"))));
 
         return pnl;
     }
@@ -163,7 +157,7 @@ public class ChangesetCacheManager extends JFrame {
      */
     protected JPanel buildChangesetDetailPanel() {
         JPanel pnl = new JPanel(new BorderLayout());
-        JTabbedPane tp =  new JTabbedPane();
+        JTabbedPane tp = new JTabbedPane();
         pnlChangesetDetailTabs = tp;
 
         // -- add the details panel
@@ -356,7 +350,7 @@ public class ChangesetCacheManager extends JFrame {
     static class CancelAction extends AbstractAction {
         CancelAction() {
             putValue(NAME, tr("Close"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the dialog"));
         }
 
@@ -377,7 +371,7 @@ public class ChangesetCacheManager extends JFrame {
 
         QueryAction() {
             putValue(NAME, tr("Query"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+            new ImageProvider("dialogs", "search").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Launch the dialog for querying changesets"));
             setEnabled(!Main.isOffline(OnlineResource.OSM_API));
         }
@@ -413,7 +407,7 @@ public class ChangesetCacheManager extends JFrame {
 
         RemoveFromCacheAction(ChangesetCacheManagerModel model) {
             putValue(NAME, tr("Remove from cache"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Remove the selected changesets from the local cache"));
             this.model = model;
             updateEnabledState();
@@ -443,7 +437,7 @@ public class ChangesetCacheManager extends JFrame {
 
         CloseSelectedChangesetsAction(ChangesetCacheManagerModel model) {
             putValue(NAME, tr("Close"));
-            putValue(SMALL_ICON, ImageProvider.get("closechangeset"));
+            new ImageProvider("closechangeset").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the selected changesets"));
             this.model = model;
             updateEnabledState();
@@ -487,7 +481,7 @@ public class ChangesetCacheManager extends JFrame {
 
         DownloadSelectedChangesetsAction(ChangesetCacheManagerModel model) {
             putValue(NAME, tr("Update changeset"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "updatechangeset"));
+            new ImageProvider("dialogs/changeset", "updatechangeset").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Updates the selected changesets with current data from the OSM server"));
             this.model = model;
             updateEnabledState();
@@ -520,7 +514,7 @@ public class ChangesetCacheManager extends JFrame {
 
         DownloadSelectedChangesetContentAction(ChangesetCacheManagerModel model) {
             putValue(NAME, tr("Download changeset content"));
-            putValue(SMALL_ICON, DOWNLOAD_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download the content of the selected changesets from the server"));
             this.model = model;
             updateEnabledState();
@@ -567,7 +561,7 @@ public class ChangesetCacheManager extends JFrame {
     static class DownloadMyChangesets extends AbstractAction {
         DownloadMyChangesets() {
             putValue(NAME, tr("My changesets"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "downloadchangeset"));
+            new ImageProvider("dialogs/changeset", "downloadchangeset").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download my changesets from the OSM server (max. 100 changesets)"));
             setEnabled(!Main.isOffline(OnlineResource.OSM_API));
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
index 046c011..b60bfe7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
@@ -41,12 +41,12 @@ import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
 import org.openstreetmap.josm.gui.history.HistoryLoadTask;
 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -89,20 +89,25 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
 
         actSelectInCurrentLayerAction = new SelectInCurrentLayerAction();
         model.getSelectionModel().addListSelectionListener(actSelectInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actSelectInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actSelectInCurrentLayerAction);
 
         actZoomInCurrentLayerAction = new ZoomInCurrentLayerAction();
         model.getSelectionModel().addListSelectionListener(actZoomInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actZoomInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actZoomInCurrentLayerAction);
 
         addComponentListener(
                 new ComponentAdapter() {
                     @Override
+                    public void componentShown(ComponentEvent e) {
+                        Main.getLayerManager().addAndFireActiveLayerChangeListener(actSelectInCurrentLayerAction);
+                        Main.getLayerManager().addAndFireActiveLayerChangeListener(actZoomInCurrentLayerAction);
+                    }
+
+                    @Override
                     public void componentHidden(ComponentEvent e) {
-                        // make sure the listener is unregistered when the panel becomes
-                        // invisible
-                        MapView.removeEditLayerChangeListener(actSelectInCurrentLayerAction);
-                        MapView.removeEditLayerChangeListener(actZoomInCurrentLayerAction);
+                        // make sure the listener is unregistered when the panel becomes invisible
+                        Main.getLayerManager().removeActiveLayerChangeListener(actSelectInCurrentLayerAction);
+                        Main.getLayerManager().removeActiveLayerChangeListener(actZoomInCurrentLayerAction);
                     }
                 }
         );
@@ -192,7 +197,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
                         "<html>None of the selected objects is available in the current<br>"
                         + "edit layer ''{0}''.</html>",
                         primitives.size(),
-                        Main.main.getEditLayer().getName()
+                        Main.getLayerManager().getEditLayer().getName()
                 ),
                 title, JOptionPane.WARNING_MESSAGE, helpTopic
         );
@@ -247,7 +252,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
 
         ShowHistoryAction() {
             putValue(NAME, tr("Show history"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "history"));
+            new ImageProvider("dialogs", "history").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download and show the history of the selected objects"));
             updateEnabledState();
         }
@@ -324,13 +329,16 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
         }
     }
 
-    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, EditLayerChangeListener {
+    abstract class SelectionBasedAction extends AbstractAction implements ListSelectionListener, ActiveLayerChangeListener {
 
         protected Set<OsmPrimitive> getTarget() {
-            if (!isEnabled() || Main.main == null || !Main.main.hasEditLayer()) {
+            if (!isEnabled()) {
+                return null;
+            }
+            OsmDataLayer layer = Main.getLayerManager().getEditLayer();
+            if (layer == null) {
                 return null;
             }
-            OsmDataLayer layer = Main.main.getEditLayer();
             Set<OsmPrimitive> target = new HashSet<>();
             for (HistoryOsmPrimitive p : model.getSelectedPrimitives()) {
                 OsmPrimitive op = layer.data.getPrimitiveById(p.getPrimitiveId());
@@ -342,11 +350,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
         }
 
         public final void updateEnabledState() {
-            if (Main.main == null || !Main.main.hasEditLayer()) {
-                setEnabled(false);
-                return;
-            }
-            setEnabled(model.hasSelectedPrimitives());
+            setEnabled(Main.getLayerManager().getEditLayer() != null && model.hasSelectedPrimitives());
         }
 
         @Override
@@ -355,7 +359,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
 
@@ -365,7 +369,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
 
         SelectInCurrentLayerAction() {
             putValue(NAME, tr("Select in layer"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+            new ImageProvider("dialogs", "select").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Select the corresponding primitives in the current data layer"));
             updateEnabledState();
         }
@@ -380,7 +384,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
                         HelpUtil.ht("/Dialog/ChangesetCacheManager#NothingToSelectInLayer"));
                 return;
             }
-            Main.main.getEditLayer().data.setSelected(target);
+            Main.getLayerManager().getEditLayer().data.setSelected(target);
         }
     }
 
@@ -388,7 +392,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
 
         ZoomInCurrentLayerAction() {
             putValue(NAME, tr("Zoom to in layer"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/autoscale", "selection"));
+            new ImageProvider("dialogs/autoscale", "selection").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Zoom to the corresponding objects in the current data layer"));
             updateEnabledState();
         }
@@ -403,7 +407,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
                         HelpUtil.ht("/Dialog/ChangesetCacheManager#NothingToZoomTo"));
                 return;
             }
-            Main.main.getEditLayer().data.setSelected(target);
+            Main.getLayerManager().getEditLayer().data.setSelected(target);
             AutoScaleAction.zoomToSelection();
         }
     }
@@ -436,7 +440,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
             DownloadAction() {
                 putValue(NAME, tr("Download now"));
                 putValue(SHORT_DESCRIPTION, tr("Download the changeset content"));
-                putValue(SMALL_ICON, ChangesetCacheManager.DOWNLOAD_CONTENT_ICON);
+                new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
             }
 
             @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
index 2f7c434..c8dd411 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
@@ -34,9 +34,9 @@ import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.ChangesetCache;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -51,6 +51,7 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  */
 public class ChangesetDetailPanel extends JPanel implements PropertyChangeListener, ChangesetAware {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     private final JosmTextField tfID        = new JosmTextField(10);
     private final JosmTextArea  taComment   = new JosmTextArea(5, 40);
     private final JosmTextField tfOpen      = new JosmTextField(10);
@@ -63,6 +64,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
     private final RemoveFromCacheAction          actRemoveFromCache          = new RemoveFromCacheAction();
     private final SelectInCurrentLayerAction     actSelectInCurrentLayer     = new SelectInCurrentLayerAction();
     private final ZoomInCurrentLayerAction       actZoomInCurrentLayerAction = new ZoomInCurrentLayerAction();
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     private transient Changeset currentChangeset;
 
@@ -85,19 +87,24 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         actDownloadChangesetContent.initProperties();
 
         tb.add(actSelectInCurrentLayer);
-        MapView.addEditLayerChangeListener(actSelectInCurrentLayer);
+        Main.getLayerManager().addActiveLayerChangeListener(actSelectInCurrentLayer);
 
         tb.add(actZoomInCurrentLayerAction);
-        MapView.addEditLayerChangeListener(actZoomInCurrentLayerAction);
+        Main.getLayerManager().addActiveLayerChangeListener(actZoomInCurrentLayerAction);
 
         addComponentListener(
                 new ComponentAdapter() {
                     @Override
+                    public void componentShown(ComponentEvent e) {
+                        Main.getLayerManager().addAndFireActiveLayerChangeListener(actSelectInCurrentLayer);
+                        Main.getLayerManager().addAndFireActiveLayerChangeListener(actZoomInCurrentLayerAction);
+                    }
+
+                    @Override
                     public void componentHidden(ComponentEvent e) {
-                        // make sure the listener is unregistered when the panel becomes
-                        // invisible
-                        MapView.removeEditLayerChangeListener(actSelectInCurrentLayer);
-                        MapView.removeEditLayerChangeListener(actZoomInCurrentLayerAction);
+                        // make sure the listener is unregistered when the panel becomes invisible
+                        Main.getLayerManager().removeActiveLayerChangeListener(actSelectInCurrentLayer);
+                        Main.getLayerManager().removeActiveLayerChangeListener(actZoomInCurrentLayerAction);
                     }
                 }
         );
@@ -270,7 +277,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
     class RemoveFromCacheAction extends AbstractAction {
         RemoveFromCacheAction() {
             putValue(NAME, tr("Remove from cache"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Remove the changeset in the detail view panel from the local cache"));
         }
 
@@ -293,7 +300,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
     class UpdateChangesetAction extends AbstractAction {
         UpdateChangesetAction() {
             putValue(NAME, tr("Update changeset"));
-            putValue(SMALL_ICON, ChangesetCacheManager.UPDATE_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "updatechangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Update the changeset from the OSM server"));
         }
 
@@ -317,11 +324,11 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
      * Selects the primitives in the content of this changeset in the current data layer.
      *
      */
-    class SelectInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class SelectInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         SelectInCurrentLayerAction() {
             putValue(NAME, tr("Select in layer"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "select"));
+            new ImageProvider("dialogs", "select").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Select the primitives in the content of this changeset in the current data layer"));
             updateEnabledState();
         }
@@ -332,7 +339,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
                     tr("<html>None of the objects in the content of changeset {0} is available in the current<br>"
                             + "edit layer ''{1}''.</html>",
                             currentChangeset.getId(),
-                            Main.main.getEditLayer().getName()
+                            Main.getLayerManager().getEditLayer().getName()
                     ),
                     tr("Nothing to select"),
                     JOptionPane.WARNING_MESSAGE,
@@ -344,8 +351,10 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         public void actionPerformed(ActionEvent arg0) {
             if (!isEnabled())
                 return;
-            if (Main.main == null || !Main.main.hasEditLayer()) return;
-            OsmDataLayer layer = Main.main.getEditLayer();
+            OsmDataLayer layer = Main.getLayerManager().getEditLayer();
+            if (layer == null) {
+                return;
+            }
             Set<OsmPrimitive> target = new HashSet<>();
             for (OsmPrimitive p: layer.data.allPrimitives()) {
                 if (p.isUsable() && p.getChangesetId() == currentChangeset.getId()) {
@@ -360,15 +369,11 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         }
 
         public void updateEnabledState() {
-            if (Main.main == null || !Main.main.hasEditLayer()) {
-                setEnabled(false);
-                return;
-            }
-            setEnabled(currentChangeset != null);
+            setEnabled(Main.getLayerManager().getEditLayer() != null && currentChangeset != null);
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
@@ -378,11 +383,11 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
      * data layer.
      *
      */
-    class ZoomInCurrentLayerAction extends AbstractAction implements EditLayerChangeListener {
+    class ZoomInCurrentLayerAction extends AbstractAction implements ActiveLayerChangeListener {
 
         ZoomInCurrentLayerAction() {
             putValue(NAME, tr("Zoom to in layer"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs/autoscale", "selection"));
+            new ImageProvider("dialogs/autoscale", "selection").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Zoom to the objects in the content of this changeset in the current data layer"));
             updateEnabledState();
         }
@@ -393,7 +398,7 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
                     tr("<html>None of the objects in the content of changeset {0} is available in the current<br>"
                             + "edit layer ''{1}''.</html>",
                             currentChangeset.getId(),
-                            Main.main.getEditLayer().getName()
+                            Main.getLayerManager().getEditLayer().getName()
                     ),
                     tr("Nothing to zoom to"),
                     JOptionPane.WARNING_MESSAGE,
@@ -405,8 +410,10 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         public void actionPerformed(ActionEvent arg0) {
             if (!isEnabled())
                 return;
-            if (Main.main == null || !Main.main.hasEditLayer()) return;
-            OsmDataLayer layer = Main.main.getEditLayer();
+            OsmDataLayer layer = Main.getLayerManager().getEditLayer();
+            if (layer == null) {
+                return;
+            }
             Set<OsmPrimitive> target = new HashSet<>();
             for (OsmPrimitive p: layer.data.allPrimitives()) {
                 if (p.isUsable() && p.getChangesetId() == currentChangeset.getId()) {
@@ -422,15 +429,11 @@ public class ChangesetDetailPanel extends JPanel implements PropertyChangeListen
         }
 
         public void updateEnabledState() {
-            if (Main.main == null || !Main.main.hasEditLayer()) {
-                setEnabled(false);
-                return;
-            }
-            setEnabled(currentChangeset != null);
+            setEnabled(Main.getLayerManager().getEditLayer() != null && currentChangeset != null);
         }
 
         @Override
-        public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
index 92514b7..13f4e03 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanel.java
@@ -24,6 +24,7 @@ import org.openstreetmap.josm.actions.downloadtasks.ChangesetHeaderDownloadTask;
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * The panel which displays the public discussion around a changeset in a scrollable table.
@@ -63,7 +64,7 @@ public class ChangesetDiscussionPanel extends JPanel implements PropertyChangeLi
     class UpdateChangesetDiscussionAction extends AbstractAction {
         UpdateChangesetDiscussionAction() {
             putValue(NAME, tr("Update changeset discussion"));
-            putValue(SMALL_ICON, ChangesetCacheManager.UPDATE_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "updatechangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Update the changeset discussion from the OSM server"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
index 6f9c22e..006f122 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetInSelectionListModel.java
@@ -6,11 +6,12 @@ import java.util.Collection;
 import javax.swing.DefaultListSelectionModel;
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
-public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, EditLayerChangeListener {
+public class ChangesetInSelectionListModel extends ChangesetListModel implements SelectionChangedListener, ActiveLayerChangeListener {
 
     public ChangesetInSelectionListModel(DefaultListSelectionModel selectionModel) {
         super(selectionModel);
@@ -28,11 +29,12 @@ public class ChangesetInSelectionListModel extends ChangesetListModel implements
     /* Interface LayerChangeListener                                                */
     /* ---------------------------------------------------------------------------- */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (newLayer == null) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        DataSet newData = e.getSource().getEditDataSet();
+        if (newData == null) {
             setChangesets(null);
         } else {
-            initFromPrimitives((newLayer).data.getAllSelected());
+            initFromPrimitives(newData.getAllSelected());
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
index 8c92208..e5c4c3f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetsInActiveDataLayerListModel.java
@@ -12,14 +12,15 @@ import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
 import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
-import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
  * This is the list model for the list of changeset in the current edit layer.
  *
  */
-public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, EditLayerChangeListener {
+public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel implements DataSetListener, ActiveLayerChangeListener {
 
     public ChangesetsInActiveDataLayerListModel(DefaultListSelectionModel selectionModel) {
         super(selectionModel);
@@ -69,14 +70,15 @@ public class ChangesetsInActiveDataLayerListModel extends ChangesetListModel imp
     }
 
     /* ------------------------------------------------------------------------------ */
-    /* interface EditLayerListener                                                    */
+    /* interface ActiveLayerChangeListener                                                    */
     /* ------------------------------------------------------------------------------ */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         // just init the model content. Don't register as DataSetListener. The mode
         // is already registered to receive DataChangedEvents from the current edit layer
-        if (newLayer != null) {
-            initFromDataSet(newLayer.data);
+        OsmDataLayer editLayer = e.getSource().getEditLayer();
+        if (editLayer != null) {
+            initFromDataSet(editLayer.data);
         } else {
             initFromDataSet(null);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetContentAction.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetContentAction.java
index 5f4f47a..439ced7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetContentAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/DownloadChangesetContentAction.java
@@ -10,6 +10,7 @@ import javax.swing.AbstractAction;
 
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetContentDownloadTask;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * Downloads/Updates the content of the changeset.
@@ -25,7 +26,7 @@ public class DownloadChangesetContentAction extends AbstractAction {
     public DownloadChangesetContentAction(ChangesetAware component) {
         CheckParameterUtil.ensureParameterNotNull(component, "component");
         putValue(NAME, tr("Download content"));
-        putValue(SMALL_ICON, ChangesetCacheManager.DOWNLOAD_CONTENT_ICON);
+        new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
         putValue(SHORT_DESCRIPTION, tr("Download the changeset content from the OSM server"));
         this.component = component;
     }
@@ -50,11 +51,11 @@ public class DownloadChangesetContentAction extends AbstractAction {
         }
         if (component.getCurrentChangeset().getContent() == null) {
             putValue(NAME, tr("Download content"));
-            putValue(SMALL_ICON, ChangesetCacheManager.DOWNLOAD_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download the changeset content from the OSM server"));
         } else {
             putValue(NAME, tr("Update content"));
-            putValue(SMALL_ICON, ChangesetCacheManager.UPDATE_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "updatechangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Update the changeset content from the OSM server"));
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
index 775618f..323f72a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
@@ -10,6 +10,7 @@ import java.util.Collections;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.event.DocumentEvent;
@@ -17,10 +18,10 @@ import javax.swing.event.DocumentListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.downloadtasks.ChangesetContentDownloadTask;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.widgets.ChangesetIdTextField;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * This panel allows to enter the ID of single changeset and to download
@@ -53,7 +54,7 @@ public class SingleChangesetDownloadPanel extends JPanel {
         SelectAllOnFocusGainedDecorator.decorate(tfChangesetId);
 
         DownloadAction actDownload = new DownloadAction();
-        SideButton btn = new SideButton(actDownload);
+        JButton btn = new JButton(actDownload);
         tfChangesetId.addActionListener(actDownload);
         tfChangesetId.getDocument().addDocumentListener(actDownload);
         add(btn);
@@ -79,7 +80,7 @@ public class SingleChangesetDownloadPanel extends JPanel {
     class DownloadAction extends AbstractAction implements DocumentListener {
 
         DownloadAction() {
-            putValue(SMALL_ICON, ChangesetCacheManager.DOWNLOAD_CONTENT_ICON);
+            new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download the changeset with the specified id, including the changeset content"));
             updateEnabledState();
         }
@@ -91,7 +92,7 @@ public class SingleChangesetDownloadPanel extends JPanel {
             int id = getChangesetId();
             if (id == 0)
                 return;
-            ChangesetContentDownloadTask task =  new ChangesetContentDownloadTask(
+            ChangesetContentDownloadTask task = new ChangesetContentDownloadTask(
                     SingleChangesetDownloadPanel.this,
                     Collections.singleton(id)
             );
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
index 4fd758b..bda2dd4 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
@@ -65,7 +65,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
     protected JPanel buildQueryPanel() {
         ItemListener stateChangeHandler = new RestrictionGroupStateChangeHandler();
-        JPanel pnl  = new VerticallyScrollablePanel(new GridBagLayout());
+        JPanel pnl = new VerticallyScrollablePanel(new GridBagLayout());
         pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         GridBagConstraints gc = new GridBagConstraints();
 
@@ -448,7 +448,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             rbRestrictToMyself.addItemListener(userRestrictionChangeHandler);
 
             gc.gridx = 1;
-            gc.fill =  GridBagConstraints.HORIZONTAL;
+            gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
             add(lblRestrictedToMyself, gc);
 
@@ -460,13 +460,13 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             rbRestrictToUid.addItemListener(userRestrictionChangeHandler);
 
             gc.gridx = 1;
-            gc.fill =  GridBagConstraints.HORIZONTAL;
+            gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
             add(new JMultilineLabel(tr("Only changesets owned by the user with the following user ID")), gc);
 
             gc.gridx = 1;
             gc.gridy = 2;
-            gc.fill =  GridBagConstraints.HORIZONTAL;
+            gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
             add(buildUidInputPanel(), gc);
 
@@ -529,7 +529,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
                     throw new IllegalStateException(
                             tr("Cannot restrict changeset query to the current user because the current user is anonymous"));
             } else if (rbRestrictToUid.isSelected()) {
-                int uid  = valUid.getUid();
+                int uid = valUid.getUid();
                 if (uid > 0) {
                     query.forUser(uid);
                 } else
@@ -984,7 +984,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
         @Override
         public void validate() {
-            String value  = getComponent().getText();
+            String value = getComponent().getText();
             if (value == null || value.trim().isEmpty()) {
                 feedbackInvalid("");
                 return;
@@ -1003,7 +1003,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         }
 
         public int getUid() {
-            String value  = getComponent().getText();
+            String value = getComponent().getText();
             if (value == null || value.trim().isEmpty()) return 0;
             try {
                 int uid = Integer.parseInt(value.trim());
@@ -1042,7 +1042,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
         public String getStandardTooltipText() {
             Date date = new Date();
-            return  tr(
+            return tr(
                     "Please enter a date in the usual format for your locale.<br>"
                     + "Example: {0}<br>"
                     + "Example: {1}<br>"
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
index 18cea34..104ddca 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
@@ -187,7 +187,7 @@ public class BasicChangesetQueryPanel extends JPanel {
 
     public void restoreFromPreferences() {
         BasicQuery q;
-        String value =  Main.pref.get("changeset-query.basic.query", null);
+        String value = Main.pref.get("changeset-query.basic.query", null);
         if (value == null) {
             q = BasicQuery.MOST_RECENT_CHANGESETS;
         } else {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
index dc45476..bf9bf00 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
@@ -14,6 +14,7 @@ import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JOptionPane;
@@ -22,7 +23,6 @@ import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.io.ChangesetQuery;
@@ -73,14 +73,9 @@ public class ChangesetQueryDialog extends JDialog {
     protected JPanel buildButtonPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
-        // -- query action
-        pnl.add(new SideButton(new QueryAction()));
-
-        // -- cancel action
-        pnl.add(new SideButton(new CancelAction()));
-
-        // -- help action
-        pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetQuery"))));
+        pnl.add(new JButton(new QueryAction()));
+        pnl.add(new JButton(new CancelAction()));
+        pnl.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetQuery"))));
 
         return pnl;
     }
@@ -157,7 +152,7 @@ public class ChangesetQueryDialog extends JDialog {
     class QueryAction extends AbstractAction {
         QueryAction() {
             putValue(NAME, tr("Query"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "search"));
+            new ImageProvider("dialogs", "search").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Query and download changesets"));
         }
 
@@ -205,7 +200,7 @@ public class ChangesetQueryDialog extends JDialog {
 
         CancelAction() {
             putValue(NAME, tr("Cancel"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the dialog and abort querying of changesets"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
index 964765e..2b8316b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
@@ -45,7 +45,7 @@ public class UrlBasedQueryPanel extends JPanel {
         GridBagConstraints gc = new GridBagConstraints();
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.insets  = new Insets(0, 0, 0, 5);
+        gc.insets = new Insets(0, 0, 0, 5);
         pnl.add(new JLabel(tr("URL: ")), gc);
 
         gc.gridx = 1;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java
index ad661ea..0698a22 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/ActivateLayerAction.java
@@ -9,12 +9,12 @@ import java.util.List;
 
 import javax.swing.AbstractAction;
 
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -25,7 +25,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  * The action to activate the currently selected layer
  */
 public final class ActivateLayerAction extends AbstractAction
-implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutAction {
+implements IEnabledStateUpdating, ActiveLayerChangeListener, MultikeyShortcutAction {
     private transient Layer layer;
     private transient Shortcut multikeyShortcut;
     private final LayerListModel model;
@@ -50,7 +50,7 @@ implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutA
     public ActivateLayerAction(LayerListModel model) {
         this.model = model;
         putValue(NAME, tr("Activate"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "activate"));
+        new ImageProvider("dialogs", "activate").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Activate the selected layer"));
         multikeyShortcut = Shortcut.registerShortcut("core_multikey:activateLayer", tr("Multikey: {0}",
                 tr("Activate layer")), KeyEvent.VK_A, Shortcut.SHIFT);
@@ -76,14 +76,12 @@ implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutA
 
     private void execute(Layer layer) {
         // model is going to be updated via LayerChangeListener and PropertyChangeEvents
-        Main.map.mapView.setActiveLayer(layer);
+        model.getLayerManager().setActiveLayer(layer);
         layer.setVisible(true);
     }
 
-    protected boolean isActiveLayer(Layer layer) {
-        if (!Main.isDisplayingMapView())
-            return false;
-        return Main.map.mapView.getActiveLayer() == layer;
+    boolean isActiveLayer(Layer layer) {
+        return model.getLayerManager().getActiveLayer() == layer;
     }
 
     @Override
@@ -105,17 +103,7 @@ implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutA
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         updateEnabledState();
     }
 
@@ -136,4 +124,5 @@ implements IEnabledStateUpdating, MapView.LayerChangeListener, MultikeyShortcutA
     public MultikeyInfo getLastMultikeyAction() {
         return null; // Repeating action doesn't make much sense for activating
     }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerAction.java
index d59a0c1..a809e2e 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/DeleteLayerAction.java
@@ -30,7 +30,7 @@ public final class DeleteLayerAction extends AbstractAction implements IEnabledS
      */
     public DeleteLayerAction(LayerListModel model) {
         this.model = model;
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+        new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Delete the selected layers."));
         putValue(NAME, tr("Delete"));
         putValue("help", HelpUtil.ht("/Dialog/LayerList#DeleteLayer"));
@@ -45,7 +45,7 @@ public final class DeleteLayerAction extends AbstractAction implements IEnabledS
         if (!Main.saveUnsavedModifications(selectedLayers, false))
             return;
         for (Layer l: selectedLayers) {
-            Main.main.removeLayer(l);
+            Main.getLayerManager().removeLayer(l);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
index c7f16d3..4adbefe 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/DuplicateAction.java
@@ -10,6 +10,7 @@ import java.util.List;
 import javax.swing.AbstractAction;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -55,7 +56,7 @@ public final class DuplicateAction extends AbstractAction implements IEnabledSta
             return;
 
         List<String> layerNames = new ArrayList<>();
-        for (Layer l: Main.map.mapView.getAllLayers()) {
+        for (Layer l: Main.getLayerManager().getLayers()) {
             layerNames.add(l.getName());
         }
         if (layer instanceof OsmDataLayer) {
@@ -68,7 +69,7 @@ public final class DuplicateAction extends AbstractAction implements IEnabledSta
                 newName = tr("Copy {1} of {0}", oldLayer.getName(), i);
                 i++;
             }
-            Main.main.addLayer(new OsmDataLayer(oldLayer.data.clone(), newName, null));
+            Main.getLayerManager().addLayer(new OsmDataLayer(new DataSet(oldLayer.data), newName, null));
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
index 6aa394d..1c8a58f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
@@ -62,7 +62,7 @@ public final class LayerVisibilityAction extends AbstractAction implements IEnab
         content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
         content.setLayout(new GridBagLayout());
 
-        putValue(SMALL_ICON, ImageProvider.get("dialogs/layerlist", "visibility"));
+        new ImageProvider("dialogs/layerlist", "visibility").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Change visibility of the selected layer."));
 
         visibilityCheckbox = new JCheckBox(tr("Show layer"));
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/MergeAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/MergeAction.java
index 9c55240..e0cf5bd 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/MergeAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/MergeAction.java
@@ -59,7 +59,7 @@ public final class MergeAction extends AbstractAction implements IEnabledStateUp
         this.layers = layers;
         this.model = model;
         putValue(NAME, tr("Merge"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "mergedown"));
+        new ImageProvider("dialogs", "mergedown").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Merge this layer into another layer"));
         putValue("help", HelpUtil.ht("/Dialog/LayerList#MergeLayer"));
         updateEnabledState();
@@ -86,7 +86,7 @@ public final class MergeAction extends AbstractAction implements IEnabledStateUp
         if (layer == null && layers == null) {
             if (model.getSelectedLayers().isEmpty()) {
                 setEnabled(false);
-            } else  if (model.getSelectedLayers().size() > 1) {
+            } else if (model.getSelectedLayers().size() > 1) {
                 setEnabled(supportLayers(model.getSelectedLayers()));
             } else {
                 Layer selectedLayer = model.getSelectedLayers().get(0);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/MoveDownAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/MoveDownAction.java
index efef0ee..bceaef7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/MoveDownAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/MoveDownAction.java
@@ -23,7 +23,7 @@ public class MoveDownAction extends AbstractAction implements IEnabledStateUpdat
     public MoveDownAction(LayerListModel model) {
         this.model = model;
         putValue(NAME, tr("Move down"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "down"));
+        new ImageProvider("dialogs", "down").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Move the selected layer one row down."));
         updateEnabledState();
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/MoveUpAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/MoveUpAction.java
index f0fb14a..b89d04b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/MoveUpAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/MoveUpAction.java
@@ -13,7 +13,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
 /**
  * The action to move up the currently selected entries in the list.
  */
-public class MoveUpAction extends AbstractAction implements  IEnabledStateUpdating {
+public class MoveUpAction extends AbstractAction implements IEnabledStateUpdating {
     private final LayerListModel model;
 
     /**
@@ -23,7 +23,7 @@ public class MoveUpAction extends AbstractAction implements  IEnabledStateUpdati
     public MoveUpAction(LayerListModel model) {
         this.model = model;
         putValue(NAME, tr("Move up"));
-        putValue(SMALL_ICON, ImageProvider.get("dialogs", "up"));
+        new ImageProvider("dialogs", "up").getResource().attachImageIcon(this, true);
         putValue(SHORT_DESCRIPTION, tr("Move the selected layer one row up."));
         updateEnabledState();
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index d3af238..4b96ea6 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -84,17 +84,16 @@ import org.openstreetmap.josm.data.preferences.StringProperty;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.help.HelpUtil;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
@@ -129,7 +128,7 @@ import org.openstreetmap.josm.tools.Utils;
  * @author imi
  */
 public class PropertiesDialog extends ToggleDialog
-implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetListenerAdapter.Listener {
+implements SelectionChangedListener, ActiveLayerChangeListener, DataSetListenerAdapter.Listener {
 
     /**
      * hook for roadsigns plugin to display a small button in the upper right corner of this dialog
@@ -563,7 +562,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
         Relation relation = (Relation) membershipData.getValueAt(row, 0);
         Main.map.relationListDialog.selectRelation(relation);
         RelationEditor.getEditor(
-                Main.main.getEditLayer(),
+                Main.getLayerManager().getEditLayer(),
                 relation,
                 ((MemberInfo) membershipData.getValueAt(row, 1)).role
         ).setVisible(true);
@@ -589,7 +588,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     public void showNotify() {
         DatasetEventManager.getInstance().addDatasetListener(dataChangedAdapter, FireMode.IN_EDT_CONSOLIDATED);
         SelectionEventManager.getInstance().addSelectionListener(this, FireMode.IN_EDT_CONSOLIDATED);
-        MapView.addEditLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
         for (JosmAction action : josmActions) {
             Main.registerActionShortcut(action);
         }
@@ -600,7 +599,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     public void hideNotify() {
         DatasetEventManager.getInstance().removeDatasetListener(dataChangedAdapter);
         SelectionEventManager.getInstance().removeSelectionListener(this);
-        MapView.removeEditLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
         for (JosmAction action : josmActions) {
             Main.unregisterActionShortcut(action);
         }
@@ -609,7 +608,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     @Override
     public void setVisible(boolean b) {
         super.setVisible(b);
-        if (b && Main.main.getCurrentDataSet() != null) {
+        if (b && Main.getLayerManager().getEditDataSet() != null) {
             updateSelection();
         }
     }
@@ -618,9 +617,6 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     public void destroy() {
         super.destroy();
         Main.pref.removePreferenceChangeListener(this);
-        for (JosmAction action : josmActions) {
-            action.destroy();
-        }
         Container parent = pluginHook.getParent();
         if (parent != null) {
             parent.remove(pluginHook);
@@ -769,17 +765,15 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     }
 
     /* ---------------------------------------------------------------------------------- */
-    /* EditLayerChangeListener                                                            */
+    /* ActiveLayerChangeListener                                                          */
     /* ---------------------------------------------------------------------------------- */
     @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (newLayer == null) editHelper.saveTagsIfNeeded();
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        if (e.getSource().getEditLayer() != null) {
+            editHelper.saveTagsIfNeeded();
+        }
         // it is time to save history of tags
-        GuiHelper.runInEDT(new Runnable() {
-            @Override public void run() {
-                updateSelection();
-            }
-        });
+        updateSelection();
     }
 
     @Override
@@ -1418,7 +1412,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
     @Override
     public void preferenceChanged(PreferenceChangeEvent e) {
         super.preferenceChanged(e);
-        if ("display.discardable-keys".equals(e.getKey()) && Main.main.getCurrentDataSet() != null) {
+        if ("display.discardable-keys".equals(e.getKey()) && Main.getLayerManager().getEditDataSet() != null) {
             // Re-load data when display preference change
             updateSelection();
         }
@@ -1433,7 +1427,8 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
             try {
                 tagRowSorter.convertRowIndexToModel(tagTable.getSelectedRow());
             } catch (IndexOutOfBoundsException ignore) {
-                Main.debug("Clearing tagTable selection, {0}", ignore.toString());
+                Main.trace(ignore);
+                Main.trace("Clearing tagTable selection");
                 tagTable.clearSelection();
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
index 3ff47b7..b00d0ce 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
@@ -382,7 +382,7 @@ public class TagEditHelper {
             private final DefaultListCellRenderer def = new DefaultListCellRenderer();
             @Override
             public Component getListCellRendererComponent(JList<? extends AutoCompletionListItem> list,
-                    AutoCompletionListItem value, int index, boolean isSelected,  boolean cellHasFocus) {
+                    AutoCompletionListItem value, int index, boolean isSelected, boolean cellHasFocus) {
                 Component c = def.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                 if (c instanceof JLabel) {
                     String str = value.getValue();
@@ -418,7 +418,7 @@ public class TagEditHelper {
             JPanel p = new JPanel(new GridBagLayout());
             mainPanel.add(p, BorderLayout.CENTER);
 
-            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
+            AutoCompletionManager autocomplete = Main.getLayerManager().getEditLayer().data.getAutoCompletionManager();
             List<AutoCompletionListItem> keyList = autocomplete.getKeys();
             Collections.sort(keyList, defaultACItemComparator);
 
@@ -601,7 +601,7 @@ public class TagEditHelper {
             selectACComboBoxSavingUnixBuffer(keys);
         }
 
-        public void selectValuesCombobox()   {
+        public void selectValuesCombobox() {
             selectACComboBoxSavingUnixBuffer(values);
         }
 
@@ -675,7 +675,7 @@ public class TagEditHelper {
                 "This will change up to {0} objects.", sel.size(), sel.size())
                 +"<br><br>"+tr("Please select a key")), GBC.eol().fill(GBC.HORIZONTAL));
 
-            AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
+            AutoCompletionManager autocomplete = Main.getLayerManager().getEditLayer().data.getAutoCompletionManager();
             List<AutoCompletionListItem> keyList = autocomplete.getKeys();
 
             AutoCompletionListItem itemToSelect = null;
@@ -1041,10 +1041,14 @@ public class TagEditHelper {
             }
         }
 
+        /**
+         * Destroy the recentTagsActions.
+         */
         public void destroyActions() {
             for (JosmAction action : recentTagsActions) {
                 action.destroy();
             }
+            recentTagsActions.clear();
         }
 
         /**
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
index 7d37a89..a81baa5 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
@@ -158,7 +158,7 @@ public class ChildRelationBrowser extends JPanel {
      * @return the parent dialog; null, if there is no {@link Dialog} as parent dialog
      */
     protected Dialog getParentDialog() {
-        Component c  = this;
+        Component c = this;
         while (c != null && !(c instanceof Dialog)) {
             c = c.getParent();
         }
@@ -388,7 +388,7 @@ public class ChildRelationBrowser extends JPanel {
                 visitor.merge();
                 if (!visitor.getConflicts().isEmpty()) {
                     getLayer().getConflicts().add(visitor.getConflicts());
-                    conflictsCount +=  visitor.getConflicts().size();
+                    conflictsCount += visitor.getConflicts().size();
                 }
             }
         }
@@ -452,7 +452,7 @@ public class ChildRelationBrowser extends JPanel {
                 visitor.merge();
                 if (!visitor.getConflicts().isEmpty()) {
                     getLayer().getConflicts().add(visitor.getConflicts());
-                    conflictsCount +=  visitor.getConflicts().size();
+                    conflictsCount += visitor.getConflicts().size();
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index 08954fc..47b563a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -61,7 +61,6 @@ import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.MainMenu;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedAfterSelection;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedAtEndAction;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AddSelectedAtStartAction;
@@ -105,7 +104,7 @@ import org.openstreetmap.josm.tools.WindowGeometry;
  * This dialog is for editing relations.
  * @since 343
  */
-public class GenericRelationEditor extends RelationEditor  {
+public class GenericRelationEditor extends RelationEditor {
     /** the tag table and its model */
     private final TagEditorPanel tagEditorPanel;
     private final ReferringRelationsBrowser referrerBrowser;
@@ -357,9 +356,9 @@ public class GenericRelationEditor extends RelationEditor  {
      */
     protected static JPanel buildOkCancelButtonPanel(OKAction okAction, CancelAction cancelAction) {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
-        pnl.add(new SideButton(okAction));
-        pnl.add(new SideButton(cancelAction));
-        pnl.add(new SideButton(new ContextSensitiveHelpAction(ht("/Dialog/RelationEditor"))));
+        pnl.add(new JButton(okAction));
+        pnl.add(new JButton(cancelAction));
+        pnl.add(new JButton(new ContextSensitiveHelpAction(ht("/Dialog/RelationEditor"))));
         return pnl;
     }
 
@@ -488,7 +487,7 @@ public class GenericRelationEditor extends RelationEditor  {
                 }
         );
         tfRole.setEnabled(memberTable.getSelectedRowCount() > 0);
-        SideButton btnApply = new SideButton(setRoleAction);
+        JButton btnApply = new JButton(setRoleAction);
         btnApply.setPreferredSize(new Dimension(20, 20));
         btnApply.setText("");
         p3.add(btnApply);
@@ -756,7 +755,7 @@ public class GenericRelationEditor extends RelationEditor  {
             memberTable.stopHighlighting();
             selectionTableModel.unregister();
             memberTableModel.unregister();
-            memberTable.unlinkAsListener();
+            memberTable.unregisterListeners();
             if (windowMenuItem != null) {
                 Main.main.menu.windowMenu.remove(windowMenuItem);
                 windowMenuItem = null;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
index 253cb90..324d3ff 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
@@ -27,11 +27,14 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType;
 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTable;
@@ -81,7 +84,7 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
     protected JPopupMenu buildPopupMenu() {
         JPopupMenu menu = super.buildPopupMenu();
         zoomToGap = new ZoomToGapAction();
-        MapView.addLayerChangeListener(zoomToGap);
+        registerListeners();
         getSelectionModel().addListSelectionListener(zoomToGap);
         menu.add(zoomToGap);
         menu.addSeparator();
@@ -134,9 +137,17 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
     }
 
     @Override
-    public void unlinkAsListener() {
-        super.unlinkAsListener();
-        MapView.removeLayerChangeListener(zoomToGap);
+    public void registerListeners() {
+        Main.getLayerManager().addLayerChangeListener(zoomToGap);
+        Main.getLayerManager().addActiveLayerChangeListener(zoomToGap);
+        super.registerListeners();
+    }
+
+    @Override
+    public void unregisterListeners() {
+        super.unregisterListeners();
+        Main.getLayerManager().removeLayerChangeListener(zoomToGap);
+        Main.getLayerManager().removeActiveLayerChangeListener(zoomToGap);
     }
 
     public void stopHighlighting() {
@@ -188,7 +199,7 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
         }
     }
 
-    private class ZoomToGapAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+    private class ZoomToGapAction extends AbstractAction implements LayerChangeListener, ActiveLayerChangeListener, ListSelectionListener {
 
         /**
          * Constructs a new {@code ZoomToGapAction}.
@@ -229,7 +240,7 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
 
         private void updateEnabledState() {
             setEnabled(Main.main != null
-                    && Main.main.getEditLayer() == getLayer()
+                    && Main.getLayerManager().getEditLayer() == getLayer()
                     && getSelectedRowCount() == 1
                     && hasGap());
         }
@@ -240,19 +251,24 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
         }
 
         @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
             updateEnabledState();
         }
 
         @Override
-        public void layerAdded(Layer newLayer) {
+        public void layerAdded(LayerAddEvent e) {
             updateEnabledState();
         }
 
         @Override
-        public void layerRemoved(Layer oldLayer) {
+        public void layerRemoving(LayerRemoveEvent e) {
             updateEnabledState();
         }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // Do nothing
+        }
     }
 
     protected MemberTableModel getMemberTableModel() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
index 4a8e0fb..bfac520 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
@@ -125,8 +125,8 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             setDotted(g);
             y1 = 7;
 
-            int[] xValues  = {xoff - xowloop + 1, xoff - xowloop + 1, xoff};
-            int[] yValues  = {ymax, y1+1, 1};
+            int[] xValues = {xoff - xowloop + 1, xoff - xowloop + 1, xoff};
+            int[] yValues = {ymax, y1+1, 1};
             g.drawPolyline(xValues, yValues, 3);
             unsetDotted(g);
             g.drawLine(xoff + xowloop, y1+1, xoff, 1);
@@ -136,8 +136,8 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             setDotted(g);
             y2 = ymax - 7;
 
-            int[] xValues  = {xoff+1, xoff - xowloop + 1, xoff - xowloop + 1};
-            int[] yValues  = {ymax-1, y2, y1};
+            int[] xValues = {xoff+1, xoff - xowloop + 1, xoff - xowloop + 1};
+            int[] yValues = {ymax-1, y2, y1};
             g.drawPolyline(xValues, yValues, 3);
             unsetDotted(g);
             g.drawLine(xoff + xowloop, y2, xoff, ymax-1);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
index 40abb45..d72479f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
@@ -107,7 +107,7 @@ implements TableModelListener, SelectionChangedListener, DataSetListener, OsmPri
     /* --------------------------------------------------------------------------- */
     @Override
     public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        if (Main.main.getEditLayer() != this.layer) return;
+        if (Main.getLayerManager().getEditLayer() != this.layer) return;
         // just trigger a repaint
         Collection<RelationMember> sel = getSelectedMembers();
         fireTableDataChanged();
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
index 834f849..31449bf 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
@@ -30,7 +30,7 @@ import org.xml.sax.SAXException;
  * <pre>
  *  final ParentRelationLoadingTask task = new ParentRelationLoadingTask(
  *                   child,   // the child relation
- *                   Main.main.getEditLayer(), // the edit layer
+ *                   Main.getLayerManager().getEditLayer(), // the edit layer
  *                   true,  // load fully
  *                   new PleaseWaitProgressMonitor()  // a progress monitor
  *   );
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
index 6de8867..1b3a9c3 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
@@ -10,6 +10,7 @@ import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JList;
 import javax.swing.JPanel;
@@ -23,7 +24,6 @@ import javax.swing.event.ListSelectionListener;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -67,12 +67,12 @@ public class ReferringRelationsBrowser extends JPanel {
 
         ReloadAction reloadAction = new ReloadAction();
         referrers.getModel().addListDataListener(reloadAction);
-        pnl.add(new SideButton(reloadAction));
+        pnl.add(new JButton(reloadAction));
         pnl.add(cbReadFull);
 
         editAction = new EditAction();
         referrers.getSelectionModel().addListSelectionListener(editAction);
-        pnl.add(new SideButton(editAction));
+        pnl.add(new JButton(editAction));
         add(pnl, BorderLayout.SOUTH);
     }
 
@@ -91,7 +91,7 @@ public class ReferringRelationsBrowser extends JPanel {
     class ReloadAction extends AbstractAction implements ListDataListener {
         ReloadAction() {
             putValue(SHORT_DESCRIPTION, tr("Load parent relations"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
+            new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
             putValue(NAME, tr("Reload"));
             refreshEnabled();
         }
@@ -145,7 +145,7 @@ public class ReferringRelationsBrowser extends JPanel {
     class EditAction extends AbstractAction implements ListSelectionListener {
         EditAction() {
             putValue(SHORT_DESCRIPTION, tr("Edit the currently selected relation"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+            new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
             putValue(NAME, tr("Edit"));
             refreshEnabled();
         }
@@ -179,7 +179,7 @@ public class ReferringRelationsBrowser extends JPanel {
     class DblClickMouseAdapter extends MouseAdapter {
         @Override
         public void mouseClicked(MouseEvent e) {
-            if (e.getClickCount() == 2)  {
+            if (e.getClickCount() == 2) {
                 editAction.run();
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
index a2eb0a8..7f492f7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationDialogManager.java
@@ -10,16 +10,20 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
  * RelationDialogManager keeps track of the open relation editors.
  *
  */
-public class RelationDialogManager extends WindowAdapter implements MapView.LayerChangeListener {
+public class RelationDialogManager extends WindowAdapter implements LayerChangeListener {
 
     /** keeps track of open relation editors */
     private static RelationDialogManager relationDialogManager;
@@ -32,7 +36,7 @@ public class RelationDialogManager extends WindowAdapter implements MapView.Laye
     public static RelationDialogManager getRelationDialogManager() {
         if (RelationDialogManager.relationDialogManager == null) {
             RelationDialogManager.relationDialogManager = new RelationDialogManager();
-            MapView.addLayerChangeListener(RelationDialogManager.relationDialogManager);
+            Main.getLayerManager().addLayerChangeListener(RelationDialogManager.relationDialogManager);
         }
         return RelationDialogManager.relationDialogManager;
     }
@@ -166,12 +170,9 @@ public class RelationDialogManager extends WindowAdapter implements MapView.Laye
         return openDialogs.get(context);
     }
 
-    /**
-     * called when a layer is removed
-     *
-     */
     @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        Layer oldLayer = e.getRemovedLayer();
         if (!(oldLayer instanceof OsmDataLayer))
             return;
         OsmDataLayer dataLayer = (OsmDataLayer) oldLayer;
@@ -189,13 +190,13 @@ public class RelationDialogManager extends WindowAdapter implements MapView.Laye
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // do nothing
+    public void layerAdded(LayerAddEvent e) {
+        // ignore
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        // do nothing
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignore
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
index 2ad69c4..7fdf872 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
@@ -87,7 +87,7 @@ public class RelationTree extends JTree {
 
         @Override
         public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
-            TreePath path  = event.getPath();
+            TreePath path = event.getPath();
             Relation parent = (Relation) event.getPath().getLastPathComponent();
             if (!parent.isIncomplete() || parent.isNew())
                 // we don't load complete  or new relations
@@ -134,10 +134,10 @@ public class RelationTree extends JTree {
                 Main.error(lastException);
                 return;
             }
-            DataSetMerger visitor = new DataSetMerger(Main.main.getEditLayer().data, ds);
+            DataSetMerger visitor = new DataSetMerger(Main.getLayerManager().getEditLayer().data, ds);
             visitor.merge();
             if (!visitor.getConflicts().isEmpty()) {
-                Main.main.getEditLayer().getConflicts().add(visitor.getConflicts());
+                Main.getLayerManager().getEditLayer().getConflicts().add(visitor.getConflicts());
             }
             final RelationTreeModel model = (RelationTreeModel) getModel();
             SwingUtilities.invokeLater(
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java
index 8cebfc6..b43003f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableColumnModel.java
@@ -11,7 +11,7 @@ import javax.swing.table.TableColumnModel;
  * This is the {@link TableColumnModel} used in {@link SelectionTable}.
  * @since 1790
  */
-public class SelectionTableColumnModel  extends DefaultTableColumnModel {
+public class SelectionTableColumnModel extends DefaultTableColumnModel {
 
     /**
      * Constructs a new {@code SelectionTableColumnModel}.
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
index fe71e33..0cdb59f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableModel.java
@@ -10,12 +10,16 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, MapView.LayerChangeListener {
+public class SelectionTableModel extends AbstractTableModel implements SelectionChangedListener, ActiveLayerChangeListener, LayerChangeListener {
 
     /** this selection table model only displays selected primitives in this layer */
     private final transient OsmDataLayer layer;
@@ -39,7 +43,7 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
      */
     public void register() {
         DataSet.addSelectionListener(this);
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     /**
@@ -47,7 +51,7 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
      */
     public void unregister() {
         DataSet.removeSelectionListener(this);
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
     }
 
     @Override
@@ -57,7 +61,7 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
 
     @Override
     public int getRowCount() {
-        if (Main.main.getEditLayer() != layer)
+        if (Main.getLayerManager().getEditLayer() != layer)
             return 0;
         return cache.size();
     }
@@ -68,24 +72,24 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (oldLayer  == layer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        if (e.getPreviousActiveLayer() == layer) {
             cache.clear();
         }
-        if (newLayer == layer) {
-            cache.addAll(((OsmDataLayer) newLayer).data.getAllSelected());
+        if (e.getSource().getActiveLayer() == layer) {
+            cache.addAll(layer.data.getAllSelected());
         }
         fireTableDataChanged();
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // do nothing
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer == layer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() == layer) {
             unregister();
         }
         this.cache.clear();
@@ -93,8 +97,13 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
     }
 
     @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // do nothing
+    }
+
+    @Override
     public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
-        if (layer == Main.main.getEditLayer()) {
+        if (layer == Main.getLayerManager().getEditLayer()) {
             cache.clear();
             cache.addAll(newSelection);
         } else {
@@ -127,4 +136,5 @@ public class SelectionTableModel extends AbstractTableModel implements Selection
     public OsmPrimitive getPrimitive(int row) {
         return cache.get(row);
     }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAfterSelection.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAfterSelection.java
index 95bad3a..29b315a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAfterSelection.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAfterSelection.java
@@ -7,8 +7,8 @@ import java.awt.event.ActionEvent;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -42,9 +42,7 @@ public class AddSelectedAfterSelection extends AddFromSelectionAction {
             memberTableModel.addMembersAfterIdx(filterConfirmedPrimitives(selectionTableModel.getSelection()),
                     memberTableModel.getSelectionModel().getMaxSelectionIndex());
         } catch (AddAbortException ex) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ex.getMessage());
-            }
+            Main.trace(ex);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtEndAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtEndAction.java
index 90b1c97..65027c5 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtEndAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtEndAction.java
@@ -7,8 +7,8 @@ import java.awt.event.ActionEvent;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -41,9 +41,7 @@ public class AddSelectedAtEndAction extends AddFromSelectionAction {
         try {
             memberTableModel.addMembersAtEnd(filterConfirmedPrimitives(selectionTableModel.getSelection()));
         } catch (AddAbortException ex) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ex.getMessage());
-            }
+            Main.trace(ex);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtStartAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtStartAction.java
index 0e439a2..522ef4f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtStartAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedAtStartAction.java
@@ -7,8 +7,8 @@ import java.awt.event.ActionEvent;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -41,9 +41,7 @@ public class AddSelectedAtStartAction extends AddFromSelectionAction {
         try {
             memberTableModel.addMembersAtBeginning(filterConfirmedPrimitives(selectionTableModel.getSelection()));
         } catch (AddAbortException ex) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ex.getMessage());
-            }
+            Main.trace(ex);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedBeforeSelection.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedBeforeSelection.java
index 15c2377..4578bb5 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedBeforeSelection.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddSelectedBeforeSelection.java
@@ -7,8 +7,8 @@ import java.awt.event.ActionEvent;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -42,9 +42,7 @@ public class AddSelectedBeforeSelection extends AddFromSelectionAction {
             memberTableModel.addMembersBeforeIdx(filterConfirmedPrimitives(selectionTableModel.getSelection()),
                     memberTableModel.getSelectionModel().getMinSelectionIndex());
         } catch (AddAbortException ex) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ex.getMessage());
-            }
+            Main.trace(ex);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java
index 29afeb1..e310967 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/CancelAction.java
@@ -42,7 +42,7 @@ public class CancelAction extends SavingAction {
             IRelationEditor editor, AutoCompletingTextField tfRole) {
         super(memberTable, memberTableModel, tagModel, layer, editor, tfRole);
         putValue(SHORT_DESCRIPTION, tr("Cancel the updates and close the dialog"));
-        putValue(SMALL_ICON, ImageProvider.get("cancel"));
+        new ImageProvider("cancel").getResource().attachImageIcon(this);
         putValue(NAME, tr("Cancel"));
 
         if (editor instanceof RootPaneContainer) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java
index cb8096c..e5f7a22 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/OKAction.java
@@ -32,7 +32,7 @@ public class OKAction extends SavingAction {
             IRelationEditor editor, AutoCompletingTextField tfRole) {
         super(memberTable, memberTableModel, tagModel, layer, editor, tfRole);
         putValue(SHORT_DESCRIPTION, tr("Apply the updates and close the dialog"));
-        putValue(SMALL_ICON, ImageProvider.get("ok"));
+        new ImageProvider("ok").getResource().attachImageIcon(this);
         putValue(NAME, tr("OK"));
         setEnabled(true);
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/PasteMembersAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/PasteMembersAction.java
index 6b76cfb..eaa08d2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/PasteMembersAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/PasteMembersAction.java
@@ -14,8 +14,8 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
+import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -70,9 +70,7 @@ public class PasteMembersAction extends AddFromSelectionAction {
             memberTableModel.addMembersAfterIdx(toAdd, index);
 
         } catch (AddAbortException ex) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ex.getMessage());
-            }
+            Main.trace(ex);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RemoveSelectedAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RemoveSelectedAction.java
index a9f0639..b3fd242 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RemoveSelectedAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/RemoveSelectedAction.java
@@ -33,7 +33,7 @@ public class RemoveSelectedAction extends AddFromSelectionAction {
     @Override
     protected void updateEnabledState() {
         DataSet ds = layer.data;
-        if (ds == null || ds.getSelected().isEmpty()) {
+        if (ds == null || ds.selectionEmpty()) {
             setEnabled(false);
             return;
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java
index 6bbb550..0d42ba7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/actions/SetRoleAction.java
@@ -35,7 +35,7 @@ public class SetRoleAction extends AbstractRelationEditorAction implements Docum
         super(memberTable, memberTableModel, null);
         this.tfRole = tfRole;
         putValue(SHORT_DESCRIPTION, tr("Sets a role for the selected members"));
-        putValue(SMALL_ICON, ImageProvider.get("apply"));
+        new ImageProvider("apply").getResource().attachImageIcon(this);
         putValue(NAME, tr("Apply Role"));
         updateEnabledState();
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java b/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
index 44b9da0..163819b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanel.java
@@ -323,7 +323,7 @@ public class ValidatorTreePanel extends JTree implements Destroyable {
         if (errors == null)
             return;
         clearErrors();
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         for (TestError error : newerrors) {
             if (!error.isIgnored()) {
                 errors.add(error);
@@ -442,7 +442,7 @@ public class ValidatorTreePanel extends JTree implements Destroyable {
 
     private void clearErrors() {
         if (errors != null) {
-            DataSet ds = Main.main.getCurrentDataSet();
+            DataSet ds = Main.getLayerManager().getEditDataSet();
             if (ds != null) {
                 for (TestError e : errors) {
                     ds.removeDataSetListener(e);
diff --git a/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java b/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
index c79ad38..d947460 100644
--- a/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
@@ -80,7 +80,7 @@ public class BookmarkSelection implements DownloadSelection {
     protected JPanel buildDownloadAreaAddPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
 
-        GridBagConstraints  gc = new GridBagConstraints();
+        GridBagConstraints gc = new GridBagConstraints();
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.insets = new Insets(5, 5, 5, 5);
         pnl.add(lblCurrentDownloadArea, gc);
diff --git a/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java b/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
index db4543d..7732701 100644
--- a/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
@@ -306,7 +306,7 @@ public class BoundingBoxSelection implements DownloadSelection {
         }
 
         protected void refreshBounds() {
-            Bounds  b = build();
+            Bounds b = build();
             parent.boundingBoxChanged(b, BoundingBoxSelection.this);
         }
 
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
index b8eb0f5..c937092 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
@@ -37,7 +38,6 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -53,7 +53,7 @@ import org.openstreetmap.josm.tools.WindowGeometry;
 /**
  * Dialog displayed to download OSM and/or GPS data from OSM server.
  */
-public class DownloadDialog extends JDialog  {
+public class DownloadDialog extends JDialog {
     /** the unique instance of the download dialog */
     private static DownloadDialog instance;
 
@@ -83,7 +83,7 @@ public class DownloadDialog extends JDialog  {
     protected JCheckBox cbDownloadNotes;
     /** the download action and button */
     private final DownloadAction actDownload = new DownloadAction();
-    protected final SideButton btnDownload = new SideButton(actDownload);
+    protected final JButton btnDownload = new JButton(actDownload);
 
     private void makeCheckBoxRespondToEnter(JCheckBox cb) {
         cb.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "doDownload");
@@ -168,10 +168,10 @@ public class DownloadDialog extends JDialog  {
         pnl.add(cbNewLayer, GBC.std().anchor(GBC.WEST).insets(5, 5, 5, 5));
         pnl.add(cbStartup, GBC.std().anchor(GBC.WEST).insets(15, 5, 5, 5));
 
-        pnl.add(sizeCheck,  GBC.eol().anchor(GBC.EAST).insets(5, 5, 5, 2));
+        pnl.add(sizeCheck, GBC.eol().anchor(GBC.EAST).insets(5, 5, 5, 2));
 
         if (!ExpertToggleAction.isExpert()) {
-            JLabel infoLabel  = new JLabel(
+            JLabel infoLabel = new JLabel(
                     tr("Use left click&drag to select area, arrows or right mouse button to scroll map, wheel or +/- to zoom."));
             pnl.add(infoLabel, GBC.eol().anchor(GBC.SOUTH).insets(0, 0, 0, 0));
         }
@@ -198,9 +198,9 @@ public class DownloadDialog extends JDialog  {
         makeCheckBoxRespondToEnter(cbNewLayer);
 
         // -- cancel button
-        SideButton btnCancel;
+        JButton btnCancel;
         CancelAction actCancel = new CancelAction();
-        btnCancel = new SideButton(actCancel);
+        btnCancel = new JButton(actCancel);
         pnl.add(btnCancel);
         InputMapUtils.enableEnter(btnCancel);
 
@@ -209,7 +209,7 @@ public class DownloadDialog extends JDialog  {
         getRootPane().getActionMap().put("cancel", actCancel);
 
         // -- help button
-        SideButton btnHelp = new SideButton(new ContextSensitiveHelpAction(getRootPane().getClientProperty("help").toString()));
+        JButton btnHelp = new JButton(new ContextSensitiveHelpAction(getRootPane().getClientProperty("help").toString()));
         pnl.add(btnHelp);
         InputMapUtils.enableEnter(btnHelp);
 
@@ -483,7 +483,7 @@ public class DownloadDialog extends JDialog  {
     class CancelAction extends AbstractAction {
         CancelAction() {
             putValue(NAME, tr("Cancel"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and to abort downloading"));
         }
 
@@ -501,7 +501,7 @@ public class DownloadDialog extends JDialog  {
     class DownloadAction extends AbstractAction {
         DownloadAction() {
             putValue(NAME, tr("Download"));
-            putValue(SMALL_ICON, ImageProvider.get("download"));
+            new ImageProvider("download").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to download the currently selected area"));
             setEnabled(!Main.isOffline(OnlineResource.OSM_API));
         }
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java b/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
index 4995790..a5487c8 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadObjectDialog.java
@@ -23,9 +23,11 @@ import org.openstreetmap.josm.io.OnlineResource;
  */
 public class DownloadObjectDialog extends OsmIdSelectionDialog {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     protected final JCheckBox referrers = new JCheckBox(tr("Download referrers (parent relations)"));
     protected final JCheckBox fullRel   = new JCheckBox(tr("Download relation members"));
     protected final JCheckBox newLayer  = new JCheckBox(tr("Separate Layer"));
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     /**
      * Constructs a new DownloadObjectDialog with Main.parent as parent component.
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadSelection.java b/src/org/openstreetmap/josm/gui/download/DownloadSelection.java
index d9dde3b..f69346f 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadSelection.java
@@ -3,7 +3,7 @@ package org.openstreetmap.josm.gui.download;
 
 import org.openstreetmap.josm.data.Bounds;
 
-public interface DownloadSelection  {
+public interface DownloadSelection {
 
     /**
      * Add the GUI elements to the dialog.
diff --git a/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java b/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java
index a4b70b9..f81a02d 100644
--- a/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java
+++ b/src/org/openstreetmap/josm/gui/help/ContextSensitiveHelpAction.java
@@ -46,7 +46,7 @@ public class ContextSensitiveHelpAction extends AbstractAction {
     public ContextSensitiveHelpAction(String helpTopic) {
         putValue(SHORT_DESCRIPTION, tr("Show help information"));
         putValue(NAME, tr("Help"));
-        putValue(SMALL_ICON, ImageProvider.get("help"));
+        new ImageProvider("help").getResource().attachImageIcon(this);
         this.helpTopic = helpTopic;
         setEnabled(!Main.isOffline(OnlineResource.JOSM_WEBSITE));
     }
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java
index 146460b..c0f9b58 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java
@@ -13,6 +13,7 @@ import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
@@ -24,7 +25,6 @@ import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -100,11 +100,11 @@ public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListe
 
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
-        SideButton btn = new SideButton(new ReloadAction());
+        JButton btn = new JButton(new ReloadAction());
         btn.setName("btn.reload");
         pnl.add(btn);
 
-        btn = new SideButton(closeAction);
+        btn = new JButton(closeAction);
         final String closeHistoryBrowserDialogKey = "CloseHistoryBrowserDialog";
         KeyStroke escapeKey = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
         getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(escapeKey, closeHistoryBrowserDialogKey);
@@ -112,7 +112,7 @@ public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListe
         btn.setName("btn.close");
         pnl.add(btn);
 
-        btn = new SideButton(new ContextSensitiveHelpAction(ht("/Action/ObjectHistory")));
+        btn = new JButton(new ContextSensitiveHelpAction(ht("/Action/ObjectHistory")));
         btn.setName("btn.help");
         pnl.add(btn);
         add(pnl, BorderLayout.SOUTH);
@@ -158,7 +158,7 @@ public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListe
         CloseAction() {
             putValue(NAME, tr("Close"));
             putValue(SHORT_DESCRIPTION, tr("Close the dialog"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
         }
 
         public void run() {
@@ -177,7 +177,7 @@ public class HistoryBrowserDialog extends JDialog implements HistoryDataSetListe
         ReloadAction() {
             putValue(NAME, tr("Reload"));
             putValue(SHORT_DESCRIPTION, tr("Reload the history from the server"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
+            new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
index 1aae5c4..73cdcfc 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
@@ -21,8 +21,10 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.WindowGeometry;
@@ -32,7 +34,7 @@ import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
  * Manager allowing to show/hide history dialogs.
  * @since 2019
  */
-public final class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
+public final class HistoryBrowserDialogManager implements LayerChangeListener {
 
     private static final String WINDOW_GEOMETRY_PREF = HistoryBrowserDialogManager.class.getName() + ".geometry";
 
@@ -53,7 +55,7 @@ public final class HistoryBrowserDialogManager implements MapView.LayerChangeLis
 
     protected HistoryBrowserDialogManager() {
         dialogs = new HashMap<>();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     /**
@@ -152,23 +154,23 @@ public final class HistoryBrowserDialogManager implements MapView.LayerChangeLis
     /* LayerChangeListener                                                           */
     /* ----------------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         // remove all history browsers if the number of layers drops to 0
-        if (Main.isDisplayingMapView() && Main.map.mapView.getNumLayers() == 0) {
+        if (e.getSource().getLayers().isEmpty()) {
             hideAll();
         }
     }
 
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // Do nothing
+    }
+
     /**
      * Show history dialog(s) for the given primitive(s).
      * @param primitives The primitive(s) for which history will be displayed
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
index 2b25290..b2f4144 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
@@ -40,9 +40,9 @@ import org.openstreetmap.josm.data.osm.history.HistoryRelation;
 import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -73,7 +73,7 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  *
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeListener, DataSetListener {
+public class HistoryBrowserModel extends ChangeNotifier implements ActiveLayerChangeListener, DataSetListener {
     /** the history of an OsmPrimitive */
     private History history;
     private HistoryOsmPrimitive reference;
@@ -105,12 +105,12 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
         referenceRelationMemberTableModel = new DiffTableModel();
 
         if (Main.main != null) {
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer != null) {
                 editLayer.data.addDataSetListener(this);
             }
         }
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
     }
 
     /**
@@ -173,7 +173,7 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
         this.history = history;
         if (history.getNumVersions() > 0) {
             HistoryOsmPrimitive newLatest = null;
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer != null) {
                 OsmPrimitive p = editLayer.data.getPrimitiveById(history.getId(), history.getType());
                 if (canShowAsLatest(p)) {
@@ -305,7 +305,7 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
             throw new IllegalStateException(tr("History not initialized yet. Failed to set reference primitive."));
         if (reference.getId() != history.getId())
             throw new IllegalArgumentException(
-                    tr("Failed to set reference. Reference ID {0} does not match history ID {1}.", reference.getId(),  history.getId()));
+                    tr("Failed to set reference. Reference ID {0} does not match history ID {1}.", reference.getId(), history.getId()));
         HistoryOsmPrimitive primitive = history.getByVersion(reference.getVersion());
         if (primitive == null)
             throw new IllegalArgumentException(
@@ -336,7 +336,7 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
             throw new IllegalStateException(tr("History not initialized yet. Failed to set current primitive."));
         if (current.getId() != history.getId())
             throw new IllegalArgumentException(
-                    tr("Failed to set reference. Reference ID {0} does not match history ID {1}.", current.getId(),  history.getId()));
+                    tr("Failed to set reference. Reference ID {0} does not match history ID {1}.", current.getId(), history.getId()));
         HistoryOsmPrimitive primitive = history.getByVersion(current.getVersion());
         if (primitive == null)
             throw new IllegalArgumentException(
@@ -373,7 +373,7 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
      * @return the respective primitive. Can be null.
      * @throws IllegalArgumentException if type is null
      */
-    public HistoryOsmPrimitive getPointInTime(PointInTimeType type)  {
+    public HistoryOsmPrimitive getPointInTime(PointInTimeType type) {
         CheckParameterUtil.ensureParameterNotNull(type, "type");
         if (type.equals(PointInTimeType.CURRENT_POINT_IN_TIME))
             return current;
@@ -531,7 +531,7 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
         public OsmPrimitive getLatest() {
             if (latest == null)
                 return null;
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer == null)
                 return null;
             return editLayer.data.getPrimitiveById(latest.getId(), latest.getType());
@@ -665,11 +665,11 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
      *
      */
     public void unlinkAsListener() {
-        OsmDataLayer editLayer = Main.main.getEditLayer();
+        OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
         if (editLayer != null) {
             editLayer.data.removeDataSetListener(this);
         }
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
     }
 
     /* ---------------------------------------------------------------------- */
@@ -746,14 +746,16 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
     }
 
     /* ---------------------------------------------------------------------- */
-    /* LayerChangeListener                                                    */
+    /* ActiveLayerChangeListener                                              */
     /* ---------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        Layer oldLayer = e.getPreviousActiveLayer();
         if (oldLayer instanceof OsmDataLayer) {
             OsmDataLayer l = (OsmDataLayer) oldLayer;
             l.data.removeDataSetListener(this);
         }
+        Layer newLayer = e.getSource().getActiveLayer();
         if (!(newLayer instanceof OsmDataLayer)) {
             latest = null;
             fireModelChange();
@@ -772,16 +774,6 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
         fireModelChange();
     }
 
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // Do nothing
-    }
-
     /**
      * Creates a {@link HistoryOsmPrimitive} from a {@link OsmPrimitive}
      *
@@ -824,4 +816,5 @@ public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeLi
             return clone;
         }
     }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/history/NodeListViewer.java b/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
index 06e7562..d3c7f7b 100644
--- a/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
+++ b/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
@@ -242,7 +242,7 @@ public class NodeListViewer extends JPanel {
                 return;
             OsmPrimitive p = getPrimitiveToZoom();
             if (p != null) {
-                OsmDataLayer editLayer = Main.main.getEditLayer();
+                OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
                 if (editLayer != null) {
                     editLayer.data.setSelected(p.getPrimitiveId());
                     AutoScaleAction.autoScale("selection");
@@ -258,18 +258,14 @@ public class NodeListViewer extends JPanel {
         protected OsmPrimitive getPrimitiveToZoom() {
             if (primitiveId == null)
                 return null;
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             if (editLayer == null)
                 return null;
             return editLayer.data.getPrimitiveById(primitiveId);
         }
 
         public void updateEnabledState() {
-            if (!Main.main.hasEditLayer()) {
-                setEnabled(false);
-                return;
-            }
-            setEnabled(getPrimitiveToZoom() != null);
+            setEnabled(Main.getLayerManager().getEditLayer() != null && getPrimitiveToZoom() != null);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
index ba4e205..44f8ebd 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
@@ -148,7 +148,7 @@ public class VersionInfoPanel extends JPanel implements ChangeListener {
     protected String getInfoText(final Date timestamp, final long version, final boolean isLatest) {
         String text;
         if (isLatest) {
-            OsmDataLayer editLayer = Main.main.getEditLayer();
+            OsmDataLayer editLayer = Main.getLayerManager().getEditLayer();
             text = tr("<html>Version <strong>{0}</strong> currently edited in layer ''{1}''</html>",
                     Long.toString(version),
                     editLayer == null ? tr("unknown") : editLayer.getName()
@@ -193,7 +193,7 @@ public class VersionInfoPanel extends JPanel implements ChangeListener {
     }
 
     protected static String getUserUrl(String username) {
-        return Main.getBaseUserUrl() + '/' +  Utils.encodeUrl(username).replaceAll("\\+", "%20");
+        return Main.getBaseUserUrl() + '/' + Utils.encodeUrl(username).replaceAll("\\+", "%20");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java b/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
index ad2b740..9a561ca 100644
--- a/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
+++ b/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
@@ -78,7 +78,7 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
     protected void synchronizePrimitive(final OsmPrimitiveType type, final long id) {
         // FIXME: should now about the layer this task is running for. might
         // be different from the current edit layer
-        OsmDataLayer layer = Main.main.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         if (layer == null)
             throw new IllegalStateException(tr("Failed to update primitive with id {0} because current edit layer is null", id));
         OsmPrimitive p = layer.data.getPrimitiveById(id, type);
@@ -114,9 +114,11 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
             String myVersion) {
         String lbl;
         switch(primitiveType) {
-        case NODE: lbl =  tr("Synchronize node {0} only", id); break;
-        case WAY: lbl =  tr("Synchronize way {0} only", id); break;
-        case RELATION: lbl =  tr("Synchronize relation {0} only", id); break;
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        case NODE:     lbl = tr("Synchronize node {0} only", id); break;
+        case WAY:      lbl = tr("Synchronize way {0} only", id); break;
+        case RELATION: lbl = tr("Synchronize relation {0} only", id); break;
+        // CHECKSTYLE.ON: SingleSpaceSeparator
         default: throw new AssertionError();
         }
         ButtonSpec[] spec = new ButtonSpec[] {
@@ -139,7 +141,7 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
                         null
                 )
         };
-        String msg =  tr("<html>Uploading <strong>failed</strong> because the server has a newer version of one<br>"
+        String msg = tr("<html>Uploading <strong>failed</strong> because the server has a newer version of one<br>"
                 + "of your nodes, ways, or relations.<br>"
                 + "The conflict is caused by the <strong>{0}</strong> with id <strong>{1}</strong>,<br>"
                 + "the server has version {2}, your version is {3}.<br>"
@@ -187,7 +189,7 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
                         null
                 )
         };
-        String msg =  tr("<html>Uploading <strong>failed</strong> because the server has a newer version of one<br>"
+        String msg = tr("<html>Uploading <strong>failed</strong> because the server has a newer version of one<br>"
                 + "of your nodes, ways, or relations.<br>"
                 + "<br>"
                 + "Click <strong>{0}</strong> to synchronize the entire local dataset with the server.<br>"
@@ -216,7 +218,7 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
      * @param d changeset date
      */
     protected void handleUploadConflictForClosedChangeset(long changesetId, Date d) {
-        String msg =  tr("<html>Uploading <strong>failed</strong> because you have been using<br>"
+        String msg = tr("<html>Uploading <strong>failed</strong> because you have been using<br>"
                 + "changeset {0} which was already closed at {1}.<br>"
                 + "Please upload again with a new or an existing open changeset.</html>",
                 changesetId, DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT)
@@ -265,7 +267,7 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
                 "/Action/Upload#NodeStillInUseInWay"
         );
         if (ret == 0) {
-            DownloadReferrersAction.downloadReferrers(Main.main.getEditLayer(), Arrays.asList(conflict.a));
+            DownloadReferrersAction.downloadReferrers(Main.getLayerManager().getEditLayer(), Arrays.asList(conflict.a));
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java b/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
index 47bf4d0..bb08246 100644
--- a/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
@@ -183,7 +183,7 @@ public class ChangesetManagementPanel extends JPanel implements ListDataListener
      * @param cs the changeset
      */
     public void setSelectedChangesetForNextUpload(Changeset cs) {
-        int idx  = model.getIndexOf(cs);
+        int idx = model.getIndexOf(cs);
         if (idx >= 0) {
             rbExisting.setSelected(true);
             model.setSelectedItem(cs);
diff --git a/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java b/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
index 10f3be5..4d7f792 100644
--- a/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
+++ b/src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
@@ -128,9 +128,9 @@ public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable {
         }
 
         // Append downloaded data to JOSM
-        OsmDataLayer layer = Main.main.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         if (layer == null || this.newLayer)
-            Main.main.addLayer(tmpLayer);
+            Main.getLayerManager().addLayer(tmpLayer);
         else
             layer.mergeFrom(tmpLayer);
 
@@ -156,7 +156,7 @@ public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable {
 
         // Warm about deleted primitives
         final Set<PrimitiveId> del = new HashSet<>();
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         for (PrimitiveId id : ids) {
             OsmPrimitive osm = ds.getPrimitiveById(id);
             if (osm != null && osm.isDeleted()) {
diff --git a/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java b/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
index e9c0877..f40867b 100644
--- a/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
+++ b/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
@@ -32,7 +32,7 @@ public class RecentlyOpenedFilesMenu extends JMenu {
     public RecentlyOpenedFilesMenu() {
         super(tr("Open Recent"));
         setToolTipText(tr("List of recently opened files"));
-        setIcon(new ImageProvider("openrecent").setSize(ImageProvider.ImageSizes.MENU).get());
+        setIcon(ImageProvider.get("openrecent", ImageProvider.ImageSizes.MENU));
         putClientProperty("help", ht("/Action/OpenRecent"));
 
         // build dynamically
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java b/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
index 8a5d4fa..fd346de 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
@@ -40,7 +40,7 @@ public class SaveLayerTask extends AbstractIOTask {
         if (monitor == null) {
             monitor = NullProgressMonitor.INSTANCE;
         }
-        this.layerInfo =  layerInfo;
+        this.layerInfo = layerInfo;
         this.parentMonitor = monitor;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
index e4b9417..47b9dfc 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
@@ -323,7 +323,7 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         }
     }
 
-    class DiscardAndProceedAction extends AbstractAction  implements PropertyChangeListener {
+    class DiscardAndProceedAction extends AbstractAction implements PropertyChangeListener {
         DiscardAndProceedAction() {
             initForDiscardAndExit();
         }
@@ -373,9 +373,7 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
                 setUserAction(UserAction.PROCEED);
                 closeDialog();
             } catch (UserCancelException ignore) {
-                if (Main.isTraceEnabled()) {
-                    Main.trace(ignore.getMessage());
-                }
+                Main.trace(ignore);
             }
         }
     }
@@ -385,13 +383,10 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         private static final String BASE_ICON = "BASE_ICON";
         private final transient Image save = ImageProvider.get("save").getImage();
         private final transient Image upld = ImageProvider.get("upload").getImage();
-        private final transient Image saveDis = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
-        private final transient Image upldDis = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
+        private final transient Image saveDis = new ImageProvider("save").setDisabled(true).get().getImage();
+        private final transient Image upldDis = new ImageProvider("upload").setDisabled(true).get().getImage();
 
         SaveAndProceedAction() {
-            // get disabled versions of icons
-            new JLabel(ImageProvider.get("save")).getDisabledIcon().paintIcon(new JPanel(), saveDis.getGraphics(), 0, 0);
-            new JLabel(ImageProvider.get("upload")).getDisabledIcon().paintIcon(new JPanel(), upldDis.getGraphics(), 0, 0);
             initForSaveAndExit();
         }
 
@@ -413,9 +408,11 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
             Image base = ((ImageIcon) getValue(BASE_ICON)).getImage();
             BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
             Graphics2D g = newIco.createGraphics();
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             g.drawImage(model.getLayersToUpload().isEmpty() ? upldDis : upld, ICON_SIZE*0, 0, ICON_SIZE, ICON_SIZE, null);
             g.drawImage(model.getLayersToSave().isEmpty()   ? saveDis : save, ICON_SIZE*1, 0, ICON_SIZE, ICON_SIZE, null);
             g.drawImage(base,                                                 ICON_SIZE*2, 0, ICON_SIZE, ICON_SIZE, null);
+            // CHECKSTYLE.ON: SingleSpaceSeparator
             putValue(SMALL_ICON, new ImageIcon(newIco));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
index 99c10c9..0b0ff17 100644
--- a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
@@ -96,7 +96,7 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
      * Initializes the panel for user input
      */
     public void startUserInput() {
-        pnlTagEditor.initAutoCompletion(Main.main.getEditLayer());
+        pnlTagEditor.initAutoCompletion(Main.getLayerManager().getEditLayer());
     }
 
     /* -------------------------------------------------------------------------- */
diff --git a/src/org/openstreetmap/josm/gui/io/UploadDialog.java b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
index 537077b..ed679fa 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadDialog.java
@@ -48,7 +48,6 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -179,20 +178,20 @@ public class UploadDialog extends AbstractUploadDialog implements PropertyChange
         pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 
         // -- upload button
-        btnUpload = new SideButton(new UploadAction(this));
+        btnUpload = new JButton(new UploadAction(this));
         pnl.add(btnUpload);
         btnUpload.setFocusable(true);
         InputMapUtils.enableEnter(btnUpload);
 
         // -- cancel button
         CancelAction cancelAction = new CancelAction(this);
-        pnl.add(new SideButton(cancelAction));
+        pnl.add(new JButton(cancelAction));
         getRootPane().registerKeyboardAction(
                 cancelAction,
                 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
                 JComponent.WHEN_IN_FOCUSED_WINDOW
         );
-        pnl.add(new SideButton(new ContextSensitiveHelpAction(ht("/Dialog/Upload"))));
+        pnl.add(new JButton(new ContextSensitiveHelpAction(ht("/Dialog/Upload"))));
         HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/Upload"));
         return pnl;
     }
diff --git a/src/org/openstreetmap/josm/gui/io/UploadPrimitivesTask.java b/src/org/openstreetmap/josm/gui/io/UploadPrimitivesTask.java
index 831e419..529be6d 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadPrimitivesTask.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadPrimitivesTask.java
@@ -219,7 +219,7 @@ public class UploadPrimitivesTask extends AbstractUploadTask {
         // we always clean up the data, even in case of errors. It's possible the data was
         // partially uploaded. Better run on EDT.
         //
-        Runnable r  = new Runnable() {
+        Runnable r = new Runnable() {
             @Override
             public void run() {
                 layer.cleanupAfterUpload(processedPrimitives);
diff --git a/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java b/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
index 06cb470..8916d09 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
@@ -153,7 +153,7 @@ public class UploadSelectionDialog extends JDialog {
     }
 
     public List<OsmPrimitive> getSelectedPrimitives() {
-        List<OsmPrimitive> ret  = new ArrayList<>();
+        List<OsmPrimitive> ret = new ArrayList<>();
         ret.addAll(lstSelectedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstSelectedPrimitives.getSelectedIndices()));
         ret.addAll(lstDeletedPrimitives.getOsmPrimitiveListModel().getPrimitives(lstDeletedPrimitives.getSelectedIndices()));
         return ret;
@@ -258,7 +258,7 @@ public class UploadSelectionDialog extends JDialog {
         CancelAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Cancel uploading"));
             putValue(Action.NAME, tr("Cancel"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("", "cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
             .put(KeyStroke.getKeyStroke("ESCAPE"), "ESCAPE");
             getRootPane().getActionMap().put("ESCAPE", this);
@@ -276,7 +276,7 @@ public class UploadSelectionDialog extends JDialog {
         ContinueAction() {
             putValue(Action.SHORT_DESCRIPTION, tr("Continue uploading"));
             putValue(Action.NAME, tr("Continue"));
-            putValue(Action.SMALL_ICON, ImageProvider.get("", "upload"));
+            new ImageProvider("upload").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/io/UploadStrategySpecification.java b/src/org/openstreetmap/josm/gui/io/UploadStrategySpecification.java
index 0f782ee..a0a63eb 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadStrategySpecification.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadStrategySpecification.java
@@ -14,7 +14,7 @@ import java.util.Objects;
  * <li>whether to close the changeset used after the upload</li>
  * </ul>
  */
-public class UploadStrategySpecification  {
+public class UploadStrategySpecification {
     /** indicates that the chunk size isn't specified */
     public static final int UNSPECIFIED_CHUNK_SIZE = -1;
 
diff --git a/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java b/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java
index c2cdbe6..dfc6cce 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java
@@ -133,7 +133,7 @@ public class UploadedObjectsSummaryPanel extends JPanel {
      *
      * @return the number of objects to upload
      */
-    public int  getNumObjectsToUpload() {
+    public int getNumObjectsToUpload() {
         return lstAdd.getModel().getSize()
         + lstUpdate.getModel().getSize()
         + lstDelete.getModel().getSize();
diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractMapViewPaintable.java b/src/org/openstreetmap/josm/gui/layer/AbstractMapViewPaintable.java
index 7d249cf..6db4ac4 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractMapViewPaintable.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractMapViewPaintable.java
@@ -4,7 +4,7 @@ package org.openstreetmap.josm.gui.layer;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
- * This class implements the invalidation listener mechanism suggested by {@link MapViewPaintable}.
+ * This class implements the invalidation listener mechanism suggested by {@link MapViewPaintable} and a default #atta
  *
  * @author Michael Zangl
  * @since 10031
@@ -12,11 +12,64 @@ import java.util.concurrent.CopyOnWriteArrayList;
 public abstract class AbstractMapViewPaintable implements MapViewPaintable {
 
     /**
+     * This is the default implementation of the layer painter.
+     * <p>
+     * You should not use it. Write your own implementation and put your paint code into that class.
+     * <p>
+     * It propagates all calls to the
+     * {@link MapViewPaintable#paint(java.awt.Graphics2D, org.openstreetmap.josm.gui.MapView, org.openstreetmap.josm.data.Bounds)} method.
+     * @author Michael Zangl
+     * @since 10458
+     */
+    protected class CompatibilityModeLayerPainter implements LayerPainter {
+        @Override
+        public void paint(MapViewGraphics graphics) {
+            AbstractMapViewPaintable.this.paint(
+                    graphics.getDefaultGraphics(),
+                    graphics.getMapView(),
+                    graphics.getClipBounds().getLatLonBoundsBox());
+        }
+
+        @Override
+        public void detachFromMapView(MapViewEvent event) {
+            // ignored in old implementation
+        }
+    }
+
+    /**
      * A list of invalidation listeners to call when this layer is invalidated.
      */
     private final CopyOnWriteArrayList<PaintableInvalidationListener> invalidationListeners = new CopyOnWriteArrayList<>();
 
     /**
+     * This method is called whenever this layer is added to a map view.
+     * <p>
+     * You need to return a painter here.
+     * The {@link MapViewPaintable.LayerPainter#detachFromMapView} method is called when the layer is removed
+     * from that map view. You are free to reuse painters.
+     * <p>
+     * You should always call the super method. See {@link #createMapViewPainter} if you want to influence painter creation.
+     * <p>
+     * This replaces {@link Layer#hookUpMapView} in the long run.
+     * @param event the event.
+     * @return A layer painter.
+     * @since 10458
+     */
+    public LayerPainter attachToMapView(MapViewEvent event) {
+        return createMapViewPainter(event);
+    }
+
+    /**
+     * Creates a new LayerPainter.
+     * @param event The event that triggered the creation.
+     * @return The painter.
+     * @since 10458
+     */
+    protected LayerPainter createMapViewPainter(MapViewEvent event) {
+        return new CompatibilityModeLayerPainter();
+    }
+
+    /**
      * Adds a new paintable invalidation listener.
      * @param l The listener to add.
      */
diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
index 4b3a885..b04e819 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
@@ -77,7 +77,6 @@ import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
@@ -155,6 +154,18 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
     protected T tileSource;
     protected TileLoader tileLoader;
 
+    private final MouseAdapter adapter = new MouseAdapter() {
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            if (!isVisible()) return;
+            if (e.getButton() == MouseEvent.BUTTON3) {
+                clickedTileHolder.setTile(getTileForPixelpos(e.getX(), e.getY()));
+                new TileSourceLayerPopup().show(e.getComponent(), e.getX(), e.getY());
+            } else if (e.getButton() == MouseEvent.BUTTON1) {
+                attribution.handleAttribution(e.getPoint(), true);
+            }
+        }
+    };
     /**
      * Creates Tile Source based Imagery Layer based on Imagery Info
      * @param info imagery info
@@ -163,7 +174,6 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
         super(info);
         setBackgroundLayer(true);
         this.setVisible(true);
-        MapView.addZoomChangeListener(this);
     }
 
     protected abstract TileLoaderFactory getTileLoaderFactory();
@@ -604,53 +614,53 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
     public void hookUpMapView() {
         // this needs to be here and not in constructor to allow empty TileSource class construction
         // using SessionWriter
-        this.tileSource = getTileSource(info);
-        if (this.tileSource == null) {
-            throw new IllegalArgumentException(tr("Failed to create tile source"));
-        }
+        initializeIfRequired();
 
         super.hookUpMapView();
-        projectionChanged(null, Main.getProjection()); // check if projection is supported
-        initTileSource(this.tileSource);
+    }
 
-        final MouseAdapter adapter = new MouseAdapter() {
-            @Override
-            public void mouseClicked(MouseEvent e) {
-                if (!isVisible()) return;
-                if (e.getButton() == MouseEvent.BUTTON3) {
-                    clickedTileHolder.setTile(getTileForPixelpos(e.getX(), e.getY()));
-                    new TileSourceLayerPopup().show(e.getComponent(), e.getX(), e.getY());
-                } else if (e.getButton() == MouseEvent.BUTTON1) {
-                    attribution.handleAttribution(e.getPoint(), true);
-                }
-            }
-        };
-        Main.map.mapView.addMouseListener(adapter);
+    @Override
+    public LayerPainter attachToMapView(MapViewEvent event) {
+        initializeIfRequired();
 
-        MapView.addLayerChangeListener(new LayerChangeListener() {
-            @Override
-            public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-                //
-            }
+        event.getMapView().addMouseListener(adapter);
+        MapView.addZoomChangeListener(AbstractTileSourceLayer.this);
 
-            @Override
-            public void layerAdded(Layer newLayer) {
-                //
+        if (this instanceof NativeScaleLayer) {
+            event.getMapView().setNativeScaleLayer((NativeScaleLayer) this);
+        }
+
+        // FIXME: why do we need this? Without this, if you add a WMS layer and do not move the mouse, sometimes, tiles do not
+        // start loading.
+        // FIXME: Check if this is still required.
+        event.getMapView().repaint(500);
+
+        return super.attachToMapView(event);
+    }
+
+    private void initializeIfRequired() {
+        if (tileSource == null) {
+            tileSource = getTileSource(info);
+            if (tileSource == null) {
+                throw new IllegalArgumentException(tr("Failed to create tile source"));
             }
+            checkLayerMemoryDoesNotExceedMaximum();
+            // check if projection is supported
+            projectionChanged(null, Main.getProjection());
+            initTileSource(this.tileSource);
+        }
+    }
 
+    @Override
+    protected LayerPainter createMapViewPainter(MapViewEvent event) {
+        return new CompatibilityModeLayerPainter() {
             @Override
-            public void layerRemoved(Layer oldLayer) {
-                if (oldLayer == AbstractTileSourceLayer.this) {
-                    Main.map.mapView.removeMouseListener(adapter);
-                    MapView.removeLayerChangeListener(this);
-                    MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
-                }
+            public void detachFromMapView(MapViewEvent event) {
+                event.getMapView().removeMouseListener(adapter);
+                MapView.removeZoomChangeListener(AbstractTileSourceLayer.this);
+                super.detachFromMapView(event);
             }
-        });
-
-        // FIXME: why do we need this? Without this, if you add a WMS layer and do not move the mouse, sometimes, tiles do not
-        // start loading.
-        Main.map.repaint(500);
+        };
     }
 
     /**
@@ -680,7 +690,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
     }
 
     protected int estimateTileCacheSize() {
-        Dimension screenSize = GuiHelper.getMaxiumScreenSize();
+        Dimension screenSize = GuiHelper.getMaximumScreenSize();
         int height = screenSize.height;
         int width = screenSize.width;
         int tileSize = 256; // default tile size
@@ -1263,7 +1273,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
         }
 
         private boolean insane() {
-            return size() > tileCache.getCacheSize();
+            return tileCache == null || size() > tileCache.getCacheSize();
         }
 
         private double tilesSpanned() {
@@ -1525,7 +1535,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
                     continue;
                 }
                 Tile t2 = tempCornerTile(missed);
-                LatLon topLeft2  = new LatLon(tileSource.tileXYToLatLon(missed));
+                LatLon topLeft2 = new LatLon(tileSource.tileXYToLatLon(missed));
                 LatLon botRight2 = new LatLon(tileSource.tileXYToLatLon(t2));
                 TileSet ts2 = new TileSet(topLeft2, botRight2, newzoom);
                 // Instantiating large TileSets is expensive.  If there
@@ -1563,7 +1573,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
         } else if (ts.tooLarge()) {
             myDrawString(g, tr("zoom in to load more tiles"), 120, 120);
         } else if (!autoZoom && ts.tooSmall()) {
-            myDrawString(g, tr("increase zoom level to see more detail"), 120, 120);
+            myDrawString(g, tr("increase tiles zoom level (change resolution) to see more detail"), 120, 120);
         }
 
         if (noTilesAtZoom) {
@@ -1618,7 +1628,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
             if (!r.contains(clicked)) {
                 continue;
             }
-            clickedTile  = t1;
+            clickedTile = t1;
             break;
         }
         if (clickedTile == null)
diff --git a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
index 983093d..da9a97e 100644
--- a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
@@ -299,7 +299,7 @@ public class GpxLayer extends Layer {
         if (!visibleSegments.isEmpty()) {
             drawHelper.readPreferences(getName());
             drawHelper.drawAll(g, mv, visibleSegments);
-            if (Main.map.mapView.getActiveLayer() == this) {
+            if (Main.getLayerManager().getActiveLayer() == this) {
                 drawHelper.drawColorBar(g, mv);
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
index 4e63f88..4a6d290 100644
--- a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
@@ -116,9 +116,15 @@ public abstract class ImageryLayer extends Layer {
         return dy;
     }
 
+    /**
+     * Sets the displacement offset of this layer. The layer is automatically invalidated.
+     * @param dx The x offset
+     * @param dy The y offset
+     */
     public void setOffset(double dx, double dy) {
         this.dx = dx;
         this.dy = dy;
+        invalidate();
     }
 
     public void displace(double dx, double dy) {
@@ -294,9 +300,7 @@ public abstract class ImageryLayer extends Layer {
                     return op4.filter(image, null);
                 }
             } catch (IllegalArgumentException ignore) {
-                if (Main.isTraceEnabled()) {
-                    Main.trace(ignore.getMessage());
-                }
+                Main.trace(ignore);
             }
             final int type = image.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
             final BufferedImage to = new BufferedImage(image.getWidth(), image.getHeight(), type);
@@ -337,7 +341,7 @@ public abstract class ImageryLayer extends Layer {
 
         private static float[] KERNEL_SHARPEN = new float[] {
             -.5f, -1f, -.5f,
-             -1f,  7,  -1f,
+             -1f, 7, -1f,
             -.5f, -1f, -.5f
         };
 
@@ -530,7 +534,7 @@ public abstract class ImageryLayer extends Layer {
         }
 
         private byte mix(int color, double luminosity) {
-            int val = (int) (colorfulness * color +  (1 - colorfulness) * luminosity);
+            int val = (int) (colorfulness * color + (1 - colorfulness) * luminosity);
             if (val < 0) {
                 return 0;
             } else if (val > 0xff) {
diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
index 45f505c..b4f5797 100644
--- a/src/org/openstreetmap/josm/gui/layer/Layer.java
+++ b/src/org/openstreetmap/josm/gui/layer/Layer.java
@@ -16,12 +16,14 @@ import javax.swing.Action;
 import javax.swing.Icon;
 import javax.swing.JOptionPane;
 import javax.swing.JSeparator;
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.GpxExportAction;
 import org.openstreetmap.josm.actions.SaveAction;
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.actions.SaveAsAction;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
@@ -167,19 +169,24 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
      * Remember to call {@code super.hookUpMapView()} when overriding this method
      */
     public void hookUpMapView() {
+        checkLayerMemoryDoesNotExceedMaximum();
+    }
+
+    /**
+     * Checks that the memory required for the layers is no greather than the max memory.
+     */
+    protected static void checkLayerMemoryDoesNotExceedMaximum() {
         // calculate total memory needed for all layers
         long memoryBytesRequired = 50L * 1024L * 1024L; // assumed minimum JOSM memory footprint
-        if (Main.map != null && Main.map.mapView != null) {
-            for (Layer layer: Main.map.mapView.getAllLayers()) {
-                memoryBytesRequired += layer.estimateMemoryUsage();
-            }
-            if (memoryBytesRequired >  Runtime.getRuntime().maxMemory()) {
-                throw new IllegalArgumentException(
-                        tr("To add another layer you need to allocate at least {0,number,#}MB memory to JOSM using -Xmx{0,number,#}M "
-                        + "option (see http://forum.openstreetmap.org/viewtopic.php?id=25677).\n"
-                        + "Currently you have {1,number,#}MB memory allocated for JOSM",
-                        memoryBytesRequired / 1024 / 1024, Runtime.getRuntime().maxMemory() / 1024 / 1024));
-            }
+        for (Layer layer: Main.getLayerManager().getLayers()) {
+            memoryBytesRequired += layer.estimateMemoryUsage();
+        }
+        if (memoryBytesRequired > Runtime.getRuntime().maxMemory()) {
+            throw new IllegalArgumentException(
+                    tr("To add another layer you need to allocate at least {0,number,#}MB memory to JOSM using -Xmx{0,number,#}M "
+                            + "option (see http://forum.openstreetmap.org/viewtopic.php?id=25677).\n"
+                            + "Currently you have {1,number,#}MB memory allocated for JOSM",
+                            memoryBytesRequired / 1024 / 1024, Runtime.getRuntime().maxMemory() / 1024 / 1024));
         }
     }
 
@@ -334,7 +341,7 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
      */
     public void setVisible(boolean visible) {
         boolean oldValue = isVisible();
-        this.visible  = visible;
+        this.visible = visible;
         if (visible && opacity == 0) {
             setOpacity(1);
         } else if (oldValue != isVisible()) {
@@ -524,15 +531,21 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
     @Override
     public void projectionChanged(Projection oldValue, Projection newValue) {
         if (!isProjectionSupported(newValue)) {
-            String message = "<html><body><p>" +
+            final String message = "<html><body><p>" +
                     tr("The layer {0} does not support the new projection {1}.", getName(), newValue.toCode()) + "</p>" +
                     "<p style='width: 450px;'>" + tr("Supported projections are: {0}", nameSupportedProjections()) + "</p>" +
                     tr("Change the projection again or remove the layer.");
 
-            JOptionPane.showMessageDialog(Main.parent,
-                    message,
-                    tr("Warning"),
-                    JOptionPane.WARNING_MESSAGE);
+            // run later to not block loading the UI.
+            SwingUtilities.invokeLater(new Runnable() {
+                @Override
+                public void run() {
+                    JOptionPane.showMessageDialog(Main.parent,
+                            message,
+                            tr("Warning"),
+                            JOptionPane.WARNING_MESSAGE);
+                }
+            });
         }
     }
 
@@ -592,4 +605,17 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
             return LayerPositionStrategy.AFTER_LAST_VALIDATION_LAYER;
         }
     }
+
+    /**
+     * Gets the {@link ProjectionBounds} for this layer to be visible to the user. This can be the exact bounds, the UI handles padding. Return
+     * <code>null</code> if you cannot provide this information. The default implementation uses the bounds from
+     * {@link #visitBoundingBox(BoundingXYVisitor)}.
+     * @return The bounds for this layer.
+     * @since 10371
+     */
+    public ProjectionBounds getViewProjectionBounds() {
+        BoundingXYVisitor v = new BoundingXYVisitor();
+        visitBoundingBox(v);
+        return v.getBounds();
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerManager.java b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
index 8af1dce..eb91262 100644
--- a/src/org/openstreetmap/josm/gui/layer/LayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
@@ -2,12 +2,18 @@
 package org.openstreetmap.josm.gui.layer;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
 
 /**
  * This class handles the layer management.
@@ -81,6 +87,11 @@ public class LayerManager {
         public Layer getAddedLayer() {
             return addedLayer;
         }
+
+        @Override
+        public String toString() {
+            return "LayerAddEvent [addedLayer=" + addedLayer + ']';
+        }
     }
 
     /**
@@ -89,10 +100,13 @@ public class LayerManager {
      */
     public static class LayerRemoveEvent extends LayerManagerEvent {
         private final Layer removedLayer;
+        private final boolean lastLayer;
+        private Collection<Layer> scheduleForRemoval = new ArrayList<>();
 
         LayerRemoveEvent(LayerManager source, Layer removedLayer) {
             super(source);
             this.removedLayer = removedLayer;
+            this.lastLayer = source.getLayers().size() == 1;
         }
 
         /**
@@ -102,6 +116,34 @@ public class LayerManager {
         public Layer getRemovedLayer() {
             return removedLayer;
         }
+
+        /**
+         * Check if the layer that was removed is the last layer in the list.
+         * @return <code>true</code> if this was the last layer.
+         * @since 10432
+         */
+        public boolean isLastLayer() {
+            return lastLayer;
+        }
+
+        /**
+         * Schedule the removal of other layers after this layer has been deleted.
+         * <p>
+         * Dupplicate removal requests are ignored.
+         * @param layers The layers to remove.
+         * @since 10507
+         */
+        public void scheduleRemoval(Collection<? extends Layer> layers) {
+            for (Layer layer : layers) {
+                getSource().checkContainsLayer(layer);
+            }
+            scheduleForRemoval.addAll(layers);
+        }
+
+        @Override
+        public String toString() {
+            return "LayerRemoveEvent [removedLayer=" + removedLayer + ", lastLayer=" + lastLayer + ']';
+        }
     }
 
     /**
@@ -115,6 +157,10 @@ public class LayerManager {
             super(source);
         }
 
+        @Override
+        public String toString() {
+            return "LayerOrderChangeEvent []";
+        }
     }
 
     /**
@@ -148,6 +194,9 @@ public class LayerManager {
         checkPosition(position);
         insertLayerAt(layer, position);
         fireLayerAdded(layer);
+        if (Main.map != null) {
+            layer.hookUpMapView(); // needs to be after fireLayerAdded
+        }
     }
 
     /**
@@ -167,10 +216,25 @@ public class LayerManager {
     }
 
     protected synchronized void realRemoveLayer(Layer layer) {
-        checkContainsLayer(layer);
+        GuiHelper.assertCallFromEdt();
+        Set<Layer> toRemove = Collections.newSetFromMap(new IdentityHashMap<Layer, Boolean>());
+        toRemove.add(layer);
 
-        fireLayerRemoving(layer);
-        layers.remove(layer);
+        while (!toRemove.isEmpty()) {
+            Iterator<Layer> iterator = toRemove.iterator();
+            Layer layerToRemove = iterator.next();
+            iterator.remove();
+            checkContainsLayer(layerToRemove);
+
+            Collection<Layer> newToRemove = realRemoveSingleLayer(layerToRemove);
+            toRemove.addAll(newToRemove);
+        }
+    }
+
+    protected Collection<Layer> realRemoveSingleLayer(Layer layerToRemove) {
+        Collection<Layer> newToRemove = fireLayerRemoving(layerToRemove);
+        layers.remove(layerToRemove);
+        return newToRemove;
     }
 
     /**
@@ -303,12 +367,12 @@ public class LayerManager {
         removeLayerChangeListener(listener, false);
     }
 
-
     /**
      * Removes a layer change listener
      *
      * @param listener the listener.
-     * @param fireRemove if we should fire a remove event for every layer in this manager.
+     * @param fireRemove if we should fire a remove event for every layer in this manager. The event is fired as if the layer was deleted but
+     * {@link LayerRemoveEvent#scheduleRemoval(Collection)} is ignored.
      */
     public synchronized void removeLayerChangeListener(LayerChangeListener listener, boolean fireRemove) {
         if (!layerChangeListeners.remove(listener)) {
@@ -326,23 +390,54 @@ public class LayerManager {
         GuiHelper.assertCallFromEdt();
         LayerAddEvent e = new LayerAddEvent(this, layer);
         for (LayerChangeListener l : layerChangeListeners) {
-            l.layerAdded(e);
+            try {
+                l.layerAdded(e);
+            } catch (RuntimeException t) {
+                throw BugReport.intercept(t).put("listener", l).put("event", e);
+            }
         }
     }
 
-    private void fireLayerRemoving(Layer layer) {
+    /**
+     * Fire the layer remove event
+     * @param layer The layer to remove
+     * @return A list of layers that should be removed afterwards.
+     */
+    private Collection<Layer> fireLayerRemoving(Layer layer) {
         GuiHelper.assertCallFromEdt();
         LayerRemoveEvent e = new LayerRemoveEvent(this, layer);
         for (LayerChangeListener l : layerChangeListeners) {
-            l.layerRemoving(e);
+            try {
+                l.layerRemoving(e);
+            } catch (RuntimeException t) {
+                throw BugReport.intercept(t).put("listener", l).put("event", e).put("layer", layer);
+            }
         }
+        return e.scheduleForRemoval;
     }
 
     private void fireLayerOrderChanged() {
         GuiHelper.assertCallFromEdt();
         LayerOrderChangeEvent e = new LayerOrderChangeEvent(this);
         for (LayerChangeListener l : layerChangeListeners) {
-            l.layerOrderChanged(e);
+            try {
+                l.layerOrderChanged(e);
+            } catch (RuntimeException t) {
+                throw BugReport.intercept(t).put("listener", l).put("event", e);
+            }
+        }
+    }
+
+    /**
+     * Reset all layer manager state. This includes removing all layers and then unregistering all listeners
+     * @since 10432
+     */
+    public void resetState() {
+        // some layer remove listeners remove other layers.
+        while (!getLayers().isEmpty()) {
+            removeLayer(getLayers().get(0));
         }
+
+        layerChangeListeners.clear();
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
index e07d845..53f2bb8 100644
--- a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
+++ b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.gui.layer;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -75,6 +76,18 @@ public class MainLayerManager extends LayerManager {
             return previousActiveLayer;
         }
 
+        /**
+         * Gets the data set that was previously used.
+         * @return The data set of {@link #getPreviousEditLayer()}.
+         */
+        public DataSet getPreviousEditDataSet() {
+            if (previousEditLayer != null) {
+                return previousEditLayer.data;
+            } else {
+                return null;
+            }
+        }
+
         @Override
         public MainLayerManager getSource() {
             return (MainLayerManager) super.getSource();
@@ -82,6 +95,47 @@ public class MainLayerManager extends LayerManager {
     }
 
     /**
+     * This event is fired for {@link LayerAvailabilityListener}
+     * @author Michael Zangl
+     * @since 10508
+     */
+    public class LayerAvailabilityEvent extends LayerManagerEvent {
+        private final boolean hasLayers;
+
+        LayerAvailabilityEvent(LayerManager source, boolean hasLayers) {
+            super(source);
+            this.hasLayers = hasLayers;
+        }
+
+        /**
+         * Checks if this layer manager will have layers afterwards
+         * @return true if layers will be added.
+         */
+        public boolean hasLayers() {
+            return hasLayers;
+        }
+    }
+
+    /**
+     * A listener that gets informed before any layer is displayed and after all layers are removed.
+     * @author Michael Zangl
+     * @since 10508
+     */
+    public interface LayerAvailabilityListener {
+        /**
+         * This method is called in the UI thread right before the first layer is added.
+         * @param e The event.
+         */
+        void beforeFirstLayerAdded(LayerAvailabilityEvent e);
+
+        /**
+         * This method is called in the UI thread after the last layer was removed.
+         * @param e The event.
+         */
+        void afterLastLayerRemoved(LayerAvailabilityEvent e);
+    }
+
+    /**
      * The layer from the layers list that is currently active.
      */
     private Layer activeLayer;
@@ -92,22 +146,44 @@ public class MainLayerManager extends LayerManager {
     private OsmDataLayer editLayer;
 
     private final List<ActiveLayerChangeListener> activeLayerChangeListeners = new CopyOnWriteArrayList<>();
+    private final List<LayerAvailabilityListener> layerAvailabilityListeners = new CopyOnWriteArrayList<>();
 
     /**
      * Adds a active/edit layer change listener
      *
      * @param listener the listener.
-     * @param initialFire fire a fake active-layer-changed-event right after adding
-     * the listener. The previous layers will be null. The listener is notified in the current thread.
+     * @param initialFire use {@link #addAndFireActiveLayerChangeListener(ActiveLayerChangeListener)} instead.
+     * @deprecated Do not use the second parameter. To be removed in a few weeks.
      */
+    @Deprecated
     public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener, boolean initialFire) {
+        if (initialFire) {
+            addAndFireActiveLayerChangeListener(listener);
+        } else {
+            addActiveLayerChangeListener(listener);
+        }
+    }
+
+    /**
+     * Adds a active/edit layer change listener
+     *
+     * @param listener the listener.
+     */
+    public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener) {
         if (activeLayerChangeListeners.contains(listener)) {
             throw new IllegalArgumentException("Attempted to add listener that was already in list: " + listener);
         }
         activeLayerChangeListeners.add(listener);
-        if (initialFire) {
-            listener.activeOrEditLayerChanged(new ActiveLayerChangeEvent(this, null, null));
-        }
+    }
+
+    /**
+     * Adds a active/edit layer change listener. Fire a fake active-layer-changed-event right after adding
+     * the listener. The previous layers will be null. The listener is notified in the current thread.
+     * @param listener the listener.
+     */
+    public synchronized void addAndFireActiveLayerChangeListener(ActiveLayerChangeListener listener) {
+        addActiveLayerChangeListener(listener);
+        listener.activeOrEditLayerChanged(new ActiveLayerChangeEvent(this, null, null));
     }
 
     /**
@@ -122,6 +198,28 @@ public class MainLayerManager extends LayerManager {
     }
 
     /**
+     * Add a new {@link LayerAvailabilityListener}.
+     * @param listener The listener
+     * @since 10508
+     */
+    public synchronized void addLayerAvailabilityListener(LayerAvailabilityListener listener) {
+        if (!layerAvailabilityListeners.add(listener)) {
+            throw new IllegalArgumentException("Attempted to add listener that was already in list: " + listener);
+        }
+    }
+
+    /**
+     * Remove an {@link LayerAvailabilityListener}.
+     * @param listener The listener
+     * @since 10508
+     */
+    public synchronized void removeLayerAvailabilityListener(LayerAvailabilityListener listener) {
+        if (!layerAvailabilityListeners.remove(listener)) {
+            throw new IllegalArgumentException("Attempted to remove listener that was not in list: " + listener);
+        }
+    }
+
+    /**
      * Set the active layer. If the layer is an OsmDataLayer, the edit layer is also changed.
      * @param layer The active layer.
      */
@@ -164,6 +262,12 @@ public class MainLayerManager extends LayerManager {
 
     @Override
     protected synchronized void realAddLayer(Layer layer) {
+        if (getLayers().isEmpty()) {
+            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, true);
+            for (LayerAvailabilityListener l : layerAvailabilityListeners) {
+                l.beforeFirstLayerAdded(e);
+            }
+        }
         super.realAddLayer(layer);
 
         // update the active layer automatically.
@@ -173,13 +277,20 @@ public class MainLayerManager extends LayerManager {
     }
 
     @Override
-    protected synchronized void realRemoveLayer(Layer layer) {
+    protected Collection<Layer> realRemoveSingleLayer(Layer layer) {
         if (layer == activeLayer || layer == editLayer) {
             Layer nextActive = suggestNextActiveLayer(layer);
             setActiveLayer(nextActive, true);
         }
 
-        super.realRemoveLayer(layer);
+        Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
+        if (getLayers().isEmpty()) {
+            LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
+            for (LayerAvailabilityListener l : layerAvailabilityListeners) {
+                l.afterLastLayerRemoved(e);
+            }
+        }
+        return toDelete;
     }
 
     /**
@@ -242,7 +353,6 @@ public class MainLayerManager extends LayerManager {
         }
     }
 
-
     /**
      * Creates a list of the visible layers in Z-Order, the layer with the lowest Z-Order
      * first, layer with the highest Z-Order last.
@@ -279,4 +389,13 @@ public class MainLayerManager extends LayerManager {
         }
         return ret;
     }
+
+    @Override
+    public void resetState() {
+        // active and edit layer are unset automatically
+        super.resetState();
+
+        activeLayerChangeListeners.clear();
+        layerAvailabilityListeners.clear();
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/MapViewGraphics.java b/src/org/openstreetmap/josm/gui/layer/MapViewGraphics.java
new file mode 100644
index 0000000..c35aab0
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/layer/MapViewGraphics.java
@@ -0,0 +1,62 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import java.awt.Graphics2D;
+
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapViewState.MapViewRectangle;
+
+/**
+ * This class provides layers with access to drawing on the map view.
+ * <p>
+ * It contains information about the state of the map view.
+ * <p>
+ * In the future, it may add support for parallel drawing or layer caching.
+ * <p>
+ * It is intended to be used during {@link MapView#paint(java.awt.Graphics)}
+ * @author Michael Zangl
+ * @since 10458
+ */
+public class MapViewGraphics {
+
+    private final Graphics2D graphics;
+    private final MapView mapView;
+    private final MapViewRectangle clipBounds;
+
+    /**
+     * Constructs a new {@code MapViewGraphics}.
+     * @param mapView map view
+     * @param graphics default graphics
+     * @param clipBounds clip bounds for this graphics instance
+     */
+    public MapViewGraphics(MapView mapView, Graphics2D graphics, MapViewRectangle clipBounds) {
+        this.mapView = mapView;
+        this.graphics = graphics;
+        this.clipBounds = clipBounds;
+    }
+
+    /**
+     * Gets the {@link Graphics2D} you should use to paint on this graphics object. It may already have some data painted on it.
+     * You should paint your layer data on this graphics.
+     * @return The {@link Graphics2D} instance.
+     */
+    public Graphics2D getDefaultGraphics() {
+        return graphics;
+    }
+
+    /**
+     * Gets the {@link MapView} that is the base to this draw call.
+     * @return The map view.
+     */
+    public MapView getMapView() {
+        return mapView;
+    }
+
+    /**
+     * Gets the clip bounds for this graphics instance.
+     * @return The clip bounds.
+     */
+    public MapViewRectangle getClipBounds() {
+        return clipBounds;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java b/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
index 76cb47b..4ce4602 100644
--- a/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
+++ b/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
@@ -60,6 +60,75 @@ public interface MapViewPaintable {
     }
 
     /**
+     * Gets a new LayerPainter that paints this {@link MapViewPaintable} to the given map view.
+     *
+     * @author Michael Zangl
+     * @since 10458
+     */
+    public interface LayerPainter {
+
+        /**
+         * Paints the given layer.
+         * <p>
+         * This can be called in any thread at any time. You will not receive parallel calls for the same map view but you can receive parallel
+         * calls if you use the same {@link LayerPainter} for different map views.
+         * @param graphics The graphics object of the map view you should use.
+         *                 It provides you with a content pane, the bounds and the view state.
+         */
+        void paint(MapViewGraphics graphics);
+
+        /**
+         * Called when the layer is removed from the map view and this painter is not used any more.
+         * <p>
+         * This method is called once on the painter returned by {@link Layer#attachToMapView}
+         * @param event The event.
+         */
+        void detachFromMapView(MapViewEvent event);
+    }
+
+    /**
+     * A event that is fired whenever the map view is attached or detached from any layer.
+     * @author Michael Zangl
+     * @see Layer#attachToMapView
+     * @since 10458
+     */
+    class MapViewEvent {
+        private final MapView mapView;
+        private final boolean temporaryLayer;
+
+        /**
+         * Create a new {@link MapViewEvent}
+         * @param mapView The map view
+         * @param temporaryLayer <code>true</code> if this layer is in the temporary layer list of the view.
+         */
+        public MapViewEvent(MapView mapView, boolean temporaryLayer) {
+            super();
+            this.mapView = mapView;
+            this.temporaryLayer = temporaryLayer;
+        }
+
+        /**
+         * Gets the map view.
+         * @return The map view.
+         */
+        public MapView getMapView() {
+            return mapView;
+        }
+
+        /**
+         * @return true if this {@link MapViewPaintable} is used as a temporary layer.
+         */
+        public boolean isTemporaryLayer() {
+            return temporaryLayer;
+        }
+
+        @Override
+        public String toString() {
+            return "AttachToMapViewEvent [mapView=" + mapView + ", temporaryLayer=" + temporaryLayer + "]";
+        }
+    }
+
+    /**
      * Paint the dataset using the engine set.
      * @param g Graphics
      * @param mv The object that can translate GeoPoints to screen coordinates.
diff --git a/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java b/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
index 8f63ebb..a8cd6b1 100644
--- a/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
@@ -79,7 +79,7 @@ public interface NativeScaleLayer {
     /**
      * List of scales, may include intermediate steps between native resolutions
      */
-    class ScaleList  {
+    class ScaleList {
         private final List<Scale> scales = new ArrayList<>();
 
         protected ScaleList() {
diff --git a/src/org/openstreetmap/josm/gui/layer/NoteLayer.java b/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
index 6214735..90f65b0 100644
--- a/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
@@ -32,7 +32,6 @@ import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
-import org.openstreetmap.josm.gui.dialogs.NotesDialog;
 import org.openstreetmap.josm.gui.io.AbstractIOTask;
 import org.openstreetmap.josm.gui.io.UploadNoteLayerTask;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -40,6 +39,7 @@ import org.openstreetmap.josm.io.NoteExporter;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.XmlWriter;
 import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -106,16 +106,19 @@ public class NoteLayer extends AbstractModifiableLayer implements MouseListener
 
     @Override
     public void paint(Graphics2D g, MapView mv, Bounds box) {
+        final int iconHeight = ImageProvider.ImageSizes.SMALLICON.getAdjustedHeight();
+        final int iconWidth = ImageProvider.ImageSizes.SMALLICON.getAdjustedWidth();
+
         for (Note note : noteData.getNotes()) {
             Point p = mv.getPoint(note.getLatLon());
 
             ImageIcon icon;
             if (note.getId() < 0) {
-                icon = NotesDialog.ICON_NEW_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_new", ImageProvider.ImageSizes.SMALLICON);
             } else if (note.getState() == State.CLOSED) {
-                icon = NotesDialog.ICON_CLOSED_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_closed", ImageProvider.ImageSizes.SMALLICON);
             } else {
-                icon = NotesDialog.ICON_OPEN_SMALL;
+                icon = ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
             }
             int width = icon.getIconWidth();
             int height = icon.getIconHeight();
@@ -150,11 +153,11 @@ public class NoteLayer extends AbstractModifiableLayer implements MouseListener
             Point p = mv.getPoint(noteData.getSelectedNote().getLatLon());
 
             g.setColor(ColorHelper.html2color(Main.pref.get("color.selected")));
-            g.drawRect(p.x - (NotesDialog.ICON_SMALL_SIZE / 2), p.y - NotesDialog.ICON_SMALL_SIZE,
-                    NotesDialog.ICON_SMALL_SIZE - 1, NotesDialog.ICON_SMALL_SIZE - 1);
+            g.drawRect(p.x - (iconWidth / 2), p.y - iconHeight,
+                    iconWidth - 1, iconHeight - 1);
 
-            int tx = p.x + (NotesDialog.ICON_SMALL_SIZE / 2) + 5;
-            int ty = p.y - NotesDialog.ICON_SMALL_SIZE - 1;
+            int tx = p.x + (iconWidth / 2) + 5;
+            int ty = p.y - iconHeight - 1;
             g.translate(tx, ty);
 
             //Carried over from the OSB plugin. Not entirely sure why it is needed
@@ -179,7 +182,7 @@ public class NoteLayer extends AbstractModifiableLayer implements MouseListener
 
     @Override
     public Icon getIcon() {
-        return NotesDialog.ICON_OPEN_SMALL;
+        return ImageProvider.get("dialogs/notes", "note_open", ImageProvider.ImageSizes.SMALLICON);
     }
 
     @Override
@@ -242,11 +245,12 @@ public class NoteLayer extends AbstractModifiableLayer implements MouseListener
         Point clickPoint = e.getPoint();
         double snapDistance = 10;
         double minDistance = Double.MAX_VALUE;
+        final int iconHeight = ImageProvider.ImageSizes.SMALLICON.getAdjustedHeight();
         Note closestNote = null;
         for (Note note : noteData.getNotes()) {
             Point notePoint = Main.map.mapView.getPoint(note.getLatLon());
             //move the note point to the center of the icon where users are most likely to click when selecting
-            notePoint.setLocation(notePoint.getX(), notePoint.getY() - NotesDialog.ICON_SMALL_SIZE / 2);
+            notePoint.setLocation(notePoint.getX(), notePoint.getY() - iconHeight / 2);
             double dist = clickPoint.distanceSq(notePoint);
             if (minDistance > dist && clickPoint.distance(notePoint) < snapDistance) {
                 minDistance = dist;
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
index 6cd3c50..6bcfb13 100644
--- a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
@@ -48,6 +48,7 @@ import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction;
 import org.openstreetmap.josm.data.APIDataSet;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.DataSource;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
@@ -268,12 +269,24 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
     }
 
     /**
-     * Removes a layer property change listener
+     * Removes a layer state change listener
      *
      * @param listener the listener. Ignored if null or already registered.
      * @since 5519
+     * @deprecated Method name contains a typo, use {@link #removeLayerStateChangeListener(LayerStateChangeListener)}.
      */
+    @Deprecated
     public void removeLayerPropertyChangeListener(LayerStateChangeListener listener) {
+        removeLayerStateChangeListener(listener);
+    }
+
+    /**
+     * Removes a layer state change listener
+     *
+     * @param listener the listener. Ignored if null or already registered.
+     * @since 10340
+     */
+    public void removeLayerStateChangeListener(LayerStateChangeListener listener) {
         layerStateChangeListeners.remove(listener);
     }
 
@@ -323,7 +336,8 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
         big.setComposite(comp);
         big.fillRect(0, 0, 15, 15);
         big.setColor(getOutsideColor());
-        big.drawLine(0, 15, 15, 0);
+        big.drawLine(-1, 6, 6, -1);
+        big.drawLine(4, 16, 16, 4);
         Rectangle r = new Rectangle(0, 0, 15, 15);
         hatched = new TexturePaint(bi, r);
     }
@@ -372,7 +386,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
         isChanged = false;
         highlightUpdateCount = data.getHighlightUpdateCount();
 
-        boolean active = mv.getActiveLayer() == this;
+        boolean active = mv.getLayerManager().getActiveLayer() == this;
         boolean inactive = !active && Main.pref.getBoolean("draw.data.inactive_color", true);
         boolean virtual = !inactive && mv.isVirtualNodesEnabled();
 
@@ -806,11 +820,11 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
                 String filename = getAssociatedFile().getName().replaceAll(Pattern.quote(".gpx.osm") + '$', "") + ".gpx";
                 gpxLayer.setAssociatedFile(new File(getAssociatedFile().getParentFile(), filename));
             }
-            Main.main.addLayer(gpxLayer);
+            Main.getLayerManager().addLayer(gpxLayer);
             if (Main.pref.getBoolean("marker.makeautomarkers", true) && !gpxData.waypoints.isEmpty()) {
-                Main.main.addLayer(new MarkerLayer(gpxData, tr("Converted from: {0}", getName()), null, gpxLayer));
+                Main.getLayerManager().addLayer(new MarkerLayer(gpxData, tr("Converted from: {0}", getName()), null, gpxLayer));
             }
-            Main.main.removeLayer(OsmDataLayer.this);
+            Main.getLayerManager().removeLayer(OsmDataLayer.this);
         }
     }
 
@@ -863,6 +877,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
     public void onPostLoadFromFile() {
         setRequiresSaveToFile(false);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
     /**
@@ -871,6 +886,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
     public void onPostDownloadFromServer() {
         setRequiresSaveToFile(true);
         setRequiresUploadToServer(isModified());
+        invalidate();
     }
 
     @Override
@@ -1065,4 +1081,14 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
         dialog.setUploadedPrimitives(new APIDataSet(data));
         return dialog;
     }
+
+    @Override
+    public ProjectionBounds getViewProjectionBounds() {
+        BoundingXYVisitor v = new BoundingXYVisitor();
+        v.visit(data.getDataSourceBoundingBox());
+        if (!v.hasExtend()) {
+            v.computeBoundingBox(data.getNodes());
+        }
+        return v.getBounds();
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
index 51b64c7..4044d99 100644
--- a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
@@ -4,6 +4,7 @@ package org.openstreetmap.josm.gui.layer;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Graphics2D;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 
@@ -21,9 +22,12 @@ import org.openstreetmap.josm.data.validation.PaintVisitor;
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.MultiMap;
 
@@ -31,6 +35,9 @@ import org.openstreetmap.josm.tools.MultiMap;
  * A layer showing error messages.
  *
  * @author frsantos
+ *
+ * @since  3669 (creation)
+ * @since 10386 (new LayerChangeListener interface)
  */
 public class ValidatorLayer extends Layer implements LayerChangeListener {
 
@@ -41,7 +48,7 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
      */
     public ValidatorLayer() {
         super(tr("Validation errors"));
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     /**
@@ -142,12 +149,12 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
         // Do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
+    public void layerAdded(LayerAddEvent e) {
         // Do nothing
     }
 
@@ -155,11 +162,12 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
      * If layer is the OSM Data layer, remove all errors
      */
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer instanceof OsmDataLayer && Main.isDisplayingMapView() && !Main.main.hasEditLayer()) {
-            Main.main.removeLayer(this);
-        } else if (oldLayer == this) {
-            MapView.removeLayerChangeListener(this);
+    public void layerRemoving(LayerRemoveEvent e) {
+        // Removed layer is still in that list.
+        if (e.getRemovedLayer() instanceof OsmDataLayer && e.getSource().getLayersOfType(OsmDataLayer.class).size() <= 1) {
+            e.scheduleRemoval(Collections.singleton(this));
+        } else if (e.getRemovedLayer() == this) {
+            Main.getLayerManager().removeLayerChangeListener(this);
             OsmValidator.errorLayer = null;
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/WMSLayer.java b/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
index dff61c2..152e658 100644
--- a/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
@@ -35,7 +35,7 @@ import org.openstreetmap.josm.gui.ExtendedDialog;
  *
  */
 public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSource> {
-    private static final String PREFERENCE_PREFIX   = "imagery.wms.";
+    private static final String PREFERENCE_PREFIX = "imagery.wms.";
 
     /** default tile size for WMS Layer */
     public static final IntegerProperty PROP_IMAGE_SIZE = new IntegerProperty(PREFERENCE_PREFIX + "imageSize", 512);
@@ -107,7 +107,7 @@ public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSour
     public boolean isProjectionSupported(Projection proj) {
         return supportedProjections == null || supportedProjections.isEmpty() || supportedProjections.contains(proj.toCode()) ||
                 (info.isEpsg4326To3857Supported() && supportedProjections.contains("EPSG:4326")
-                        &&  "EPSG:3857".equals(Main.getProjection().toCode()));
+                        && "EPSG:3857".equals(Main.getProjection().toCode()));
     }
 
     @Override
@@ -169,6 +169,6 @@ public class WMSLayer extends AbstractCachedTileSourceLayer<TemplatedWMSTileSour
     }
 
     private boolean isReprojectionPossible() {
-        return supportedProjections.contains("EPSG:4326") &&  "EPSG:3857".equals(Main.getProjection().toCode());
+        return supportedProjections.contains("EPSG:4326") && "EPSG:3857".equals(Main.getProjection().toCode());
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
index 8169ef0..8cb5416 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
@@ -180,7 +180,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 // Search whether an other layer has yet defined some bounding box.
                 // If none, we'll zoom to the bounding box of the layer with the photos.
                 boolean boundingBoxedLayerFound = false;
-                for (Layer l: Main.map.mapView.getAllLayers()) {
+                for (Layer l: Main.getLayerManager().getLayers()) {
                     if (l != yLayer) {
                         BoundingXYVisitor bbox = new BoundingXYVisitor();
                         l.visitBoundingBox(bbox);
@@ -556,7 +556,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
     @Override
     public void actionPerformed(ActionEvent arg0) {
         // Construct the list of loaded GPX tracks
-        Collection<Layer> layerLst = Main.map.mapView.getAllLayers();
+        Collection<Layer> layerLst = Main.getLayerManager().getLayers();
         GpxDataWrapper defaultItem = null;
         for (Layer cur : layerLst) {
             if (cur instanceof GpxLayer) {
@@ -763,7 +763,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
     private final transient StatusBarUpdater statusBarUpdater = new StatusBarUpdater(false);
     private final transient StatusBarUpdater statusBarUpdaterWithRepaint = new StatusBarUpdater(true);
 
-    private class StatusBarUpdater implements  DocumentListener, ItemListener, ActionListener {
+    private class StatusBarUpdater implements DocumentListener, ItemListener, ActionListener {
         private final boolean doRepaint;
 
         StatusBarUpdater(boolean doRepaint) {
@@ -1031,11 +1031,13 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 timezone = r.a;
                 delta = r.b;
             } catch (IndexOutOfBoundsException ex) {
+                Main.debug(ex);
                 JOptionPane.showMessageDialog(Main.parent,
                         tr("The selected photos do not contain time information."),
                         tr("Photos do not contain time information"), JOptionPane.WARNING_MESSAGE);
                 return;
             } catch (NoGpxTimestamps ex) {
+                Main.debug(ex);
                 JOptionPane.showMessageDialog(Main.parent,
                         tr("The selected GPX track does not contain timestamps. Please select another one."),
                         tr("GPX Track has no time information"), JOptionPane.WARNING_MESSAGE);
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
index 70ab30c..6c58bca 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
@@ -50,7 +50,6 @@ import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrame.MapModeChangeListener;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
@@ -61,6 +60,12 @@ import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToMarkerLayer;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToNextMarker;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.JpgImporter;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -277,7 +282,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                         );
             }
             if (layer != null) {
-                Main.main.addLayer(layer);
+                Main.getLayerManager().addLayer(layer);
 
                 if (!canceled && layer.data != null && !layer.data.isEmpty()) {
                     boolean noGeotagFound = true;
@@ -783,7 +788,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
      */
     private void clearOtherCurrentPhotos() {
         for (GeoImageLayer layer:
-                 Main.map.mapView.getLayersOfType(GeoImageLayer.class)) {
+                 Main.getLayerManager().getLayersOfType(GeoImageLayer.class)) {
             if (layer != this) {
                 layer.clearCurrentPhoto(false);
             }
@@ -888,23 +893,25 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
         MapFrame.addMapModeChangeListener(mapModeListener);
         mapModeListener.mapModeChange(null, Main.map.mapMode);
 
-        MapView.addLayerChangeListener(new LayerChangeListener() {
+        Main.getLayerManager().addActiveLayerChangeListener(new ActiveLayerChangeListener() {
             @Override
-            public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-                if (newLayer == GeoImageLayer.this) {
+            public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+                if (Main.getLayerManager().getActiveLayer() == GeoImageLayer.this) {
                     // only in select mode it is possible to click the images
                     Main.map.selectSelectTool(false);
                 }
             }
+        });
 
+        Main.getLayerManager().addLayerChangeListener(new LayerChangeListener() {
             @Override
-            public void layerAdded(Layer newLayer) {
+            public void layerAdded(LayerAddEvent e) {
                 // Do nothing
             }
 
             @Override
-            public void layerRemoved(Layer oldLayer) {
-                if (oldLayer == GeoImageLayer.this) {
+            public void layerRemoving(LayerRemoveEvent e) {
+                if (e.getRemovedLayer() == GeoImageLayer.this) {
                     stopLoadThumbs();
                     Main.map.mapView.removeMouseListener(mouseAdapter);
                     MapFrame.removeMapModeChangeListener(mapModeListener);
@@ -914,9 +921,14 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
                     }
                     data = null;
                     // stop listening to layer change events
-                    MapView.removeLayerChangeListener(this);
+                    Main.getLayerManager().removeLayerChangeListener(this);
                 }
             }
+
+            @Override
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+                // Do nothing
+            }
         });
 
         Main.map.mapView.addPropertyChangeListener(this);
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
index 7bdf64f..1c3a4d3 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
@@ -446,6 +446,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
         try {
             setExifTime(ExifReader.readTime(file));
         } catch (RuntimeException ex) {
+            Main.warn(ex);
             setExifTime(null);
         }
 
@@ -466,9 +467,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
                 setExifOrientation(orientation);
             }
         } catch (MetadataException ex) {
-            if (Main.isDebugEnabled()) {
-                Main.debug(ex.getMessage());
-            }
+            Main.debug(ex);
         }
 
         if (dirGps == null) {
@@ -490,9 +489,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
             // default is K (km/h)
             setSpeed(speed);
         } catch (MetadataException ex) {
-            if (Main.isDebugEnabled()) {
-                Main.debug(ex.getMessage());
-            }
+            Main.debug(ex);
         }
 
         try {
@@ -503,9 +500,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
             }
             setElevation(ele);
         } catch (MetadataException ex) {
-            if (Main.isDebugEnabled()) {
-                Main.debug(ex.getMessage());
-            }
+            Main.debug(ex);
         }
 
         try {
@@ -525,9 +520,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
                 setExifImgDir(direction);
             }
         } catch (IndexOutOfBoundsException ex) { // (other exceptions, e.g. #5271)
-            if (Main.isDebugEnabled()) {
-                Main.debug(ex.getMessage());
-            }
+            Main.debug(ex);
         }
 
         // Time and date. We can have these cases:
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
index 8a57ab9..f2a95b7 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
@@ -22,16 +22,20 @@ import javax.swing.JPanel;
 import javax.swing.JToggleButton;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.dialogs.DialogsPanel.Action;
 import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
-public final class ImageViewerDialog extends ToggleDialog implements LayerChangeListener {
+public final class ImageViewerDialog extends ToggleDialog implements LayerChangeListener, ActiveLayerChangeListener {
 
     private static final String COMMAND_ZOOM = "zoom";
     private static final String COMMAND_CENTERVIEW = "centre";
@@ -75,7 +79,8 @@ public final class ImageViewerDialog extends ToggleDialog implements LayerChange
         super(tr("Geotagged Images"), "geoimage", tr("Display geotagged images"), Shortcut.registerShortcut("tools:geotagged",
         tr("Tool: {0}", tr("Display geotagged images")), KeyEvent.VK_Y, Shortcut.DIRECT), 200);
         build();
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
+        Main.getLayerManager().addLayerChangeListener(this);
     }
 
     protected void build() {
@@ -195,7 +200,8 @@ public final class ImageViewerDialog extends ToggleDialog implements LayerChange
 
     @Override
     public void destroy() {
-        MapView.removeLayerChangeListener(this);
+        Main.getLayerManager().removeActiveLayerChangeListener(this);
+        Main.getLayerManager().removeLayerChangeListener(this);
         super.destroy();
     }
 
@@ -409,28 +415,36 @@ public final class ImageViewerDialog extends ToggleDialog implements LayerChange
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        if (currentLayer == null && newLayer instanceof GeoImageLayer) {
-            ((GeoImageLayer) newLayer).showFirstPhoto();
-        }
+    public void layerAdded(LayerAddEvent e) {
+        showLayer(e.getAddedLayer());
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        if (currentLayer == null && newLayer instanceof GeoImageLayer) {
-            ((GeoImageLayer) newLayer).showFirstPhoto();
-        }
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
         // Clear current image and layer if current layer is deleted
-        if (currentLayer != null && currentLayer.equals(oldLayer)) {
+        if (currentLayer != null && currentLayer.equals(e.getRemovedLayer())) {
             showImage(null, null);
         }
         // Check buttons state in case of layer merging
-        if (currentLayer != null && oldLayer instanceof GeoImageLayer) {
+        if (currentLayer != null && e.getRemovedLayer() instanceof GeoImageLayer) {
             currentLayer.checkPreviousNextButtons();
         }
     }
+
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // ignored
+    }
+
+    @Override
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        showLayer(e.getSource().getActiveLayer());
+    }
+
+    private void showLayer(Layer newLayer) {
+        if (currentLayer == null && newLayer instanceof GeoImageLayer) {
+            ((GeoImageLayer) newLayer).showFirstPhoto();
+        }
+    }
+
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
index a0e530e..0d97078 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
@@ -134,7 +134,7 @@ public abstract class ConvertToDataLayerAction<T extends Layer> extends Abstract
             layer.setAssociatedFile(new File(this.layer.getAssociatedFile().getParentFile(), this.layer.getAssociatedFile().getName() + ".osm"));
         }
         layer.setUploadDiscouraged(true);
-        Main.main.addLayer(layer);
-        Main.main.removeLayer(this.layer);
+        Main.getLayerManager().addLayer(layer);
+        Main.getLayerManager().removeLayer(this.layer);
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java b/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
index 489bcdf..24f002b 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
@@ -24,7 +24,7 @@ import org.openstreetmap.josm.tools.GBC;
 public class DateFilterPanel extends JPanel {
     private final DateEditorWithSlider dateFrom = new DateEditorWithSlider(tr("From"));
     private final DateEditorWithSlider dateTo = new DateEditorWithSlider(tr("To"));
-    private final JCheckBox noTimestampCb  = new JCheckBox(tr("No timestamp"));
+    private final JCheckBox noTimestampCb = new JCheckBox(tr("No timestamp"));
     private final transient GpxLayer layer;
 
     private transient ActionListener filterAppliedListener;
@@ -76,7 +76,7 @@ public class DateFilterPanel extends JPanel {
     };
 
     private final Timer t = new Timer(200, new ActionListener() {
-        @Override  public void actionPerformed(ActionEvent e) {
+        @Override public void actionPerformed(ActionEvent e) {
             applyFilter();
         }
     });
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
index f4c51c5..553ab70 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
@@ -115,7 +115,7 @@ public class DownloadWmsAlongTrackAction extends AbstractAction {
         if (!Main.isDisplayingMapView()) {
             return null;
         }
-        List<AbstractTileSourceLayer> targetLayers = Main.map.mapView.getLayersOfType(AbstractTileSourceLayer.class);
+        List<AbstractTileSourceLayer> targetLayers = Main.getLayerManager().getLayersOfType(AbstractTileSourceLayer.class);
         if (targetLayers.isEmpty()) {
             if (!GraphicsEnvironment.isHeadless()) {
                 warnNoImageryLayers();
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
index 6f55f5a..1e3ff2a 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
@@ -114,7 +114,7 @@ public class ImportAudioAction extends AbstractAction {
             for (File file : sel) {
                 importAudio(file, ml, firstStartTime, m);
             }
-            Main.main.addLayer(ml);
+            Main.getLayerManager().addLayer(ml);
             Main.map.repaint();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/MarkersFromNamedPointsAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/MarkersFromNamedPointsAction.java
index e0da3f3..0c52a12 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/MarkersFromNamedPointsAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/MarkersFromNamedPointsAction.java
@@ -40,7 +40,7 @@ public class MarkersFromNamedPointsAction extends AbstractAction {
         }
         MarkerLayer ml = new MarkerLayer(namedTrackPoints, tr("Named Trackpoints from {0}", layer.getName()), layer.getAssociatedFile(), layer);
         if (!ml.data.isEmpty()) {
-            Main.main.addLayer(ml);
+            Main.getLayerManager().addLayer(ml);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
index 7f7724a..d313e2d 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
@@ -138,8 +138,8 @@ public class MarkerLayer extends Layer implements JumpToMarkerLayer {
     }
 
     @Override
-    public void hookUpMapView() {
-        Main.map.mapView.addMouseListener(new MouseAdapter() {
+    public LayerPainter attachToMapView(MapViewEvent event) {
+        event.getMapView().addMouseListener(new MouseAdapter() {
             @Override
             public void mousePressed(MouseEvent e) {
                 if (e.getButton() != MouseEvent.BUTTON1)
@@ -155,7 +155,7 @@ public class MarkerLayer extends Layer implements JumpToMarkerLayer {
                 }
                 if (!mousePressedInButton)
                     return;
-                mousePressed  = true;
+                mousePressed = true;
                 if (isVisible()) {
                     invalidate();
                 }
@@ -178,6 +178,12 @@ public class MarkerLayer extends Layer implements JumpToMarkerLayer {
                 invalidate();
             }
         });
+
+        if (event.getMapView().playHeadMarker == null) {
+            event.getMapView().playHeadMarker = PlayHeadMarker.create();
+        }
+
+        return super.attachToMapView(event);
     }
 
     /**
@@ -448,12 +454,12 @@ public class MarkerLayer extends Layer implements JumpToMarkerLayer {
         if (!Main.isDisplayingMapView())
             return;
         Marker m = null;
-        Layer l = Main.map.mapView.getActiveLayer();
+        Layer l = Main.getLayerManager().getActiveLayer();
         if (l != null) {
             m = getAdjacentMarker(startMarker, next, l);
         }
         if (m == null) {
-            for (Layer layer : Main.map.mapView.getAllLayers()) {
+            for (Layer layer : Main.getLayerManager().getLayers()) {
                 m = getAdjacentMarker(startMarker, next, layer);
                 if (m != null) {
                     break;
diff --git a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
index 8789276..a963fc0 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java
@@ -196,7 +196,7 @@ public class ElemStyles implements PreferenceChangedListener {
 
             for (OsmPrimitive referrer : osm.getReferrers()) {
                 Relation r = (Relation) referrer;
-                if (!drawMultipolygon || !r.isMultipolygon()  || !r.isUsable()) {
+                if (!drawMultipolygon || !r.isMultipolygon() || !r.isUsable()) {
                     continue;
                 }
                 Multipolygon multipolygon = MultipolygonCache.getInstance().get(nc, r);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
index 6959fe3..9f64c14 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
@@ -65,11 +65,11 @@ public class MapPaintMenu extends JMenu implements MapPaintSylesUpdateListener {
 
         @Override
         public void updateEnabledState() {
-            setEnabled(Main.isDisplayingMapView() && (Main.main.hasEditLayer() || mapHasGpxorMarkerLayer()));
+            setEnabled(Main.isDisplayingMapView() && (Main.getLayerManager().getEditLayer() != null || mapHasGpxorMarkerLayer()));
         }
 
         private static boolean mapHasGpxorMarkerLayer() {
-            for (Layer layer : Main.map.mapView.getAllLayers()) {
+            for (Layer layer : Main.getLayerManager().getLayers()) {
                 if (layer instanceof GpxLayer || layer instanceof MarkerLayer) {
                     return true;
                 }
@@ -85,7 +85,7 @@ public class MapPaintMenu extends JMenu implements MapPaintSylesUpdateListener {
      */
     public MapPaintMenu() {
         super(tr("Map Paint Styles"));
-        setIcon(new ImageProvider("dialogs", "mapstyle").setSize(ImageProvider.ImageSizes.MENU).get());
+        setIcon(ImageProvider.get("dialogs", "mapstyle", ImageProvider.ImageSizes.MENU));
         MapPaintStyles.addMapPaintSylesUpdateListener(this);
         putClientProperty("help", ht("/Dialog/MapPaint"));
     }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java b/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
index 93a7609..3e99bda 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
@@ -146,7 +146,7 @@ public final class MapPaintStyles {
      */
     public static ImageIcon getIcon(IconReference ref, int width, int height) {
         final String namespace = ref.source.getPrefName();
-        ImageIcon i = getIconProvider(ref, false).setWidth(width).setHeight(height).get();
+        ImageIcon i = getIconProvider(ref, false).setSize(width, height).get();
         if (i == null) {
             Main.warn("Mappaint style \""+namespace+"\" ("+ref.source.getDisplayString()+") icon \"" + ref.iconName + "\" not found.");
             return null;
@@ -328,6 +328,7 @@ public final class MapPaintStyles {
             String msg = tr("JOSM does no longer support mappaint styles written in the old XML format.\nPlease update ''{0}'' to MapCSS",
                     entry.url);
             Main.error(msg);
+            Main.debug(e);
             HelpAwareOptionPane.showOptionDialog(Main.parent, msg, tr("Warning"), JOptionPane.WARNING_MESSAGE,
                     HelpUtil.ht("/Styles/MapCSSImplementation"));
         }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
index 02843eb..4469e53 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
@@ -21,14 +21,30 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
  */
 public class BoxTextElement extends StyleElement {
 
+    /**
+     * MapCSS text-anchor-horizontal
+     */
     public enum HorizontalTextAlignment { LEFT, CENTER, RIGHT }
 
+    /**
+     * MapCSS text-anchor-vertical
+     */
     public enum VerticalTextAlignment { ABOVE, TOP, CENTER, BOTTOM, BELOW }
 
+    /**
+     * Something that provides us with a {@link BoxProviderResult}
+     */
     public interface BoxProvider {
+        /**
+         * Compute and get the {@link BoxProviderResult}. The temporary flag is set if the result of the computation may change in the future.
+         * @return The result of the computation.
+         */
         BoxProviderResult get();
     }
 
+    /**
+     * A box rectangle with a flag if it is temporary.
+     */
     public static class BoxProviderResult {
         private final Rectangle box;
         private final boolean temporary;
@@ -55,6 +71,9 @@ public class BoxTextElement extends StyleElement {
         }
     }
 
+    /**
+     * A {@link BoxProvider} that always returns the same non-temporary rectangle
+     */
     public static class SimpleBoxProvider implements BoxProvider {
         private final Rectangle box;
 
@@ -85,17 +104,60 @@ public class BoxTextElement extends StyleElement {
         }
     }
 
+    /**
+     * A rectangle with size 0x0
+     */
     public static final Rectangle ZERO_BOX = new Rectangle(0, 0, 0, 0);
 
+    /**
+     * The default style a simple node should use for it's text
+     */
+    public static final BoxTextElement SIMPLE_NODE_TEXT_ELEMSTYLE;
+    static {
+        MultiCascade mc = new MultiCascade();
+        Cascade c = mc.getOrCreateCascade("default");
+        c.put(TEXT, Keyword.AUTO);
+        Node n = new Node();
+        n.put("name", "dummy");
+        SIMPLE_NODE_TEXT_ELEMSTYLE = create(new Environment(n, mc, "default", null), NodeElement.SIMPLE_NODE_ELEMSTYLE.getBoxProvider());
+        if (SIMPLE_NODE_TEXT_ELEMSTYLE == null) throw new AssertionError();
+    }
+
+    /**
+     * Caches the default text color from the preferences.
+     *
+     * FIXME: the cache isn't updated if the user changes the preference during a JOSM
+     * session. There should be preference listener updating this cache.
+     */
+    private static volatile Color defaultTextColorCache;
+
+    /**
+     * The text this element should display.
+     */
     public TextLabel text;
     // Either boxProvider or box is not null. If boxProvider is different from
     // null, this means, that the box can still change in future, otherwise
     // it is fixed.
     protected BoxProvider boxProvider;
     protected Rectangle box;
+    /**
+     * The {@link HorizontalTextAlignment} for this text.
+     */
     public HorizontalTextAlignment hAlign;
+    /**
+     * The {@link VerticalTextAlignment} for this text.
+     */
     public VerticalTextAlignment vAlign;
 
+    /**
+     * Create a new {@link BoxTextElement}
+     * @param c The current cascade
+     * @param text The text to display
+     * @param boxProvider The box provider to use
+     * @param box The initial box to use.
+     * @param hAlign The {@link HorizontalTextAlignment}
+     * @param vAlign The {@link VerticalTextAlignment}
+     */
     public BoxTextElement(Cascade c, TextLabel text, BoxProvider boxProvider, Rectangle box,
             HorizontalTextAlignment hAlign, VerticalTextAlignment vAlign) {
         super(c, 5f);
@@ -109,18 +171,37 @@ public class BoxTextElement extends StyleElement {
         this.vAlign = vAlign;
     }
 
+    /**
+     * Create a new {@link BoxTextElement} with a dynamic box
+     * @param env The MapCSS environment
+     * @param boxProvider The box provider that computes the box.
+     * @return A new {@link BoxTextElement} or <code>null</code> if the creation failed.
+     */
     public static BoxTextElement create(Environment env, BoxProvider boxProvider) {
         return create(env, boxProvider, null);
     }
 
+    /**
+     * Create a new {@link BoxTextElement} with a fixed box
+     * @param env The MapCSS environment
+     * @param box The box
+     * @return A new {@link BoxTextElement} or <code>null</code> if the creation failed.
+     */
     public static BoxTextElement create(Environment env, Rectangle box) {
         return create(env, null, box);
     }
 
+    /**
+     * Create a new {@link BoxTextElement} with a boxprovider and a box.
+     * @param env The MapCSS environment
+     * @param boxProvider The box provider.
+     * @param box The box. Only considered if boxProvider is null.
+     * @return A new {@link BoxTextElement} or <code>null</code> if the creation failed.
+     */
     public static BoxTextElement create(Environment env, BoxProvider boxProvider, Rectangle box) {
         initDefaultParameters();
 
-        TextLabel text = TextLabel.create(env, DEFAULT_TEXT_COLOR, false);
+        TextLabel text = TextLabel.create(env, defaultTextColorCache, false);
         if (text == null) return null;
         // Skip any primitives that don't have text to draw. (Styles are recreated for any tag change.)
         // The concrete text to render is not cached in this object, but computed for each
@@ -163,6 +244,10 @@ public class BoxTextElement extends StyleElement {
         return new BoxTextElement(c, text, boxProvider, box, hAlign, vAlign);
     }
 
+    /**
+     * Get the box in which the content should be drawn.
+     * @return The box.
+     */
     public Rectangle getBox() {
         if (boxProvider != null) {
             BoxProviderResult result = boxProvider.get();
@@ -175,28 +260,9 @@ public class BoxTextElement extends StyleElement {
         return box;
     }
 
-    public static final BoxTextElement SIMPLE_NODE_TEXT_ELEMSTYLE;
-    static {
-        MultiCascade mc = new MultiCascade();
-        Cascade c = mc.getOrCreateCascade("default");
-        c.put(TEXT, Keyword.AUTO);
-        Node n = new Node();
-        n.put("name", "dummy");
-        SIMPLE_NODE_TEXT_ELEMSTYLE = create(new Environment(n, mc, "default", null), NodeElement.SIMPLE_NODE_ELEMSTYLE.getBoxProvider());
-        if (SIMPLE_NODE_TEXT_ELEMSTYLE == null) throw new AssertionError();
-    }
-
-    /*
-     * Caches the default text color from the preferences.
-     *
-     * FIXME: the cache isn't updated if the user changes the preference during a JOSM
-     * session. There should be preference listener updating this cache.
-     */
-    private static volatile Color DEFAULT_TEXT_COLOR;
-
     private static void initDefaultParameters() {
-        if (DEFAULT_TEXT_COLOR != null) return;
-        DEFAULT_TEXT_COLOR = PaintColors.TEXT.get();
+        if (defaultTextColorCache != null) return;
+        defaultTextColorCache = PaintColors.TEXT.get();
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
index 350ae7f..be3782a 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
@@ -20,21 +20,13 @@ import org.openstreetmap.josm.gui.mappaint.MultiCascade;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction.RelativeFloat;
 import org.openstreetmap.josm.tools.Utils;
 
+/**
+ * This is the style definition for a simple line.
+ */
 public class LineElement extends StyleElement {
-
-    public static LineElement createSimpleLineStyle(Color color, boolean isAreaEdge) {
-        MultiCascade mc = new MultiCascade();
-        Cascade c = mc.getOrCreateCascade("default");
-        c.put(WIDTH, Keyword.DEFAULT);
-        c.put(COLOR, color != null ? color : PaintColors.UNTAGGED.get());
-        c.put(OPACITY, 1f);
-        if (isAreaEdge) {
-            c.put(Z_INDEX, -3f);
-        }
-        Way w = new Way();
-        return createLine(new Environment(w, mc, "default", null));
-    }
-
+    /**
+     * The default style for any untagged way.
+     */
     public static final LineElement UNTAGGED_WAY = createSimpleLineStyle(null, false);
 
     private BasicStroke line;
@@ -73,6 +65,145 @@ public class LineElement extends StyleElement {
         this.wayDirectionArrows = wayDirectionArrows;
     }
 
+    @Override
+    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
+            boolean selected, boolean outermember, boolean member) {
+        Way w = (Way) primitive;
+        /* show direction arrows, if draw.segment.relevant_directions_only is not set,
+        the way is tagged with a direction key
+        (even if the tag is negated as in oneway=false) or the way is selected */
+        boolean showOrientation;
+        if (defaultSelectedHandling) {
+            showOrientation = !isModifier && (selected || paintSettings.isShowDirectionArrow()) && !paintSettings.isUseRealWidth();
+        } else {
+            showOrientation = wayDirectionArrows;
+        }
+        boolean showOneway = !isModifier && !selected &&
+                !paintSettings.isUseRealWidth() &&
+                paintSettings.isShowOnewayArrow() && w.hasDirectionKeys();
+        boolean onewayReversed = w.reversedDirection();
+        /* 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 = showOrientation && !selected && paintSettings.isShowHeadArrowOnly();
+        Node lastN;
+
+        Color myDashedColor = dashesBackground;
+        BasicStroke myLine = line, myDashLine = dashesLine;
+        if (realWidth > 0 && paintSettings.isUseRealWidth() && !showOrientation) {
+            float myWidth = (int) (100 / (float) (painter.getCircum() / realWidth));
+            if (myWidth < line.getLineWidth()) {
+                myWidth = line.getLineWidth();
+            }
+            myLine = new BasicStroke(myWidth, line.getEndCap(), line.getLineJoin(),
+                    line.getMiterLimit(), line.getDashArray(), line.getDashPhase());
+            if (dashesLine != null) {
+                myDashLine = new BasicStroke(myWidth, dashesLine.getEndCap(), dashesLine.getLineJoin(),
+                        dashesLine.getMiterLimit(), dashesLine.getDashArray(), dashesLine.getDashPhase());
+            }
+        }
+
+        Color myColor = color;
+        if (defaultSelectedHandling && selected) {
+            myColor = paintSettings.getSelectedColor(color.getAlpha());
+        } else if (member || outermember) {
+            myColor = paintSettings.getRelationSelectedColor(color.getAlpha());
+        } else if (w.isDisabled()) {
+            myColor = paintSettings.getInactiveColor();
+            myDashedColor = paintSettings.getInactiveColor();
+        }
+
+        painter.drawWay(w, myColor, myLine, myDashLine, myDashedColor, offset, showOrientation,
+                showOnlyHeadArrowOnly, showOneway, onewayReversed);
+
+        if (paintSettings.isShowOrderNumber() && !painter.isInactiveMode()) {
+            int orderNumber = 0;
+            lastN = null;
+            for (Node n : w.getNodes()) {
+                if (lastN != null) {
+                    orderNumber++;
+                    painter.drawOrderNumber(lastN, n, orderNumber, myColor);
+                }
+                lastN = n;
+            }
+        }
+    }
+
+    @Override
+    public boolean isProperLineStyle() {
+        return !isModifier;
+    }
+
+    public String linejoinToString(int linejoin) {
+        switch (linejoin) {
+            case BasicStroke.JOIN_BEVEL: return "bevel";
+            case BasicStroke.JOIN_ROUND: return "round";
+            case BasicStroke.JOIN_MITER: return "miter";
+            default: return null;
+        }
+    }
+
+    public String linecapToString(int linecap) {
+        switch (linecap) {
+            case BasicStroke.CAP_BUTT: return "none";
+            case BasicStroke.CAP_ROUND: return "round";
+            case BasicStroke.CAP_SQUARE: return "square";
+            default: return null;
+        }
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null || getClass() != obj.getClass())
+            return false;
+        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;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), line, color, dashesBackground, offset, realWidth, wayDirectionArrows, dashesLine);
+    }
+
+    @Override
+    public String toString() {
+        return "LineElemStyle{" + super.toString() + "width=" + line.getLineWidth() +
+            " realWidth=" + realWidth + " color=" + Utils.toString(color) +
+            " dashed=" + Arrays.toString(line.getDashArray()) +
+            (line.getDashPhase() == 0 ? "" : " dashesOffses=" + line.getDashPhase()) +
+            " dashedColor=" + Utils.toString(dashesBackground) +
+            " linejoin=" + linejoinToString(line.getLineJoin()) +
+            " linecap=" + linecapToString(line.getEndCap()) +
+            (offset == 0 ? "" : " offset=" + offset) +
+            '}';
+    }
+
+    /**
+     * Creates a simple line with default widt.
+     * @param color The color to use
+     * @param isAreaEdge If this is an edge for an area. Edges are drawn at lower Z-Index.
+     * @return The line style.
+     */
+    public static LineElement createSimpleLineStyle(Color color, boolean isAreaEdge) {
+        MultiCascade mc = new MultiCascade();
+        Cascade c = mc.getOrCreateCascade("default");
+        c.put(WIDTH, Keyword.DEFAULT);
+        c.put(COLOR, color != null ? color : PaintColors.UNTAGGED.get());
+        c.put(OPACITY, 1f);
+        if (isAreaEdge) {
+            c.put(Z_INDEX, -3f);
+        }
+        Way w = new Way();
+        return createLine(new Environment(w, mc, "default", null));
+    }
+
     public static LineElement createLine(Environment env) {
         return createImpl(env, LineType.NORMAL);
     }
@@ -104,77 +235,13 @@ public class LineElement extends StyleElement {
     private static LineElement createImpl(Environment env, LineType type) {
         Cascade c = env.mc.getCascade(env.layer);
         Cascade cDef = env.mc.getCascade("default");
-        Float width;
-        switch (type) {
-            case NORMAL:
-                width = getWidth(c, WIDTH, getWidth(cDef, WIDTH, null));
-                break;
-            case CASING:
-                Float casingWidth = c.get(type.prefix + WIDTH, null, Float.class, true);
-                if (casingWidth == null) {
-                    RelativeFloat relCasingWidth = c.get(type.prefix + WIDTH, null, RelativeFloat.class, true);
-                    if (relCasingWidth != null) {
-                        casingWidth = relCasingWidth.val / 2;
-                    }
-                }
-                if (casingWidth == null)
-                    return null;
-                width = getWidth(c, WIDTH, getWidth(cDef, WIDTH, null));
-                if (width == null) {
-                    width = 0f;
-                }
-                width += 2 * casingWidth;
-                break;
-            case LEFT_CASING:
-            case RIGHT_CASING:
-                width = getWidth(c, type.prefix + WIDTH, null);
-                break;
-            default:
-                throw new AssertionError();
-        }
+        Float width = computeWidth(type, c, cDef);
         if (width == null)
             return null;
 
-        float realWidth = c.get(type.prefix + REAL_WIDTH, 0f, Float.class);
-        if (realWidth > 0 && MapPaintSettings.INSTANCE.isUseRealWidth()) {
+        float realWidth = computeRealWidth(env, type, c);
 
-            /* if we have a "width" tag, try use it */
-            String widthTag = env.osm.get("width");
-            if (widthTag == null) {
-                widthTag = env.osm.get("est_width");
-            }
-            if (widthTag != null) {
-                try {
-                    realWidth = Float.parseFloat(widthTag);
-                } catch (NumberFormatException nfe) {
-                    Main.warn(nfe);
-                }
-            }
-        }
-
-        Float offset = c.get(OFFSET, 0f, Float.class);
-        switch (type) {
-            case NORMAL:
-                break;
-            case CASING:
-                offset += c.get(type.prefix + OFFSET, 0f, Float.class);
-                break;
-            case LEFT_CASING:
-            case RIGHT_CASING:
-                Float baseWidthOnDefault = getWidth(cDef, WIDTH, null);
-                Float baseWidth = getWidth(c, WIDTH, baseWidthOnDefault);
-                if (baseWidth == null || baseWidth < 2f) {
-                    baseWidth = 2f;
-                }
-                float casingOffset = c.get(type.prefix + OFFSET, 0f, Float.class);
-                casingOffset += baseWidth / 2 + width / 2;
-                /* flip sign for the right-casing-offset */
-                if (type == LineType.RIGHT_CASING) {
-                    casingOffset *= -1f;
-                }
-                offset += casingOffset;
-                break;
-        }
+        Float offset = computeOffset(type, c, cDef, width);
 
         int alpha = 255;
         Color color = c.get(type.prefix + COLOR, null, Color.class);
@@ -272,123 +339,82 @@ public class LineElement extends StyleElement {
                 offset, realWidth, wayDirectionArrows);
     }
 
-    @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
-            boolean selected, boolean outermember, boolean member) {
-        Way w = (Way) primitive;
-        /* show direction arrows, if draw.segment.relevant_directions_only is not set,
-        the way is tagged with a direction key
-        (even if the tag is negated as in oneway=false) or the way is selected */
-        boolean showOrientation;
-        if (defaultSelectedHandling) {
-            showOrientation = !isModifier && (selected || paintSettings.isShowDirectionArrow()) && !paintSettings.isUseRealWidth();
-        } else {
-            showOrientation = wayDirectionArrows;
-        }
-        boolean showOneway = !isModifier && !selected &&
-                !paintSettings.isUseRealWidth() &&
-                paintSettings.isShowOnewayArrow() && w.hasDirectionKeys();
-        boolean onewayReversed = w.reversedDirection();
-        /* 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 = showOrientation && !selected && paintSettings.isShowHeadArrowOnly();
-        Node lastN;
-
-        Color myDashedColor = dashesBackground;
-        BasicStroke myLine = line, myDashLine = dashesLine;
-        if (realWidth > 0 && paintSettings.isUseRealWidth() && !showOrientation) {
-            float myWidth = (int) (100 /  (float) (painter.getCircum() / realWidth));
-            if (myWidth < line.getLineWidth()) {
-                myWidth = line.getLineWidth();
-            }
-            myLine = new BasicStroke(myWidth, line.getEndCap(), line.getLineJoin(),
-                    line.getMiterLimit(), line.getDashArray(), line.getDashPhase());
-            if (dashesLine != null) {
-                myDashLine = new BasicStroke(myWidth, dashesLine.getEndCap(), dashesLine.getLineJoin(),
-                        dashesLine.getMiterLimit(), dashesLine.getDashArray(), dashesLine.getDashPhase());
-            }
-        }
-
-        Color myColor = color;
-        if (defaultSelectedHandling && selected) {
-            myColor = paintSettings.getSelectedColor(color.getAlpha());
-        } else if (member || outermember) {
-            myColor = paintSettings.getRelationSelectedColor(color.getAlpha());
-        } else if (w.isDisabled()) {
-            myColor = paintSettings.getInactiveColor();
-            myDashedColor = paintSettings.getInactiveColor();
-        }
-
-        painter.drawWay(w, myColor, myLine, myDashLine, myDashedColor, offset, showOrientation,
-                showOnlyHeadArrowOnly, showOneway, onewayReversed);
-
-        if (paintSettings.isShowOrderNumber() && !painter.isInactiveMode()) {
-            int orderNumber = 0;
-            lastN = null;
-            for (Node n : w.getNodes()) {
-                if (lastN != null) {
-                    orderNumber++;
-                    painter.drawOrderNumber(lastN, n, orderNumber, myColor);
+    private static Float computeWidth(LineType type, Cascade c, Cascade cDef) {
+        Float width;
+        switch (type) {
+            case NORMAL:
+                width = getWidth(c, WIDTH, getWidth(cDef, WIDTH, null));
+                break;
+            case CASING:
+                Float casingWidth = c.get(type.prefix + WIDTH, null, Float.class, true);
+                if (casingWidth == null) {
+                    RelativeFloat relCasingWidth = c.get(type.prefix + WIDTH, null, RelativeFloat.class, true);
+                    if (relCasingWidth != null) {
+                        casingWidth = relCasingWidth.val / 2;
+                    }
                 }
-                lastN = n;
-            }
+                if (casingWidth == null)
+                    return null;
+                width = getWidth(c, WIDTH, getWidth(cDef, WIDTH, null));
+                if (width == null) {
+                    width = 0f;
+                }
+                width += 2 * casingWidth;
+                break;
+            case LEFT_CASING:
+            case RIGHT_CASING:
+                width = getWidth(c, type.prefix + WIDTH, null);
+                break;
+            default:
+                throw new AssertionError();
         }
+        return width;
     }
 
-    @Override
-    public boolean isProperLineStyle() {
-        return !isModifier;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null || getClass() != obj.getClass())
-            return false;
-        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;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(super.hashCode(), line, color, dashesBackground, offset, realWidth, wayDirectionArrows, dashesLine);
-    }
-
-    @Override
-    public String toString() {
-        return "LineElemStyle{" + super.toString() + "width=" + line.getLineWidth() +
-            " realWidth=" + realWidth + " color=" + Utils.toString(color) +
-            " dashed=" + Arrays.toString(line.getDashArray()) +
-            (line.getDashPhase() == 0 ? "" : " dashesOffses=" + line.getDashPhase()) +
-            " dashedColor=" + Utils.toString(dashesBackground) +
-            " linejoin=" + linejoinToString(line.getLineJoin()) +
-            " linecap=" + linecapToString(line.getEndCap()) +
-            (offset == 0 ? "" : " offset=" + offset) +
-            '}';
-    }
+    private static float computeRealWidth(Environment env, LineType type, Cascade c) {
+        float realWidth = c.get(type.prefix + REAL_WIDTH, 0f, Float.class);
+        if (realWidth > 0 && MapPaintSettings.INSTANCE.isUseRealWidth()) {
 
-    public String linejoinToString(int linejoin) {
-        switch (linejoin) {
-            case BasicStroke.JOIN_BEVEL: return "bevel";
-            case BasicStroke.JOIN_ROUND: return "round";
-            case BasicStroke.JOIN_MITER: return "miter";
-            default: return null;
+            /* if we have a "width" tag, try use it */
+            String widthTag = env.osm.get("width");
+            if (widthTag == null) {
+                widthTag = env.osm.get("est_width");
+            }
+            if (widthTag != null) {
+                try {
+                    realWidth = Float.parseFloat(widthTag);
+                } catch (NumberFormatException nfe) {
+                    Main.warn(nfe);
+                }
+            }
         }
+        return realWidth;
     }
 
-    public String linecapToString(int linecap) {
-        switch (linecap) {
-            case BasicStroke.CAP_BUTT: return "none";
-            case BasicStroke.CAP_ROUND: return "round";
-            case BasicStroke.CAP_SQUARE: return "square";
-            default: return null;
+    private static Float computeOffset(LineType type, Cascade c, Cascade cDef, Float width) {
+        Float offset = c.get(OFFSET, 0f, Float.class);
+        switch (type) {
+            case NORMAL:
+                break;
+            case CASING:
+                offset += c.get(type.prefix + OFFSET, 0f, Float.class);
+                break;
+            case LEFT_CASING:
+            case RIGHT_CASING:
+                Float baseWidthOnDefault = getWidth(cDef, WIDTH, null);
+                Float baseWidth = getWidth(c, WIDTH, baseWidthOnDefault);
+                if (baseWidth == null || baseWidth < 2f) {
+                    baseWidth = 2f;
+                }
+                float casingOffset = c.get(type.prefix + OFFSET, 0f, Float.class);
+                casingOffset += baseWidth / 2 + width / 2;
+                /* flip sign for the right-casing-offset */
+                if (type == LineType.RIGHT_CASING) {
+                    casingOffset *= -1f;
+                }
+                offset += casingOffset;
+                break;
         }
+        return offset;
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
index 0905526..84e124f 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
@@ -210,7 +210,7 @@ public class MapImage {
     }
 
     private boolean mustRescale(Image image) {
-        return autoRescale && width  == -1 && image.getWidth(null) > MAX_SIZE
+        return autoRescale && width == -1 && image.getWidth(null) > MAX_SIZE
              && height == -1 && image.getHeight(null) > MAX_SIZE;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
index d23ab04..ac0882d 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
@@ -59,7 +59,7 @@ public class NodeElement extends StyleElement {
             if (obj == null || getClass() != obj.getClass())
                 return false;
             final Symbol other = (Symbol) obj;
-            return  symbol == other.symbol &&
+            return symbol == other.symbol &&
                     size == other.size &&
                     Objects.equals(stroke, other.stroke) &&
                     Objects.equals(strokeColor, other.strokeColor) &&
@@ -127,9 +127,7 @@ public class NodeElement extends StyleElement {
                     try {
                         rotationAngle = RotationAngle.buildStaticRotation(rotationKW.val);
                     } catch (IllegalArgumentException ignore) {
-                        if (Main.isTraceEnabled()) {
-                            Main.trace(ignore.getMessage());
-                        }
+                        Main.trace(ignore);
                     }
                 }
             }
diff --git a/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
index dd06b88..21db876 100644
--- a/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
@@ -89,7 +89,7 @@ public abstract class AbstractAuthorizationUI extends VerticallyScrollablePanel
      *
      * @return the retrieved Access Token
      */
-    public  OAuthToken getAccessToken() {
+    public OAuthToken getAccessToken() {
         return accessToken;
     }
 
diff --git a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
index 3082bc0..998087e 100644
--- a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
@@ -18,6 +18,7 @@ import java.util.concurrent.Executor;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
@@ -32,7 +33,6 @@ import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.preferences.server.UserNameValidator;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -200,7 +200,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
         RunAuthorisationAction runAuthorisationAction = new RunAuthorisationAction();
         tfPassword.getDocument().addDocumentListener(runAuthorisationAction);
         tfUserName.getDocument().addDocumentListener(runAuthorisationAction);
-        pnl.add(new SideButton(runAuthorisationAction));
+        pnl.add(new JButton(runAuthorisationAction));
         return pnl;
     }
 
@@ -235,8 +235,8 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         // the actions
         JPanel pnl1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        pnl1.add(new SideButton(new BackAction()));
-        pnl1.add(new SideButton(new TestAccessTokenAction()));
+        pnl1.add(new JButton(new BackAction()));
+        pnl1.add(new JButton(new TestAccessTokenAction()));
         gc.gridy = 2;
         pnl.add(pnl1, gc);
 
@@ -324,7 +324,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
     class RunAuthorisationAction extends AbstractAction implements DocumentListener {
         RunAuthorisationAction() {
             putValue(NAME, tr("Authorize now"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to redirect you to the authorization form on the JOSM web site"));
             updateEnabledState();
         }
@@ -361,7 +361,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
         BackAction() {
             putValue(NAME, tr("Back"));
             putValue(SHORT_DESCRIPTION, tr("Run the automatic authorization steps again"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "previous"));
+            new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -376,7 +376,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
     class TestAccessTokenAction extends AbstractAction {
         TestAccessTokenAction() {
             putValue(NAME, tr("Test Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("logo"));
+            new ImageProvider("logo").getResource().attachImageIcon(this);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
index fbb129b..3b01bc0 100644
--- a/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
@@ -15,6 +15,7 @@ import java.util.concurrent.Executor;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -24,7 +25,6 @@ import javax.swing.event.DocumentListener;
 import javax.swing.text.JTextComponent;
 
 import org.openstreetmap.josm.data.oauth.OAuthToken;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
 import org.openstreetmap.josm.gui.widgets.DefaultTextComponentValidator;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -146,7 +146,7 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
     protected JPanel buildActionsPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
         TestAccessTokenAction actTestAccessToken = new TestAccessTokenAction();
-        pnl.add(new SideButton(actTestAccessToken));
+        pnl.add(new JButton(actTestAccessToken));
         this.addPropertyChangeListener(actTestAccessToken);
         return pnl;
     }
@@ -222,7 +222,7 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
     class TestAccessTokenAction extends AbstractAction implements PropertyChangeListener {
         TestAccessTokenAction() {
             putValue(NAME, tr("Test Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to test the Access Token"));
             updateEnabledState();
         }
diff --git a/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java b/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
index 211c580..1c9c7d7 100644
--- a/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
+++ b/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
@@ -25,6 +25,7 @@ import java.util.concurrent.Executor;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
@@ -41,7 +42,6 @@ import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.oauth.OAuthParameters;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
@@ -98,9 +98,9 @@ public class OAuthAuthorizationWizard extends JDialog {
         pnlSemiAutomaticAuthorisationUI.addPropertyChangeListener(actAcceptAccessToken);
         pnlManualAuthorisationUI.addPropertyChangeListener(actAcceptAccessToken);
 
-        pnl.add(new SideButton(actAcceptAccessToken));
-        pnl.add(new SideButton(new CancelAction()));
-        pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/OAuthAuthorisationWizard"))));
+        pnl.add(new JButton(actAcceptAccessToken));
+        pnl.add(new JButton(new CancelAction()));
+        pnl.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/OAuthAuthorisationWizard"))));
 
         return pnl;
     }
@@ -127,19 +127,19 @@ public class OAuthAuthorizationWizard extends JDialog {
         pnl.add(lbl, gc);
 
         // OAuth in a nutshell ...
-        gc.gridy  = 1;
+        gc.gridy = 1;
         gc.insets = new Insets(5, 0, 0, 5);
         HtmlPanel pnlMessage = new HtmlPanel();
         pnlMessage.setText("<html><body>"
                 + tr("With OAuth you grant JOSM the right to upload map data and GPS tracks "
-                        + "on your behalf (<a href=\"{0}\">more info...</a>).",  "http://oauth.net/")
+                        + "on your behalf (<a href=\"{0}\">more info...</a>).", "http://oauth.net/")
                         + "</body></html>"
         );
         pnlMessage.getEditorPane().addHyperlinkListener(new ExternalBrowserLauncher());
         pnl.add(pnlMessage, gc);
 
         // the authorisation procedure
-        gc.gridy  = 2;
+        gc.gridy = 2;
         gc.gridwidth = 1;
         gc.weightx = 0.0;
         lbl = new JLabel(tr("Please select an authorization procedure: "));
@@ -350,7 +350,7 @@ public class OAuthAuthorizationWizard extends JDialog {
          */
         CancelAction() {
             putValue(NAME, tr("Cancel"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the dialog and cancel authorization"));
         }
 
@@ -372,7 +372,7 @@ public class OAuthAuthorizationWizard extends JDialog {
          */
         AcceptAccessTokenAction() {
             putValue(NAME, tr("Accept Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the dialog and accept the Access Token"));
             updateEnabledState(null);
         }
diff --git a/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java b/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
index 6c58f8e..cf3ead5 100644
--- a/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
+++ b/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
@@ -361,7 +361,7 @@ public class OsmOAuthAuthorizationClient {
             }
         } catch (IOException e) {
             throw new OsmOAuthAuthorizationException(e);
-        }  finally {
+        } finally {
             synchronized (this) {
                 connection = null;
             }
diff --git a/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
index 8db7d99..45e6a6d 100644
--- a/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
@@ -17,12 +17,12 @@ import java.util.concurrent.Executor;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 
 import org.openstreetmap.josm.data.oauth.OAuthToken;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
@@ -194,7 +194,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
             pnl.add(h, gc);
 
             JPanel pnl1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
-            pnl1.add(new SideButton(new RetrieveRequestTokenAction()));
+            pnl1.add(new JButton(new RetrieveRequestTokenAction()));
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
             gc.gridy = 1;
@@ -268,8 +268,8 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         protected JPanel buildActionPanel() {
             JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
-            pnl.add(new SideButton(new BackAction()));
-            pnl.add(new SideButton(new RetrieveAccessTokenAction()));
+            pnl.add(new JButton(new BackAction()));
+            pnl.add(new JButton(new RetrieveAccessTokenAction()));
             return pnl;
         }
 
@@ -291,7 +291,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
             BackAction() {
                 putValue(NAME, tr("Back"));
                 putValue(SHORT_DESCRIPTION, tr("Go back to step 1/3"));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "previous"));
+                new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this);
             }
 
             @Override
@@ -348,8 +348,8 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         protected JPanel buildActionPanel() {
             JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
-            pnl.add(new SideButton(new RestartAction()));
-            pnl.add(new SideButton(new TestAccessTokenAction()));
+            pnl.add(new JButton(new RestartAction()));
+            pnl.add(new JButton(new TestAccessTokenAction()));
             return pnl;
         }
 
@@ -367,7 +367,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
             RestartAction() {
                 putValue(NAME, tr("Restart"));
                 putValue(SHORT_DESCRIPTION, tr("Go back to step 1/3"));
-                putValue(SMALL_ICON, ImageProvider.get("dialogs", "previous"));
+                new ImageProvider("dialogs", "previous").getResource().attachImageIcon(this);
             }
 
             @Override
@@ -388,7 +388,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         RetrieveRequestTokenAction() {
             putValue(NAME, tr("Retrieve Request Token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to retrieve a Request Token"));
         }
 
@@ -399,7 +399,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
                     getAdvancedPropertiesPanel().getAdvancedParameters()
             );
             executor.execute(task);
-            Runnable r  = new Runnable() {
+            Runnable r = new Runnable() {
                 @Override
                 public void run() {
                     if (task.isCanceled()) return;
@@ -424,7 +424,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         RetrieveAccessTokenAction() {
             putValue(NAME, tr("Retrieve Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to retrieve an Access Token"));
         }
 
@@ -436,7 +436,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
                     requestToken
             );
             executor.execute(task);
-            Runnable r  = new Runnable() {
+            Runnable r = new Runnable() {
                 @Override
                 public void run() {
                     if (task.isCanceled()) return;
@@ -461,7 +461,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         TestAccessTokenAction() {
             putValue(NAME, tr("Test Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Click to test the Access Token"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java b/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
index 8d06631..18b1e3a 100644
--- a/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
+++ b/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
@@ -9,7 +9,6 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 
 import javax.swing.JOptionPane;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.openstreetmap.josm.Main;
@@ -25,6 +24,7 @@ import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.io.auth.DefaultAuthenticator;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.HttpClient;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.XmlParsingException;
 import org.w3c.dom.Document;
 import org.xml.sax.SAXException;
@@ -123,7 +123,7 @@ public class TestAccessTokenTask extends PleaseWaitRunnable {
             if (connection.getResponse().getResponseCode() != HttpURLConnection.HTTP_OK)
                 throw new OsmApiException(connection.getResponse().getResponseCode(),
                         connection.getResponse().getHeaderField("Error"), null);
-            Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(connection.getResponse().getContent());
+            Document d = Utils.parseSafeDOM(connection.getResponse().getContent());
             return OsmServerUserInfoReader.buildFromXML(d);
         } catch (SAXException | ParserConfigurationException e) {
             throw new XmlParsingException(e);
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
index 7dd4b85..9907f18 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
@@ -20,12 +20,12 @@ import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
+import javax.swing.JButton;
 import javax.swing.JDialog;
 import javax.swing.JPanel;
 import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.actions.ExpertToggleAction;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane.ValidationListener;
@@ -66,9 +66,9 @@ public class PreferenceDialog extends JDialog {
 
         JPanel btns = new JPanel(new FlowLayout(FlowLayout.CENTER));
         btns.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-        btns.add(new SideButton(new OKAction()));
-        btns.add(new SideButton(new CancelAction()));
-        btns.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Action/Preferences"))));
+        btns.add(new JButton(new OKAction()));
+        btns.add(new JButton(new CancelAction()));
+        btns.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Action/Preferences"))));
         pnl.add(expert, GBC.std().insets(5, 0, 0, 0));
         pnl.add(btns, GBC.std().fill(GBC.HORIZONTAL));
         return pnl;
@@ -156,7 +156,7 @@ public class PreferenceDialog extends JDialog {
     class CancelAction extends AbstractAction {
         CancelAction() {
             putValue(NAME, tr("Cancel"));
-            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            new ImageProvider("cancel").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the preferences dialog and discard preference updates"));
         }
 
@@ -175,7 +175,7 @@ public class PreferenceDialog extends JDialog {
     class OKAction extends AbstractAction {
         OKAction() {
             putValue(NAME, tr("OK"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            new ImageProvider("ok").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Save the preferences and close the dialog"));
         }
 
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
index d6a2887..936227f 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
@@ -6,7 +6,6 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Component;
 import java.awt.Font;
 import java.awt.GridBagLayout;
-import java.awt.Image;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
@@ -509,10 +508,10 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
                 if (expert || !tps.isExpert()) {
                     // Get icon
                     String iconName = tps.getIconName();
-                    ImageIcon icon = iconName != null && !iconName.isEmpty() ? ImageProvider.get("preferences", iconName) : null;
-                    // See #6985 - Force icons to be 48x48 pixels
-                    if (icon != null && (icon.getIconHeight() != 48 || icon.getIconWidth() != 48)) {
-                        icon = new ImageIcon(icon.getImage().getScaledInstance(48, 48, Image.SCALE_DEFAULT));
+                    ImageIcon icon = null;
+
+                    if (iconName != null && !iconName.isEmpty()) {
+                        icon = ImageProvider.get("preferences", iconName, ImageProvider.ImageSizes.SETTINGS_TAB);
                     }
                     if (settingsInitialized.contains(tps)) {
                         // If it has been initialized, add corresponding tab(s)
@@ -545,7 +544,7 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
     }
 
     @SuppressWarnings("unchecked")
-    public <T>  T getSetting(Class<? extends T> clazz) {
+    public <T> T getSetting(Class<? extends T> clazz) {
         for (PreferenceSetting setting:settings) {
             if (clazz.isAssignableFrom(setting.getClass()))
                 return (T) setting;
diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
index 0e76360..c47f104 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
@@ -895,7 +895,7 @@ public abstract class SourceEditor extends JPanel {
 
         class LaunchFileChooserAction extends AbstractAction {
             LaunchFileChooserAction() {
-                putValue(SMALL_ICON, ImageProvider.get("open"));
+                new ImageProvider("open").getResource().attachImageIcon(this);
                 putValue(SHORT_DESCRIPTION, tr("Launch a file chooser to select a file"));
             }
 
@@ -946,7 +946,7 @@ public abstract class SourceEditor extends JPanel {
         NewActiveSourceAction() {
             putValue(NAME, tr("New"));
             putValue(SHORT_DESCRIPTION, getStr(I18nString.NEW_SOURCE_ENTRY_TOOLTIP));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "add"));
+            new ImageProvider("dialogs", "add").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -976,7 +976,7 @@ public abstract class SourceEditor extends JPanel {
         RemoveActiveSourcesAction() {
             putValue(NAME, tr("Remove"));
             putValue(SHORT_DESCRIPTION, getStr(I18nString.REMOVE_SOURCE_TOOLTIP));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
@@ -999,7 +999,7 @@ public abstract class SourceEditor extends JPanel {
         EditActiveSourceAction() {
             putValue(NAME, tr("Edit"));
             putValue(SHORT_DESCRIPTION, getStr(I18nString.EDIT_SOURCE_TOOLTIP));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+            new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
@@ -1073,7 +1073,7 @@ public abstract class SourceEditor extends JPanel {
     class ActivateSourcesAction extends AbstractAction implements ListSelectionListener {
         ActivateSourcesAction() {
             putValue(SHORT_DESCRIPTION, getStr(I18nString.ACTIVATE_TOOLTIP));
-            putValue(SMALL_ICON, ImageProvider.get("preferences", "activate-right"));
+            new ImageProvider("preferences", "activate-right").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
@@ -1127,7 +1127,7 @@ public abstract class SourceEditor extends JPanel {
         ResetAction() {
             putValue(NAME, tr("Reset"));
             putValue(SHORT_DESCRIPTION, tr("Reset to default"));
-            putValue(SMALL_ICON, ImageProvider.get("preferences", "reset"));
+            new ImageProvider("preferences", "reset").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -1143,7 +1143,7 @@ public abstract class SourceEditor extends JPanel {
         ReloadSourcesAction(String url, List<SourceProvider> sourceProviders) {
             putValue(NAME, tr("Reload"));
             putValue(SHORT_DESCRIPTION, tr(getStr(I18nString.RELOAD_ALL_AVAILABLE), url));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
+            new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
             this.url = url;
             this.sourceProviders = sourceProviders;
             setEnabled(!Main.isOffline(OnlineResource.JOSM_WEBSITE));
@@ -1261,7 +1261,7 @@ public abstract class SourceEditor extends JPanel {
         NewIconPathAction() {
             putValue(NAME, tr("New"));
             putValue(SHORT_DESCRIPTION, tr("Add a new icon path"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "add"));
+            new ImageProvider("dialogs", "add").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -1275,7 +1275,7 @@ public abstract class SourceEditor extends JPanel {
         RemoveIconPathAction() {
             putValue(NAME, tr("Remove"));
             putValue(SHORT_DESCRIPTION, tr("Remove the selected icon paths"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
@@ -1298,7 +1298,7 @@ public abstract class SourceEditor extends JPanel {
         EditIconPathAction() {
             putValue(NAME, tr("Edit"));
             putValue(SHORT_DESCRIPTION, tr("Edit the selected icon path"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+            new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this);
             updateEnabledState();
         }
 
diff --git a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
index bb8794d..7cbed0e 100644
--- a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
+++ b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
@@ -397,7 +397,7 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
         }
     }
 
-    private class ToolbarPopupMenu extends JPopupMenu  {
+    private class ToolbarPopupMenu extends JPopupMenu {
         private transient ActionDefinition act;
 
         private void setActionAndAdapt(ActionDefinition action) {
@@ -1136,7 +1136,7 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
 
         long paramCode = 0;
         if (action.hasParameters()) {
-            paramCode =  action.parameters.hashCode();
+            paramCode = action.parameters.hashCode();
         }
 
         String tt = action.getDisplayTooltip();
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
index cb35231..d9bf4cf 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
@@ -59,7 +59,7 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
     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 colorTypeNone = new JRadioButton(tr("Single Color (can be customized for named layers)"));
-    private final JRadioButton colorTypeGlobal  = new JRadioButton(tr("Use global settings"));
+    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 JCheckBox makeAutoMarkers = new JCheckBox(tr("Create markers when reading GPX"));
     private final JCheckBox drawGpsArrows = new JCheckBox(tr("Draw Direction Arrows"));
@@ -358,11 +358,11 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
         } else {
             int colorType = Main.pref.getInteger("draw.rawgps.colors", layerName, 0);
             switch (colorType) {
-            case 0: colorTypeNone.setSelected(true);   break;
-            case 1: colorTypeVelocity.setSelected(true);  break;
-            case 2: colorTypeDilution.setSelected(true);  break;
+            case 0: colorTypeNone.setSelected(true); break;
+            case 1: colorTypeVelocity.setSelected(true); break;
+            case 2: colorTypeDilution.setSelected(true); break;
             case 3: colorTypeDirection.setSelected(true); break;
-            case 4: colorTypeTime.setSelected(true);  break;
+            case 4: colorTypeTime.setSelected(true); break;
             default: Main.warn("Unknown color type: " + colorType);
             }
             int ccts = Main.pref.getInteger("draw.rawgps.colorTracksTune", layerName, 45);
@@ -396,7 +396,7 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
             Main.pref.put("draw.rawgps.min-arrow-distance"+layerNameDot, null);
         } else {
             if (layerName == null || !locLayer) {
-                Main.pref.put("draw.rawgps.lines" +  layerNameDot, drawRawGpsLinesAll.isSelected());
+                Main.pref.put("draw.rawgps.lines" + layerNameDot, drawRawGpsLinesAll.isSelected());
                 Main.pref.put("draw.rawgps.max-line-length" + layerNameDot, drawRawGpsMaxLineLength.getText());
             }
             if (layerName == null || locLayer) {
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
index d76f357..ba5fb5a 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
@@ -83,21 +83,25 @@ public class AddWMSLayerPanel extends AddImageryPanel {
                     formats.setModel(new DefaultComboBoxModel<>(wms.getFormats().toArray(new String[0])));
                     formats.setSelectedItem(wms.getPreferredFormats());
                 } catch (MalformedURLException ex) {
+                    Main.error(ex, false);
                     JOptionPane.showMessageDialog(getParent(), tr("Invalid service URL."),
                             tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
                 } catch (IOException ex) {
+                    Main.error(ex, false);
                     JOptionPane.showMessageDialog(getParent(), tr("Could not retrieve WMS layer list."),
                             tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
                 } catch (WMSImagery.WMSGetCapabilitiesException ex) {
                     String incomingData = ex.getIncomingData().trim();
                     String title = tr("WMS Error");
                     String message = tr("Could not parse WMS layer list.");
-                    Main.error("Could not parse WMS layer list. Incoming data:\n"+incomingData);
-                    if (incomingData != null
-                            && (incomingData.startsWith("<html>") || incomingData.startsWith("<HTML>"))
-                            && (incomingData.endsWith("</html>") || incomingData.endsWith("</HTML>"))) {
+                    Main.error(ex, "Could not parse WMS layer list. Incoming data:\n"+incomingData);
+                    if ((incomingData.startsWith("<html>") || incomingData.startsWith("<HTML>"))
+                      && (incomingData.endsWith("</html>") || incomingData.endsWith("</HTML>"))) {
                         GuiHelper.notifyUserHtmlError(AddWMSLayerPanel.this, title, message, incomingData);
                     } else {
+                        if (ex.getMessage() != null) {
+                            message += '\n' + ex.getMessage();
+                        }
                         JOptionPane.showMessageDialog(getParent(), message, title, JOptionPane.ERROR_MESSAGE);
                     }
                 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java
index feec978..016c4cf 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/CacheContentsPanel.java
@@ -236,7 +236,7 @@ public class CacheContentsPanel extends JPanel {
                     public void actionPerformed(ActionEvent e) {
                         int row = ret.convertRowIndexToModel(ret.getEditingRow());
                         tableModel.setValueAt("0", row, 1);
-                        cache.remove(ret.getValueAt(row, 0) + ":");
+                        cache.remove(ret.getValueAt(row, 0).toString() + ':');
                     }
                 });
         TableColumn tableColumn = ret.getColumnModel().getColumn(2);
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
index 044fa2a..138e470 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/CommonSettingsPanel.java
@@ -7,6 +7,8 @@ import java.awt.Color;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FilenameFilter;
 
 import javax.swing.JButton;
 import javax.swing.JColorChooser;
@@ -17,6 +19,7 @@ import javax.swing.JSlider;
 import javax.swing.JSpinner;
 import javax.swing.SpinnerNumberModel;
 
+import org.openstreetmap.josm.data.cache.JCSCacheManager;
 import org.openstreetmap.josm.data.imagery.CachedTileLoaderFactory;
 import org.openstreetmap.josm.gui.layer.AbstractCachedTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
@@ -25,6 +28,7 @@ import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * {@code JPanel} giving access to common imagery settings.
@@ -128,6 +132,11 @@ public class CommonSettingsPanel extends JPanel {
 
         boolean restartRequired = false;
         if (!AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.get().equals(this.maxElementsOnDisk.getValue())) {
+            if (((Integer) this.maxElementsOnDisk.getValue()) < AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.get() &&
+                    JCSCacheManager.USE_BLOCK_CACHE.get()) {
+                // reducing size of the cache, this requires deletion of the files
+                removeCacheFiles(CachedTileLoaderFactory.PROP_TILECACHE_DIR.get());
+            }
             AbstractCachedTileSourceLayer.MAX_DISK_CACHE_SIZE.put((Integer) this.maxElementsOnDisk.getValue());
             restartRequired = true;
         }
@@ -135,6 +144,7 @@ public class CommonSettingsPanel extends JPanel {
 
         if (!CachedTileLoaderFactory.PROP_TILECACHE_DIR.get().equals(this.tilecacheDir.getText())) {
             restartRequired = true;
+            removeCacheFiles(CachedTileLoaderFactory.PROP_TILECACHE_DIR.get()); // clear old cache directory
             CachedTileLoaderFactory.PROP_TILECACHE_DIR.put(this.tilecacheDir.getText());
         }
 
@@ -145,4 +155,19 @@ public class CommonSettingsPanel extends JPanel {
         }
         return restartRequired;
     }
+
+    private void removeCacheFiles(String path) {
+        File directory = new File(path);
+        File[] cacheFiles = directory.listFiles(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".data") || name.endsWith(".key");
+            }
+
+        });
+        JCSCacheManager.shutdown(); // shutdown Cache - so files can by safely deleted
+        for (File cacheFile: cacheFiles) {
+            Utils.deleteFile(cacheFile);
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
index ba2fc0c..37a64f4 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/MapPaintPreference.java
@@ -166,9 +166,7 @@ public class MapPaintPreference implements SubPreferenceSetting {
                 return css.title;
             }
         } catch (RuntimeException ignore) {
-            if (Main.isTraceEnabled()) {
-                Main.trace(ignore.getMessage());
-            }
+            Main.debug(ignore);
         }
         return null;
     }
diff --git a/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java b/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
index cedfa59..513134d 100644
--- a/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
@@ -100,7 +100,7 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
                             if (canLoad) {
                                 errorMessage = tr("<html>Tagging preset source {0} can be loaded but it contains errors. " +
                                         "Do you really want to use it?<br><br><table width=600>Error is: {1}</table></html>",
-                                        source,  e.getMessage());
+                                        source, e.getMessage());
                             } else {
                                 errorMessage = tr("<html>Unable to parse tagging preset source: {0}. " +
                                         "Do you really want to use it?<br><br><table width=600>Error is: {1}</table></html>",
@@ -126,7 +126,7 @@ public final class TaggingPresetPreference implements SubPreferenceSetting {
                     }
                 sources.removeSources(sourcesToRemove);
                 return true;
-            }  else {
+            } else {
                 return true;
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
index bbd9443..12ae00b 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
@@ -197,7 +197,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
     protected JPanel buildPluginListPanel() {
         JPanel pnl = new JPanel(new BorderLayout());
         pnl.add(buildSearchFieldPanel(), BorderLayout.NORTH);
-        model  = new PluginPreferencesModel();
+        model = new PluginPreferencesModel();
         pnlPluginPreferences = new PluginListPanel(model);
         spPluginPreferences = GuiHelper.embedInVerticalScrollPane(pnlPluginPreferences);
         spPluginPreferences.getVerticalScrollBar().addComponentListener(
@@ -346,7 +346,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
         DownloadAvailablePluginsAction() {
             putValue(NAME, tr("Download list"));
             putValue(SHORT_DESCRIPTION, tr("Download the list of available plugins"));
-            putValue(SMALL_ICON, ImageProvider.get("download"));
+            new ImageProvider("download").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -383,7 +383,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
         UpdateSelectedPluginsAction() {
             putValue(NAME, tr("Update plugins"));
             putValue(SHORT_DESCRIPTION, tr("Update the selected plugins"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
+            new ImageProvider("dialogs", "refresh").getResource().attachImageIcon(this);
         }
 
         protected void alertNothingToUpdate() {
@@ -485,7 +485,7 @@ public final class PluginPreference extends DefaultTabPreferenceSetting {
         ConfigureSitesAction() {
             putValue(NAME, tr("Configure sites..."));
             putValue(SHORT_DESCRIPTION, tr("Configure the list of sites where plugins are downloaded from"));
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "settings"));
+            new ImageProvider("dialogs", "settings").getResource().attachImageIcon(this);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java b/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
index ee19213..12060dc 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
@@ -146,7 +146,7 @@ public class CodeProjectionChoice extends AbstractProjectionChoice implements Su
                 }
             }
             model.fireContentsChanged();
-            int idx =  filteredData.indexOf(lastCode);
+            int idx = filteredData.indexOf(lastCode);
             if (idx == -1) {
                 selectionList.clearSelection();
                 if (selectionList.getModel().getSize() > 0) {
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAccessTokenHolder.java b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAccessTokenHolder.java
index d17755c..d050392 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAccessTokenHolder.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAccessTokenHolder.java
@@ -14,7 +14,7 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
  * Class holding OAuth access token key and secret.
  */
 public class OAuthAccessTokenHolder {
-    private  static OAuthAccessTokenHolder instance;
+    private static OAuthAccessTokenHolder instance;
 
     /**
      * Replies the unique instance.
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
index d4dd232..f4a38bb 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
@@ -18,6 +18,7 @@ import java.beans.PropertyChangeListener;
 
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -25,7 +26,6 @@ import javax.swing.JPanel;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.oauth.OAuthParameters;
 import org.openstreetmap.josm.data.oauth.OAuthToken;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.oauth.AdvancedOAuthPropertiesPanel;
 import org.openstreetmap.josm.gui.oauth.OAuthAuthorizationWizard;
 import org.openstreetmap.josm.gui.oauth.TestAccessTokenTask;
@@ -199,7 +199,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
             gc.gridy = 1;
             gc.fill = GridBagConstraints.NONE;
             gc.weightx = 0.0;
-            add(new SideButton(new AuthoriseNowAction()), gc);
+            add(new JButton(new AuthoriseNowAction()), gc);
 
             // filler - grab remaining space
             gc.gridy = 2;
@@ -272,8 +272,8 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
 
             // -- action buttons
             JPanel btns = new JPanel(new FlowLayout(FlowLayout.LEFT));
-            btns.add(new SideButton(new RenewAuthorisationAction()));
-            btns.add(new SideButton(new TestAuthorisationAction()));
+            btns.add(new JButton(new RenewAuthorisationAction()));
+            btns.add(new JButton(new TestAuthorisationAction()));
             gc.gridy = 4;
             gc.gridx = 0;
             gc.gridwidth = 2;
@@ -311,7 +311,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         AuthoriseNowAction() {
             putValue(NAME, tr("Authorize now"));
             putValue(SHORT_DESCRIPTION, tr("Click to step through the OAuth authorization process"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
         }
 
         @Override
@@ -323,7 +323,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
             try {
                 wizard.showDialog();
             } catch (UserCancelException ignore) {
-                Main.trace(ignore.toString());
+                Main.trace(ignore);
                 return;
             }
             pnlAdvancedProperties.setAdvancedParameters(wizard.getOAuthParameters());
@@ -341,7 +341,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         RenewAuthorisationAction() {
             putValue(NAME, tr("New Access Token"));
             putValue(SHORT_DESCRIPTION, tr("Click to step through the OAuth authorization process and generate a new Access Token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
         }
     }
 
@@ -355,8 +355,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         TestAuthorisationAction() {
             putValue(NAME, tr("Test Access Token"));
             putValue(SHORT_DESCRIPTION, tr("Click test access to the OSM server with the current access token"));
-            putValue(SMALL_ICON, ImageProvider.get("oauth", "oauth-small"));
-
+            new ImageProvider("oauth", "oauth-small").getResource().attachImageIcon(this);
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
index f87c268..5d66bf5 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
@@ -16,6 +16,7 @@ import java.awt.event.ItemListener;
 import java.util.Arrays;
 
 import javax.swing.AbstractAction;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
@@ -27,7 +28,6 @@ import javax.swing.text.JTextComponent;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.CollectionProperty;
-import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
@@ -52,7 +52,7 @@ public class OsmApiUrlInputPanel extends JPanel {
     private final JLabel lblApiUrl = new JLabel(tr("OSM Server URL:"));
     private final HistoryComboBox tfOsmServerUrl = new HistoryComboBox();
     private transient ApiUrlValidator valOsmServerUrl;
-    private SideButton btnTest;
+    private JButton btnTest;
     /** indicates whether to use the default OSM URL or not */
     private JCheckBox cbUseDefaultServerUrl;
     private final transient CollectionProperty SERVER_URL_HISTORY = new CollectionProperty("osm-server.url-history", Arrays.asList(
@@ -84,7 +84,7 @@ public class OsmApiUrlInputPanel extends JPanel {
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.weightx = 1.0;
         gc.insets = new Insets(0, 0, 0, 0);
-        gc.gridwidth  = 4;
+        gc.gridwidth = 4;
         add(buildDefaultServerUrlPanel(), gc);
 
 
@@ -115,7 +115,7 @@ public class OsmApiUrlInputPanel extends JPanel {
         gc.weightx = 0.0;
         ValidateApiUrlAction actTest = new ValidateApiUrlAction();
         tfOsmServerUrl.getEditorComponent().getDocument().addDocumentListener(actTest);
-        btnTest = new SideButton(actTest);
+        btnTest = new JButton(actTest);
         add(btnTest, gc);
     }
 
@@ -123,7 +123,7 @@ public class OsmApiUrlInputPanel extends JPanel {
      * Initializes the configuration panel with values from the preferences
      */
     public void initFromPreferences() {
-        String url =  OsmApi.getOsmApi().getServerUrl();
+        String url = OsmApi.getOsmApi().getServerUrl();
         tfOsmServerUrl.setPossibleItems(SERVER_URL_HISTORY.get());
         if (OsmApi.DEFAULT_API_URL.equals(url.trim())) {
             cbUseDefaultServerUrl.setSelected(true);
diff --git a/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java b/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
index fe0ad5c..a8f34b3 100644
--- a/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
@@ -65,11 +65,11 @@ public class PrefJPanel extends JPanel {
     // usually matches the keyboard. This even works with my English Windows and my German keyboard.
     private static final String SHIFT = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
             KeyEvent.SHIFT_DOWN_MASK).getModifiers());
-    private static final String CTRL  = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
+    private static final String CTRL = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
             KeyEvent.CTRL_DOWN_MASK).getModifiers());
-    private static final String ALT   = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
+    private static final String ALT = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
             KeyEvent.ALT_DOWN_MASK).getModifiers());
-    private static final String META  = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
+    private static final String META = KeyEvent.getKeyModifiersText(KeyStroke.getKeyStroke(KeyEvent.VK_A,
             KeyEvent.META_DOWN_MASK).getModifiers());
 
     // A list of keys to present the user. Sadly this really is a list of keys Java knows about,
@@ -245,7 +245,7 @@ public class PrefJPanel extends JPanel {
 
     private JPanel buildFilterPanel() {
         // copied from PluginPreference
-        JPanel pnl  = new JPanel(new GridBagLayout());
+        JPanel pnl = new JPanel(new GridBagLayout());
         pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         GridBagConstraints gc = new GridBagConstraints();
 
diff --git a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
index 24da485..3db67da 100644
--- a/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreference.java
@@ -143,6 +143,7 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
         public Collection<ExtendedSourceEntry> getDefault() {
             List<ExtendedSourceEntry> def = new ArrayList<>();
 
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             addDefault(def, "addresses",    tr("Addresses"),           tr("Checks for errors on addresses"));
             addDefault(def, "combinations", tr("Tag combinations"),    tr("Checks for missing tag or suspicious combinations"));
             addDefault(def, "deprecated",   tr("Deprecated features"), tr("Checks for deprecated features"));
@@ -154,6 +155,7 @@ public class ValidatorTagCheckerRulesPreference implements SubPreferenceSetting
             addDefault(def, "relation",     tr("Relations"),           tr("Checks for errors on relations"));
             addDefault(def, "unnecessary",  tr("Unnecessary tags"),    tr("Checks for unnecessary tags"));
             addDefault(def, "wikipedia",    tr("Wikipedia"),           tr("Checks for wrong wikipedia tags"));
+            // CHECKSTYLE.ON: SingleSpaceSeparator
 
             return def;
         }
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagCellRenderer.java b/src/org/openstreetmap/josm/gui/tagging/TagCellRenderer.java
index 3a3ee15..ac039e3 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagCellRenderer.java
@@ -18,7 +18,7 @@ import javax.swing.table.TableCellRenderer;
  *
  *
  */
-public class TagCellRenderer extends JLabel implements TableCellRenderer  {
+public class TagCellRenderer extends JLabel implements TableCellRenderer {
     private final Font fontStandard;
     private final Font fontItalic;
 
@@ -53,7 +53,7 @@ public class TagCellRenderer extends JLabel implements TableCellRenderer  {
             setText("");
         } else if (tag.getValueCount() == 1) {
             setText(tag.getValues().get(0));
-        } else if (tag.getValueCount() >  1) {
+        } else if (tag.getValueCount() > 1) {
             setText(tr("multiple"));
             setFont(fontItalic);
         }
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagTable.java b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
index e963fad..cea481e 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagTable.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
@@ -48,7 +48,7 @@ import org.openstreetmap.josm.tools.Utils;
  * This is the tabular editor component for OSM tags.
  * @since 1762
  */
-public class TagTable extends JosmTable  {
+public class TagTable extends JosmTable {
     /** the table cell editor used by this table */
     private TagCellEditor editor;
     private final TagEditorModel model;
@@ -69,9 +69,8 @@ public class TagTable extends JosmTable  {
      *   <li>it automatically add a new empty row when the user leaves the
      *   last cell in the table</li>
      * </ul>
-     *
      */
-    class SelectNextColumnCellAction extends AbstractAction  {
+    class SelectNextColumnCellAction extends AbstractAction {
         @Override
         public void actionPerformed(ActionEvent e) {
             run();
@@ -115,9 +114,8 @@ public class TagTable extends JosmTable  {
     /**
      * Action to be run when the user navigates to the previous cell in the table,
      * for instance by pressing Shift-TAB
-     *
      */
-    class SelectPreviousColumnCellAction extends AbstractAction  {
+    class SelectPreviousColumnCellAction extends AbstractAction {
 
         @Override
         public void actionPerformed(ActionEvent e) {
@@ -163,7 +161,7 @@ public class TagTable extends JosmTable  {
     class DeleteAction extends AbstractAction implements ListSelectionListener {
 
         DeleteAction() {
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Delete the selection in the tag table"));
             getSelectionModel().addListSelectionListener(this);
             getColumnModel().getSelectionModel().addListSelectionListener(this);
@@ -252,7 +250,7 @@ public class TagTable extends JosmTable  {
      */
     class AddAction extends AbstractAction implements PropertyChangeListener {
         AddAction() {
-            putValue(SMALL_ICON, ImageProvider.get("dialogs", "add"));
+            new ImageProvider("dialogs", "add").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Add a new tag"));
             TagTable.this.addPropertyChangeListener(this);
             updateEnabledState();
@@ -286,7 +284,7 @@ public class TagTable extends JosmTable  {
      */
     class PasteAction extends AbstractAction implements PropertyChangeListener {
         PasteAction() {
-            putValue(SMALL_ICON, ImageProvider.get("", "pastetags"));
+            new ImageProvider("pastetags").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Paste tags from buffer"));
             TagTable.this.addPropertyChangeListener(this);
             updateEnabledState();
diff --git a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
index 0f34954..8575a76 100644
--- a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
+++ b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
@@ -32,7 +32,7 @@ public class AutoCompletionItemPriority implements Comparable<AutoCompletionItem
     /**
      * Indicates that this is a value from a selected object.
      */
-    public static final AutoCompletionItemPriority  IS_IN_SELECTION  = new AutoCompletionItemPriority(false, false, true);
+    public static final AutoCompletionItemPriority IS_IN_SELECTION = new AutoCompletionItemPriority(false, false, true);
 
     /** Unknown priority. This is the lowest priority. */
     public static final AutoCompletionItemPriority UNKNOWN = new AutoCompletionItemPriority(false, false, false);
diff --git a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java
index b0be5d9..0a83cb0 100644
--- a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java
+++ b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionListItem.java
@@ -19,7 +19,7 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
 public class AutoCompletionListItem implements Comparable<AutoCompletionListItem> {
 
     /** the pritority of this item */
-    private  AutoCompletionItemPriority priority;
+    private AutoCompletionItemPriority priority;
     /** the value of this item */
     private String value;
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
index 7b0037f..9db8693 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
@@ -42,10 +42,10 @@ import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
 import org.openstreetmap.josm.gui.tagging.presets.items.Key;
 import org.openstreetmap.josm.gui.tagging.presets.items.Label;
@@ -74,7 +74,7 @@ import org.xml.sax.SAXException;
  * It is also able to construct dialogs out of preset definitions.
  * @since 294
  */
-public class TaggingPreset extends AbstractAction implements MapView.LayerChangeListener, Predicate<OsmPrimitive> {
+public class TaggingPreset extends AbstractAction implements ActiveLayerChangeListener, Predicate<OsmPrimitive> {
 
     public static final int DIALOG_ANSWER_APPLY = 1;
     public static final int DIALOG_ANSWER_NEW_RELATION = 2;
@@ -112,7 +112,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
      * Use this as default item for "do not select anything".
      */
     public TaggingPreset() {
-        MapView.addLayerChangeListener(this);
+        Main.getLayerManager().addActiveLayerChangeListener(this);
         updateEnabledState();
     }
 
@@ -191,7 +191,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
                     GuiHelper.runInEDT(new Runnable() {
                         @Override
                         public void run() {
-                            result.getImageIcon(TaggingPreset.this);
+                            result.attachImageIcon(TaggingPreset.this);
                         }
                     });
                 } else {
@@ -354,7 +354,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         if (Main.main == null) {
             return;
         }
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         Collection<OsmPrimitive> participants = Collections.emptyList();
         if (Main.main != null && ds != null) {
             participants = ds.getSelected();
@@ -388,7 +388,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
             SwingUtilities.invokeLater(new Runnable() {
                 @Override
                 public void run() {
-                    RelationEditor.getEditor(Main.main.getEditLayer(), r, members).setVisible(true);
+                    RelationEditor.getEditor(Main.getLayerManager().getEditLayer(), r, members).setVisible(true);
                 }
             });
         }
@@ -479,6 +479,10 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         return sel;
     }
 
+    /**
+     * Gets a list of tags that are set by this preset.
+     * @return The list of tags.
+     */
     public List<Tag> getChangedTags() {
         List<Tag> result = new ArrayList<>();
         for (TaggingPresetItem i: data) {
@@ -487,6 +491,12 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         return result;
     }
 
+    /**
+     * Create a command to change the given list of tags.
+     * @param sel The primitives to change the tags for
+     * @param changedTags The tags to change
+     * @return A command that changes the tags.
+     */
     public static Command createCommand(Collection<OsmPrimitive> sel, List<Tag> changedTags) {
         List<Command> cmds = new ArrayList<>();
         for (Tag tag: changedTags) {
@@ -509,21 +519,11 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
     }
 
     protected final void updateEnabledState() {
-        setEnabled(Main.main != null && Main.main.getCurrentDataSet() != null);
-    }
-
-    @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        updateEnabledState();
+        setEnabled(Main.main != null && Main.getLayerManager().getEditDataSet() != null);
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        updateEnabledState();
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         updateEnabledState();
     }
 
@@ -532,6 +532,11 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         return (types == null ? "" : types.toString()) + ' ' + name;
     }
 
+    /**
+     * Determines whether this preset matches the types.
+     * @param t The types that must match
+     * @return <code>true</code> if all types match.
+     */
     public boolean typeMatches(Collection<TaggingPresetType> t) {
         return t == null || types == null || types.containsAll(t);
     }
@@ -557,12 +562,11 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
      * @return {@code true} if this preset matches the parameters.
      */
     public boolean matches(Collection<TaggingPresetType> t, Map<String, String> tags, boolean onlyShowable) {
-        if (onlyShowable && !isShowable())
-            return false;
-        else if (!typeMatches(t))
+        if ((onlyShowable && !isShowable()) || !typeMatches(t)) {
             return false;
-        else
+        } else {
             return TaggingPresetItem.matches(data, tags);
+        }
     }
 
     /**
@@ -589,6 +593,11 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         }
     }
 
+    /**
+     * Gets a string describing this preset that can be used for the toolbar
+     * @return A String that can be passed on to the toolbar
+     * @see ToolbarPreferences#addCustomButton(String, int, boolean)
+     */
     public String getToolbarString() {
         ToolbarPreferences.ActionParser actionParser = new ToolbarPreferences.ActionParser(null);
         return actionParser.saveAction(new ToolbarPreferences.ActionDefinition(this));
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
index e1b8bf5..e405aaf 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
@@ -40,7 +40,7 @@ public abstract class TaggingPresetItem {
 
     protected void initAutoCompletionField(AutoCompletingTextField field, List<String> keys) {
         if (Main.main == null) return;
-        OsmDataLayer layer = Main.main.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         if (layer == null) {
             return;
         }
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
index 3591780..c5999e4 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
@@ -356,7 +356,7 @@ public final class TaggingPresetReader {
      */
     public static Collection<TaggingPreset> readAll(Collection<String> sources, boolean validate, boolean displayErrMsg) {
         HashSetWithLast<TaggingPreset> allPresets = new HashSetWithLast<>();
-        for (String source : sources)  {
+        for (String source : sources) {
             try {
                 readAll(source, validate, allPresets);
             } catch (IOException e) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchAction.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchAction.java
index 5481558..8014d02 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchAction.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchAction.java
@@ -29,7 +29,7 @@ public class TaggingPresetSearchAction extends JosmAction {
     @Override
     public void actionPerformed(ActionEvent e) {
 
-        if (!Main.main.hasEditLayer())
+        if (Main.getLayerManager().getEditLayer() == null)
             return;
 
         TaggingPresetSearchDialog.getInstance().showDialog();
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
index 22a9e7c..fb1d850 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
@@ -44,14 +44,14 @@ public final class TaggingPresetSearchPrimitiveDialog extends ExtendedDialog {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            if (Main.main.hasEditLayer()) {
+            if (Main.getLayerManager().getEditLayer() != null) {
                 TaggingPresetSearchPrimitiveDialog.getInstance().showDialog();
             }
         }
 
         @Override
         protected void updateEnabledState() {
-            setEnabled(getEditLayer() != null);
+            setEnabled(getLayerManager().getEditLayer() != null);
         }
     }
 
@@ -92,8 +92,8 @@ public final class TaggingPresetSearchPrimitiveDialog extends ExtendedDialog {
         if (buttonIndex == 0) {
             TaggingPreset preset = selector.getSelectedPresetAndUpdateClassification();
             if (preset != null) {
-                final Set<OsmPrimitive> matching = new HashSet<>(Utils.filter(Main.main.getCurrentDataSet().allPrimitives(), preset));
-                Main.main.getCurrentDataSet().setSelected(matching);
+                final Set<OsmPrimitive> matching = new HashSet<>(Utils.filter(Main.getLayerManager().getEditDataSet().allPrimitives(), preset));
+                Main.getLayerManager().getEditDataSet().setSelected(matching);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
index 30a419b..755d716 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
@@ -61,7 +61,7 @@ public class TaggingPresetSelector extends SearchTextResultListPanel<TaggingPres
     private static final int CLASSIFICATION_TAGS_MATCH = 100;
 
     private static final BooleanProperty SEARCH_IN_TAGS = new BooleanProperty("taggingpreset.dialog.search-in-tags", true);
-    private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
+    private static final BooleanProperty ONLY_APPLICABLE = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
 
     private final JCheckBox ckOnlyApplicable;
     private final JCheckBox ckSearchInTags;
@@ -240,7 +240,7 @@ public class TaggingPresetSelector extends SearchTextResultListPanel<TaggingPres
         boolean onlyApplicable = ckOnlyApplicable != null && ckOnlyApplicable.isSelected();
         boolean inTags = ckSearchInTags != null && ckSearchInTags.isSelected();
 
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         Collection<OsmPrimitive> selected = (ds == null) ? Collections.<OsmPrimitive>emptyList() : ds.getSelected();
         final List<PresetClassification> result = classifications.getMatchingPresets(
                 text, onlyApplicable, inTags, getTypesInSelection(), selected);
@@ -371,8 +371,8 @@ public class TaggingPresetSelector extends SearchTextResultListPanel<TaggingPres
             synchronized (typesInSelection) {
                 typesInSelectionDirty = false;
                 typesInSelection.clear();
-                if (Main.main == null || Main.main.getCurrentDataSet() == null) return typesInSelection;
-                for (OsmPrimitive primitive : Main.main.getCurrentDataSet().getSelected()) {
+                if (Main.main == null || Main.getLayerManager().getEditDataSet() == null) return typesInSelection;
+                for (OsmPrimitive primitive : Main.getLayerManager().getEditDataSet().getSelected()) {
                     typesInSelection.add(TaggingPresetType.forPrimitive(primitive));
                 }
             }
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 e0801a0..0243a8d 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
@@ -449,6 +449,7 @@ public abstract class ComboMultiSelect extends KeyedItem {
                 } catch (ReflectiveOperationException e) {
                     Main.error(tr("Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' threw {2} ({3})", key, text,
                             e.getClass().getName(), e.getMessage()));
+                    Main.debug(e);
                 }
             }
         }
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 0ce5703..c368865 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
@@ -79,7 +79,7 @@ public class Text extends KeyedItem {
             textField.setMaxChars(Integer.valueOf(length));
         }
         if (usage.unused()) {
-            if (auto_increment_selected != 0  && auto_increment != null) {
+            if (auto_increment_selected != 0 && auto_increment != null) {
                 try {
                     textField.setText(Integer.toString(Integer.parseInt(
                             LAST_VALUES.get(key)) + auto_increment_selected));
diff --git a/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java b/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
index 6f569b8..98b5363 100644
--- a/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
+++ b/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
@@ -114,7 +114,7 @@ public class AdjustmentSynchronizer implements AdjustmentListener {
      * @throws IllegalArgumentException if view is null
      * @throws IllegalArgumentException if adjustable is null
      */
-    public void adapt(final JCheckBox view, final Adjustable adjustable)  {
+    public void adapt(final JCheckBox view, final Adjustable adjustable) {
         CheckParameterUtil.ensureParameterNotNull(adjustable, "adjustable");
         CheckParameterUtil.ensureParameterNotNull(view, "view");
 
diff --git a/src/org/openstreetmap/josm/gui/util/GuiHelper.java b/src/org/openstreetmap/josm/gui/util/GuiHelper.java
index 61b12fb..b6612e4 100644
--- a/src/org/openstreetmap/josm/gui/util/GuiHelper.java
+++ b/src/org/openstreetmap/josm/gui/util/GuiHelper.java
@@ -61,6 +61,8 @@ import org.openstreetmap.josm.tools.ImageOverlay;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
 import org.openstreetmap.josm.tools.LanguageInfo;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
+import org.openstreetmap.josm.tools.bugreport.ReportedException;
 
 /**
  * basic gui utils
@@ -134,7 +136,7 @@ public final class GuiHelper {
      * <a href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html">Event Dispatch Thread</a>.
      * <p>
      * Passes on the exception that was thrown to the thread calling this.
-     * The exception is wrapped in a {@link RuntimeException} if it was a normal {@link Throwable}.
+     * The exception is wrapped using a {@link ReportedException}.
      * @param task The runnable to execute
      * @see SwingUtilities#invokeAndWait
      * @since 10271
@@ -145,14 +147,8 @@ public final class GuiHelper {
         } else {
             try {
                 SwingUtilities.invokeAndWait(task);
-            } catch (InterruptedException e) {
-                Main.error(e);
-            } catch (InvocationTargetException e) {
-                if (e.getCause() instanceof RuntimeException) {
-                    throw (RuntimeException) e.getCause();
-                } else {
-                    throw new RuntimeException("Exception while calling " + task, e.getCause());
-                }
+            } catch (InterruptedException | InvocationTargetException e) {
+                throw BugReport.intercept(e).put("task", task);
             }
         }
     }
@@ -477,10 +473,9 @@ public final class GuiHelper {
      * This method returns always 800x600 in headless mode (useful for unit tests).
      * @return the size of maximum screen, in pixels, or 800x600
      * @see Toolkit#getScreenSize
-     * @since 9576
+     * @since 10470
      */
-
-    public static Dimension getMaxiumScreenSize() {
+    public static Dimension getMaximumScreenSize() {
         if (GraphicsEnvironment.isHeadless()) {
             return new Dimension(800, 600);
         }
@@ -489,8 +484,10 @@ public final class GuiHelper {
         int width = 0;
         for (GraphicsDevice gd: GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
             DisplayMode dm = gd.getDisplayMode();
-            height = Math.max(height, dm.getHeight());
-            width = Math.max(width, dm.getWidth());
+            if (dm != null) {
+                height = Math.max(height, dm.getHeight());
+                width = Math.max(width, dm.getWidth());
+            }
         }
         if (height == 0 || width == 0) {
             return new Dimension(800, 600);
@@ -581,9 +578,7 @@ public final class GuiHelper {
         try {
             return JOptionPane.getFrameForComponent(parentComponent);
         } catch (HeadlessException e) {
-            if (Main.isDebugEnabled()) {
-                Main.debug(e.getMessage());
-            }
+            Main.debug(e);
             return null;
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/util/GuiSizesHelper.java b/src/org/openstreetmap/josm/gui/util/GuiSizesHelper.java
new file mode 100644
index 0000000..dc3934b
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/util/GuiSizesHelper.java
@@ -0,0 +1,115 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.awt.Dimension;
+import java.awt.GraphicsEnvironment;
+import java.awt.Toolkit;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * Support class to handle size information of Gui elements
+ * This is needed, because display resolution may vary a lot and a common set
+ * of sizes wont work for all users alike.
+ * @since 10358
+ */
+public final class GuiSizesHelper {
+
+    private GuiSizesHelper() {
+        // Hide default constructor for utils classes
+    }
+
+    /** cache value for screen resolution */
+    private static float screenDPI = -1;
+
+    /**
+     * Request the screen resolution (cached)
+     * @return screen resolution in DPI
+     */
+    private static float getScreenDPI() {
+        if (screenDPI == -1) {
+            synchronized (GuiHelper.class) {
+                if (screenDPI == -1) {
+                    float scalePref = (float) Main.pref.getDouble("gui.scale", 1.0);
+                    if (scalePref != 0) {
+                        screenDPI = 96f * scalePref;
+                    } else {
+                        if (!GraphicsEnvironment.isHeadless()) {
+                            screenDPI = Toolkit.getDefaultToolkit().getScreenResolution();
+                        } else {
+                            screenDPI = 96;
+                        }
+                    }
+                }
+            }
+        }
+        return screenDPI;
+    }
+
+    /**
+     * Returns coefficient of monitor pixel density. All hardcoded sizes must be multiplied by this value.
+     *
+     * @return float value. 1 - means standard monitor, 2 and high - "retina" display.
+     */
+    public static float getPixelDensity() {
+        return getScreenDPI() / 96f;
+    }
+
+    /**
+     * Check if a high DPI resolution is used
+     * @return <code>true</code> for HIDPI screens
+     */
+    public static boolean isHiDPI() {
+        return getPixelDensity() >= 2f;
+    }
+
+    /**
+     * Returns a resolution adapted size
+     * @param size Size value to adapt (base size is a low DPI screen)
+     * @return adapted size (may be unmodified)
+     */
+    public static int getSizeDpiAdjusted(int size) {
+        if (size <= 0) return size;
+        return Math.round(size * getScreenDPI() / 96);
+    }
+
+    /**
+     * Returns a resolution adapted size
+     * @param size Size value to adapt (base size is a low DPI screen)
+     * @return adapted size (may be unmodified)
+     */
+    public static float getSizeDpiAdjusted(float size) {
+        if (size <= 0f) return size;
+        return size * getScreenDPI() / 96;
+    }
+
+    /**
+     * Returns a resolution adapted size
+     * @param size Size value to adapt (base size is a low DPI screen)
+     * @return adapted size (may be unmodified)
+     */
+    public static double getSizeDpiAdjusted(double size) {
+        if (size <= 0d) return size;
+        return size * getScreenDPI() / 96;
+    }
+
+    /**
+     * Returns a resolution adapted Dimension
+     * @param dim Dimension value to adapt (base size is a low DPI screen)
+     * @return adapted dimension (may be unmodified)
+     */
+    public static Dimension getDimensionDpiAdjusted(Dimension dim) {
+        float pixelPerInch = getScreenDPI();
+        int width = dim.width;
+        int height = dim.height;
+        if (dim.width > 0) {
+            width = Math.round(dim.width * pixelPerInch / 96);
+        }
+
+        if (dim.height > 0) {
+            height = Math.round(dim.height * pixelPerInch / 96);
+        }
+
+        return new Dimension(width, height);
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/util/HighlightHelper.java b/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
index 151570a..a6d0337 100644
--- a/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
+++ b/src/org/openstreetmap/josm/gui/util/HighlightHelper.java
@@ -121,7 +121,7 @@ public class HighlightHelper {
      * Slow method to import all currently highlighted primitives into this instance
      */
     public void findAllHighlighted() {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds != null) {
             highlightedPrimitives.addAll(ds.allNonDeletedPrimitives());
         }
@@ -131,7 +131,7 @@ public class HighlightHelper {
      * Slow method to remove highlights from all primitives
      */
     public static void clearAllHighlighted() {
-        DataSet ds = Main.main.getCurrentDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
         if (ds != null) {
             for (OsmPrimitive p: ds.allNonDeletedPrimitives()) {
                 p.setHighlighted(false);
diff --git a/src/org/openstreetmap/josm/gui/widgets/AbstractTextComponentValidator.java b/src/org/openstreetmap/josm/gui/widgets/AbstractTextComponentValidator.java
index a120eab..344db9d 100644
--- a/src/org/openstreetmap/josm/gui/widgets/AbstractTextComponentValidator.java
+++ b/src/org/openstreetmap/josm/gui/widgets/AbstractTextComponentValidator.java
@@ -33,7 +33,7 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
  */
 public abstract class AbstractTextComponentValidator implements ActionListener, FocusListener, DocumentListener, PropertyChangeListener {
     private static final Border ERROR_BORDER = BorderFactory.createLineBorder(Color.RED, 1);
-    private static final Color ERROR_BACKGROUND =  new Color(255, 224, 224);
+    private static final Color ERROR_BACKGROUND = new Color(255, 224, 224);
 
     private JTextComponent tc;
     /** remembers whether the content of the text component is currently valid or not; null means,
diff --git a/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java b/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java
index 8812b43..5696a38 100644
--- a/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java
+++ b/src/org/openstreetmap/josm/gui/widgets/CompileSearchTextDecorator.java
@@ -8,6 +8,7 @@ import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.text.JTextComponent;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.search.SearchCompiler;
 
 /**
@@ -45,6 +46,7 @@ public final class CompileSearchTextDecorator implements DocumentListener {
             textComponent.setBackground(new Color(255, 224, 224));
             textComponent.setToolTipText(ex.getMessage());
             filter = SearchCompiler.Always.INSTANCE;
+            Main.debug(ex);
         }
         textComponent.firePropertyChange("filter", 0, 1);
     }
diff --git a/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java b/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
index 6f34c42..1105746 100644
--- a/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
+++ b/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
@@ -398,7 +398,7 @@ public class MultiSplitLayout implements LayoutManager {
                         : (splitChildBounds.getWidth() / totalWidth);
 
                 if (!splitChildren.hasNext()) {
-                    double newWidth =  Math.max(minSplitChildWidth, bounds.getMaxX() - x);
+                    double newWidth = Math.max(minSplitChildWidth, bounds.getMaxX() - x);
                     Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, newWidth);
                     layout2(splitChild, newSplitChildBounds);
                 } else if ((availableWidth > 0.0) && (splitChildWeight > 0.0)) {
@@ -445,7 +445,7 @@ public class MultiSplitLayout implements LayoutManager {
 
                 if (!splitChildren.hasNext()) {
                     double oldHeight = splitChildBounds.getHeight();
-                    double newHeight =  Math.max(minSplitChildHeight, bounds.getMaxY() - y);
+                    double newHeight = Math.max(minSplitChildHeight, bounds.getMaxY() - y);
                     Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, newHeight);
                     layout2(splitChild, newSplitChildBounds);
                     availableHeight -= (oldHeight - splitChild.getBounds().getHeight());
diff --git a/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java b/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
index cb6a029..8cd99c8 100644
--- a/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
+++ b/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
@@ -240,7 +240,7 @@ public class MultiSplitPane extends JPanel {
                 initialDividerBounds = divider.getBounds();
                 dragOffsetX = mx - initialDividerBounds.x;
                 dragOffsetY = my - initialDividerBounds.y;
-                dragDivider  = divider;
+                dragDivider = divider;
                 Rectangle prevNodeBounds = prevNode.getBounds();
                 Rectangle nextNodeBounds = nextNode.getBounds();
                 if (dragDivider.isVertical()) {
@@ -335,7 +335,7 @@ public class MultiSplitPane extends JPanel {
         if (show) {
             MultiSplitLayout.Divider divider = getMultiSplitLayout().dividerAt(x, y);
             if (divider != null) {
-                cursorID  = divider.isVertical() ?
+                cursorID = divider.isVertical() ?
                     Cursor.E_RESIZE_CURSOR :
                     Cursor.N_RESIZE_CURSOR;
             }
diff --git a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
index 0444101..c66b7dd 100644
--- a/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
+++ b/src/org/openstreetmap/josm/gui/widgets/OsmPrimitivesTable.java
@@ -9,9 +9,9 @@ import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
 import javax.swing.table.TableColumnModel;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ZoomToAction;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 /**
@@ -82,14 +82,28 @@ public abstract class OsmPrimitivesTable extends JosmTable {
     protected JPopupMenu buildPopupMenu() {
         JPopupMenu menu = new JPopupMenu();
         zoomToAction = buildZoomToAction();
-        MapView.addLayerChangeListener(zoomToAction);
         getSelectionModel().addListSelectionListener(zoomToAction);
         menu.add(zoomToAction);
         return menu;
     }
 
-    public void unlinkAsListener() {
-        MapView.removeLayerChangeListener(zoomToAction);
+    /**
+     * Adds all registered listeners by this table
+     * @see #unregisterListeners()
+     * @since 10454
+     */
+    public void registerListeners() {
+        Main.getLayerManager().addLayerChangeListener(zoomToAction);
+        Main.getLayerManager().addActiveLayerChangeListener(zoomToAction);
+    }
+
+    /**
+     * Removes all registered listeners by this table
+     * @since 10454
+     */
+    public void unregisterListeners() {
+        Main.getLayerManager().removeLayerChangeListener(zoomToAction);
+        Main.getLayerManager().removeActiveLayerChangeListener(zoomToAction);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java b/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
index 7a94a1f..040cc44 100644
--- a/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
+++ b/src/org/openstreetmap/josm/gui/widgets/TextContextualPopupMenu.java
@@ -173,13 +173,13 @@ public class TextContextualPopupMenu extends JPopupMenu {
         return component != null;
     }
 
-    protected void addMenuEntry(JTextComponent component,  String label, String actionName, String iconName) {
+    protected void addMenuEntry(JTextComponent component, String label, String actionName, String iconName) {
         Action action = component.getActionMap().get(actionName);
         if (action != null) {
             JMenuItem mi = new JMenuItem(action);
             mi.setText(label);
             if (iconName != null && Main.pref.getBoolean("text.popupmenu.useicons", true)) {
-                ImageIcon icon = new ImageProvider(iconName).setWidth(16).get();
+                ImageIcon icon = ImageProvider.get(iconName, ImageProvider.ImageSizes.SMALLICON);
                 if (icon != null) {
                     mi.setIcon(icon);
                 }
diff --git a/src/org/openstreetmap/josm/io/AllFormatsImporter.java b/src/org/openstreetmap/josm/io/AllFormatsImporter.java
index 4f77838..1bf9c03 100644
--- a/src/org/openstreetmap/josm/io/AllFormatsImporter.java
+++ b/src/org/openstreetmap/josm/io/AllFormatsImporter.java
@@ -30,7 +30,7 @@ public class AllFormatsImporter extends FileImporter {
      * @return String comma separated list of supported file extensions
      */
     private static String getAllExtensions() {
-        Iterator<FileImporter> imp = ExtensionFileFilter.importers.iterator();
+        Iterator<FileImporter> imp = ExtensionFileFilter.getImporters().iterator();
         StringBuilder ext = new StringBuilder();
         while (imp.hasNext()) {
             FileImporter fi = imp.next();
diff --git a/src/org/openstreetmap/josm/io/Capabilities.java b/src/org/openstreetmap/josm/io/Capabilities.java
index 3dfa931..5f33f5b 100644
--- a/src/org/openstreetmap/josm/io/Capabilities.java
+++ b/src/org/openstreetmap/josm/io/Capabilities.java
@@ -130,7 +130,7 @@ public class Capabilities {
                 imageryBlacklist.add(value);
             }
         } else {
-            if (!capabilities.containsKey(element))  {
+            if (!capabilities.containsKey(element)) {
                 Map<String, String> h = new HashMap<>();
                 capabilities.put(element, h);
             }
diff --git a/src/org/openstreetmap/josm/io/ChangesetQuery.java b/src/org/openstreetmap/josm/io/ChangesetQuery.java
index 24fa9ad..1fbc8b2 100644
--- a/src/org/openstreetmap/josm/io/ChangesetQuery.java
+++ b/src/org/openstreetmap/josm/io/ChangesetQuery.java
@@ -156,7 +156,7 @@ public class ChangesetQuery {
     public ChangesetQuery inBbox(LatLon min, LatLon max) {
         CheckParameterUtil.ensureParameterNotNull(min, "min");
         CheckParameterUtil.ensureParameterNotNull(max, "max");
-        this.bounds  = new Bounds(min, max);
+        this.bounds = new Bounds(min, max);
         return this;
     }
 
@@ -214,7 +214,7 @@ public class ChangesetQuery {
      * @return the restricted changeset query
      */
     public ChangesetQuery beingOpen(boolean isOpen) {
-        this.open =  isOpen;
+        this.open = isOpen;
         return this;
     }
 
@@ -473,7 +473,7 @@ public class ChangesetQuery {
         }
 
         protected Map<String, String> createMapFromQueryString(String query) {
-            Map<String, String> queryParams  = new HashMap<>();
+            Map<String, String> queryParams = new HashMap<>();
             String[] keyValuePairs = query.split("&");
             for (String keyValuePair: keyValuePairs) {
                 String[] kv = keyValuePair.split("=");
diff --git a/src/org/openstreetmap/josm/io/DefaultProxySelector.java b/src/org/openstreetmap/josm/io/DefaultProxySelector.java
index ad615a6..a608d07 100644
--- a/src/org/openstreetmap/josm/io/DefaultProxySelector.java
+++ b/src/org/openstreetmap/josm/io/DefaultProxySelector.java
@@ -96,7 +96,7 @@ public class DefaultProxySelector extends ProxySelector {
             Main.error(tr("The proxy will not be used."));
             return 0;
         }
-        if (port <= 0 || port >  65535) {
+        if (port <= 0 || port > 65535) {
             Main.error(tr("Illegal port number in preference ''{0}''. Got {1}.", property, port));
             Main.error(tr("The proxy will not be used."));
             return 0;
diff --git a/src/org/openstreetmap/josm/io/DiffResultProcessor.java b/src/org/openstreetmap/josm/io/DiffResultProcessor.java
index e0b1785..083cc96 100644
--- a/src/org/openstreetmap/josm/io/DiffResultProcessor.java
+++ b/src/org/openstreetmap/josm/io/DiffResultProcessor.java
@@ -31,7 +31,7 @@ import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
-public class DiffResultProcessor  {
+public class DiffResultProcessor {
 
     private static class DiffResultEntry {
         private long newId;
@@ -75,7 +75,7 @@ public class DiffResultProcessor  {
      * @throws XmlParsingException if the diffUploadRequest can't be parsed successfully
      *
      */
-    public  void parse(String diffUploadResponse, ProgressMonitor progressMonitor) throws XmlParsingException {
+    public void parse(String diffUploadResponse, ProgressMonitor progressMonitor) throws XmlParsingException {
         if (progressMonitor == null) {
             progressMonitor = NullProgressMonitor.INSTANCE;
         }
@@ -167,7 +167,7 @@ public class DiffResultProcessor  {
                 case "node":
                 case "way":
                 case "relation":
-                    PrimitiveId id  = new SimplePrimitiveId(
+                    PrimitiveId id = new SimplePrimitiveId(
                             Long.parseLong(atts.getValue("old_id")),
                             OsmPrimitiveType.fromApiTypeName(qName)
                     );
diff --git a/src/org/openstreetmap/josm/io/FileExporter.java b/src/org/openstreetmap/josm/io/FileExporter.java
index 7191b92..fd8e09d 100644
--- a/src/org/openstreetmap/josm/io/FileExporter.java
+++ b/src/org/openstreetmap/josm/io/FileExporter.java
@@ -7,10 +7,11 @@ import java.io.File;
 import java.io.IOException;
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 
-public abstract class FileExporter implements LayerChangeListener {
+public abstract class FileExporter implements ActiveLayerChangeListener {
 
     public final ExtensionFileFilter filter;
 
@@ -53,20 +54,10 @@ public abstract class FileExporter implements LayerChangeListener {
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
         // To be overriden by subclasses if their enabled state depends of the active layer nature
     }
 
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // To be overriden by subclasses if needed
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // To be overriden by subclasses if needed
-    }
-
     /**
      * Determines if this exporter has been canceled during export.
      * @return true if this {@code FileExporter} has been canceled
diff --git a/src/org/openstreetmap/josm/io/FileImporter.java b/src/org/openstreetmap/josm/io/FileImporter.java
index 4be7f44..d550fe0 100644
--- a/src/org/openstreetmap/josm/io/FileImporter.java
+++ b/src/org/openstreetmap/josm/io/FileImporter.java
@@ -12,17 +12,16 @@ import javax.swing.JOptionPane;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
 import org.openstreetmap.josm.gui.Notification;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 
 /**
  * Abstract file importer.
  * @since 1637
+ * @since 10386 (signature)
  */
-public abstract class FileImporter implements Comparable<FileImporter>, LayerChangeListener {
+public abstract class FileImporter implements Comparable<FileImporter> {
 
     /**
      * The extension file filter used to accept files.
@@ -181,19 +180,4 @@ public abstract class FileImporter implements Comparable<FileImporter>, LayerCha
     public final void setEnabled(boolean enabled) {
         this.enabled = enabled;
     }
-
-    @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // To be overriden by subclasses if their enabled state depends of the active layer nature
-    }
-
-    @Override
-    public void layerAdded(Layer newLayer) {
-        // To be overriden by subclasses if needed
-    }
-
-    @Override
-    public void layerRemoved(Layer oldLayer) {
-        // To be overriden by subclasses if needed
-    }
 }
diff --git a/src/org/openstreetmap/josm/io/GpxExporter.java b/src/org/openstreetmap/josm/io/GpxExporter.java
index 0825eee..cd2af35 100644
--- a/src/org/openstreetmap/josm/io/GpxExporter.java
+++ b/src/org/openstreetmap/josm/io/GpxExporter.java
@@ -171,7 +171,7 @@ public class GpxExporter extends FileExporter implements GpxConstants {
         } else if (layer instanceof GpxLayer) {
             gpxData = ((GpxLayer) layer).data;
         } else {
-            gpxData = OsmDataLayer.toGpxData(Main.main.getCurrentDataSet(), file);
+            gpxData = OsmDataLayer.toGpxData(Main.getLayerManager().getEditDataSet(), file);
         }
 
         // add author and copyright details to the gpx data
diff --git a/src/org/openstreetmap/josm/io/GpxImporter.java b/src/org/openstreetmap/josm/io/GpxImporter.java
index e0b8f37..e56044a 100644
--- a/src/org/openstreetmap/josm/io/GpxImporter.java
+++ b/src/org/openstreetmap/josm/io/GpxImporter.java
@@ -120,10 +120,10 @@ public class GpxImporter extends FileImporter {
             @Override
             public void run() {
                 if (data.markerLayer != null) {
-                    Main.main.addLayer(data.markerLayer);
+                    Main.getLayerManager().addLayer(data.markerLayer);
                 }
                 if (data.gpxLayer != null) {
-                    Main.main.addLayer(data.gpxLayer);
+                    Main.getLayerManager().addLayer(data.gpxLayer);
                 }
                 data.postLayerTask.run();
             }
diff --git a/src/org/openstreetmap/josm/io/GpxReader.java b/src/org/openstreetmap/josm/io/GpxReader.java
index 42cb724..6bd30eb 100644
--- a/src/org/openstreetmap/josm/io/GpxReader.java
+++ b/src/org/openstreetmap/josm/io/GpxReader.java
@@ -503,7 +503,7 @@ public class GpxReader implements GpxConstants {
         }
 
         @Override
-        public void endDocument() throws SAXException  {
+        public void endDocument() throws SAXException {
             if (!states.empty())
                 throw new SAXException(tr("Parse error: invalid document structure for GPX document."));
             Extensions metaExt = (Extensions) data.get(META_EXTENSIONS);
diff --git a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
index 1b373e3..18c41c6 100644
--- a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
+++ b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
@@ -313,9 +313,11 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
         String msg;
         final String baseUrl = getBaseUrl();
         switch (type) {
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             case NODE:     msg = tr("Fetching a package of nodes from ''{0}''",     baseUrl); break;
             case WAY:      msg = tr("Fetching a package of ways from ''{0}''",      baseUrl); break;
             case RELATION: msg = tr("Fetching a package of relations from ''{0}''", baseUrl); break;
+            // CHECKSTYLE.ON: SingleSpaceSeparator
             default: throw new AssertionError();
         }
         progressMonitor.setTicksCount(ids.size());
@@ -583,9 +585,11 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
                 try {
                     String msg;
                     switch (type) {
+                        // CHECKSTYLE.OFF: SingleSpaceSeparator
                         case NODE:     msg = tr("Fetching node with id {0} from ''{1}''",     id, baseUrl); break;
                         case WAY:      msg = tr("Fetching way with id {0} from ''{1}''",      id, baseUrl); break;
                         case RELATION: msg = tr("Fetching relation with id {0} from ''{1}''", id, baseUrl); break;
+                        // CHECKSTYLE.ON: SingleSpaceSeparator
                         default: throw new AssertionError();
                     }
                     progressMonitor.setCustomText(msg);
diff --git a/src/org/openstreetmap/josm/io/NMEAImporter.java b/src/org/openstreetmap/josm/io/NMEAImporter.java
index b6c22a1..ea3a390 100644
--- a/src/org/openstreetmap/josm/io/NMEAImporter.java
+++ b/src/org/openstreetmap/josm/io/NMEAImporter.java
@@ -52,11 +52,11 @@ public class NMEAImporter extends FileImporter {
                 GuiHelper.runInEDT(new Runnable() {
                     @Override
                     public void run() {
-                        Main.main.addLayer(gpxLayer);
+                        Main.getLayerManager().addLayer(gpxLayer);
                         if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
                             MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), fileFinal, gpxLayer);
                             if (!ml.data.isEmpty()) {
-                                Main.main.addLayer(ml);
+                                Main.getLayerManager().addLayer(ml);
                             }
                         }
                     }
diff --git a/src/org/openstreetmap/josm/io/NmeaReader.java b/src/org/openstreetmap/josm/io/NmeaReader.java
index 62179e6..a803059 100644
--- a/src/org/openstreetmap/josm/io/NmeaReader.java
+++ b/src/org/openstreetmap/josm/io/NmeaReader.java
@@ -19,6 +19,7 @@ import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
 import org.openstreetmap.josm.data.gpx.WayPoint;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
  * Reads a NMEA file. Based on information from
@@ -165,6 +166,8 @@ public class NmeaReader {
     }
 
     public NmeaReader(InputStream source) throws IOException {
+        rmcTimeFmt.setTimeZone(DateUtils.UTC);
+        rmcTimeFmtStd.setTimeZone(DateUtils.UTC);
 
         // create the data tree
         data = new GpxData();
diff --git a/src/org/openstreetmap/josm/io/NoteImporter.java b/src/org/openstreetmap/josm/io/NoteImporter.java
index 8ac259e..af84702 100644
--- a/src/org/openstreetmap/josm/io/NoteImporter.java
+++ b/src/org/openstreetmap/josm/io/NoteImporter.java
@@ -13,7 +13,6 @@ import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.gui.layer.NoteLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.xml.sax.SAXException;
 
 /**
@@ -37,13 +36,8 @@ public class NoteImporter extends FileImporter {
         }
         try (InputStream is = Compression.getUncompressedFileInputStream(file)) {
             final NoteLayer layer = loadLayer(is, file, file.getName(), progressMonitor);
-            if (Main.map == null || !Main.map.mapView.hasLayer(layer)) {
-                GuiHelper.runInEDT(new Runnable() {
-                    @Override
-                    public void run() {
-                        Main.main.addLayer(layer);
-                    }
-                });
+            if (!Main.getLayerManager().containsLayer(layer)) {
+                Main.getLayerManager().addLayer(layer);
             }
         } catch (SAXException e) {
             Main.error("error opening up notes file");
@@ -68,7 +62,7 @@ public class NoteImporter extends FileImporter {
         final List<Note> fileNotes = new NoteReader(in).parse();
         List<NoteLayer> noteLayers = null;
         if (Main.map != null) {
-            noteLayers = Main.map.mapView.getLayersOfType(NoteLayer.class);
+            noteLayers = Main.getLayerManager().getLayersOfType(NoteLayer.class);
         }
         final NoteLayer layer;
         if (noteLayers != null && !noteLayers.isEmpty()) {
diff --git a/src/org/openstreetmap/josm/io/NoteReader.java b/src/org/openstreetmap/josm/io/NoteReader.java
index b6c5c42..94e6a9a 100644
--- a/src/org/openstreetmap/josm/io/NoteReader.java
+++ b/src/org/openstreetmap/josm/io/NoteReader.java
@@ -193,7 +193,7 @@ public class NoteReader {
         }
 
         @Override
-        public void endDocument() throws SAXException  {
+        public void endDocument() throws SAXException {
             parsedNotes = notes;
         }
     }
diff --git a/src/org/openstreetmap/josm/io/OsmApi.java b/src/org/openstreetmap/josm/io/OsmApi.java
index d661461..e04cbc1 100644
--- a/src/org/openstreetmap/josm/io/OsmApi.java
+++ b/src/org/openstreetmap/josm/io/OsmApi.java
@@ -89,11 +89,15 @@ public class OsmApi extends OsmConnection {
         OsmApi api = instances.get(serverUrl);
         if (api == null) {
             api = new OsmApi(serverUrl);
-            instances.put(serverUrl, api);
+            cacheInstance(api);
         }
         return api;
     }
 
+    protected static void cacheInstance(OsmApi api) {
+        instances.put(api.getServerUrl(), api);
+    }
+
     private static String getServerUrlFromPref() {
         return Main.pref.get("osm-server.url", DEFAULT_API_URL);
     }
@@ -128,7 +132,7 @@ public class OsmApi extends OsmConnection {
      * @param serverUrl the server URL. Must not be null
      * @throws IllegalArgumentException if serverUrl is null
      */
-    protected OsmApi(String serverUrl)  {
+    protected OsmApi(String serverUrl) {
         CheckParameterUtil.ensureParameterNotNull(serverUrl, "serverUrl");
         this.serverUrl = serverUrl;
     }
@@ -248,10 +252,10 @@ public class OsmApi extends OsmConnection {
              * to load the layers in the first place because they would have
              * been disabled! */
             if (Main.isDisplayingMapView()) {
-                for (Layer l : Main.map.mapView.getLayersOfType(ImageryLayer.class)) {
+                for (Layer l : Main.getLayerManager().getLayersOfType(ImageryLayer.class)) {
                     if (((ImageryLayer) l).getInfo().isBlacklisted()) {
                         Main.info(tr("Removed layer {0} because it is not allowed by the configured API.", l.getName()));
-                        Main.main.removeLayer(l);
+                        Main.getLayerManager().removeLayer(l);
                     }
                 }
             }
diff --git a/src/org/openstreetmap/josm/io/OsmChangeImporter.java b/src/org/openstreetmap/josm/io/OsmChangeImporter.java
index 1e24835..d5cdef7 100644
--- a/src/org/openstreetmap/josm/io/OsmChangeImporter.java
+++ b/src/org/openstreetmap/josm/io/OsmChangeImporter.java
@@ -43,7 +43,7 @@ public class OsmChangeImporter extends FileImporter {
         }
     }
 
-    protected void importData(InputStream in, final File associatedFile, ProgressMonitor  progressMonitor) throws IllegalDataException {
+    protected void importData(InputStream in, final File associatedFile, ProgressMonitor progressMonitor) throws IllegalDataException {
         final DataSet dataSet = OsmChangeReader.parseDataSet(in, progressMonitor);
         final OsmDataLayer layer = new OsmDataLayer(dataSet, associatedFile.getName(), associatedFile);
         addDataLayer(dataSet, layer, associatedFile.getPath());
@@ -62,7 +62,7 @@ public class OsmChangeImporter extends FileImporter {
                             tr("Open OsmChange file"),
                             JOptionPane.INFORMATION_MESSAGE);
                 }
-                Main.main.addLayer(layer);
+                Main.getLayerManager().addLayer(layer);
                 layer.onPostLoadFromFile();
             }
         });
diff --git a/src/org/openstreetmap/josm/io/OsmHistoryReader.java b/src/org/openstreetmap/josm/io/OsmHistoryReader.java
index 545cc2e..1213b85 100644
--- a/src/org/openstreetmap/josm/io/OsmHistoryReader.java
+++ b/src/org/openstreetmap/josm/io/OsmHistoryReader.java
@@ -39,7 +39,8 @@ public class OsmHistoryReader {
         protected String getCurrentPosition() {
             if (locator == null)
                 return "";
-            return "(" + locator.getLineNumber() + ',' + locator.getColumnNumber() + ')';
+            return new StringBuilder().append('(').append(locator.getLineNumber())
+                                      .append(',').append(locator.getColumnNumber()).append(')').toString();
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/io/OsmImporter.java b/src/org/openstreetmap/josm/io/OsmImporter.java
index 92857ba..1d504fd 100644
--- a/src/org/openstreetmap/josm/io/OsmImporter.java
+++ b/src/org/openstreetmap/josm/io/OsmImporter.java
@@ -14,7 +14,6 @@ import javax.swing.JOptionPane;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -96,12 +95,7 @@ public class OsmImporter extends FileImporter {
             @Override
             public void run() {
                 OsmDataLayer layer = data.getLayer();
-                BoundingXYVisitor v = new BoundingXYVisitor();
-                v.visit(layer.data.getDataSourceBoundingBox());
-                if (!v.hasExtend()) {
-                    v.computeBoundingBox(layer.data.getNodes());
-                }
-                Main.main.addLayer(layer, v.getBounds());
+                Main.getLayerManager().addLayer(layer);
                 data.getPostLayerTask().run();
                 data.getLayer().onPostLoadFromFile();
             }
diff --git a/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java b/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
index 78168f1..434bf26 100644
--- a/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
@@ -97,7 +97,7 @@ public class OsmServerBackreferenceReader extends OsmServerReader {
      * @throws IllegalArgumentException if id <= 0
      * @throws IllegalArgumentException if type is null
      */
-    public OsmServerBackreferenceReader(long id, OsmPrimitiveType type, boolean readFull)  {
+    public OsmServerBackreferenceReader(long id, OsmPrimitiveType type, boolean readFull) {
         this(id, type);
         this.readFull = readFull;
     }
@@ -201,7 +201,7 @@ public class OsmServerBackreferenceReader extends OsmServerReader {
                 }
             }
             if (isReadFull()) {
-                Collection<Relation> relationsToCheck  = new ArrayList<>(ds.getRelations());
+                Collection<Relation> relationsToCheck = new ArrayList<>(ds.getRelations());
                 for (Relation relation: relationsToCheck) {
                     if (!relation.isNew() && relation.hasIncompleteMembers()) {
                         OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.from(relation), true);
diff --git a/src/org/openstreetmap/josm/io/OsmServerReader.java b/src/org/openstreetmap/josm/io/OsmServerReader.java
index e0fb7df..124733b 100644
--- a/src/org/openstreetmap/josm/io/OsmServerReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerReader.java
@@ -40,7 +40,7 @@ public abstract class OsmServerReader extends OsmConnection {
      * @return A reader reading the input stream (servers answer) or <code>null</code>.
      * @throws OsmTransferException if data transfer errors occur
      */
-    protected InputStream getInputStream(String urlStr, ProgressMonitor progressMonitor) throws OsmTransferException  {
+    protected InputStream getInputStream(String urlStr, ProgressMonitor progressMonitor) throws OsmTransferException {
         return getInputStream(urlStr, progressMonitor, null);
     }
 
@@ -54,7 +54,7 @@ public abstract class OsmServerReader extends OsmConnection {
      * @return A reader reading the input stream (servers answer) or <code>null</code>.
      * @throws OsmTransferException if data transfer errors occur
      */
-    protected InputStream getInputStream(String urlStr, ProgressMonitor progressMonitor, String reason) throws OsmTransferException  {
+    protected InputStream getInputStream(String urlStr, ProgressMonitor progressMonitor, String reason) throws OsmTransferException {
         try {
             api.initialize(progressMonitor);
             String url = urlStr.startsWith("http") ? urlStr : (getBaseUrl() + urlStr);
@@ -159,12 +159,7 @@ public abstract class OsmServerReader extends OsmConnection {
 
                 if (response.getResponseCode() != HttpURLConnection.HTTP_OK) {
                     String errorHeader = response.getHeaderField("Error");
-                    String errorBody;
-                    try {
-                        errorBody = response.fetchContent();
-                    } catch (IOException e) {
-                        errorBody = tr("Reading error text failed.");
-                    }
+                    String errorBody = fetchResponseText(response);
                     throw new OsmApiException(response.getResponseCode(), errorHeader, errorBody, url.toString());
                 }
 
@@ -180,6 +175,15 @@ public abstract class OsmServerReader extends OsmConnection {
         }
     }
 
+    private static String fetchResponseText(final HttpClient.Response response) {
+        try {
+            return response.fetchContent();
+        } catch (IOException e) {
+            Main.error(e);
+            return tr("Reading error text failed.");
+        }
+    }
+
     /**
      * Allows subclasses to modify the request.
      * @param request the prepared request
diff --git a/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java b/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
index 50aa2c9..5e6f663 100644
--- a/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
@@ -8,7 +8,6 @@ import java.io.InputStream;
 import java.util.LinkedList;
 import java.util.List;
 
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
@@ -19,6 +18,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.UserInfo;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.XmlParsingException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 import org.w3c.dom.Document;
@@ -174,9 +174,7 @@ public class OsmServerUserInfoReader extends OsmServerReader {
             monitor.beginTask("");
             monitor.indeterminateSubTask(tr("Reading user info ..."));
             try (InputStream in = getInputStream("user/details", monitor.createSubTaskMonitor(1, true), reason)) {
-                return buildFromXML(
-                        DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in)
-                );
+                return buildFromXML(Utils.parseSafeDOM(in));
             }
         } catch (OsmTransferException e) {
             throw e;
diff --git a/src/org/openstreetmap/josm/io/WMSLayerExporter.java b/src/org/openstreetmap/josm/io/WMSLayerExporter.java
index 15e765a..f1ca0cb 100644
--- a/src/org/openstreetmap/josm/io/WMSLayerExporter.java
+++ b/src/org/openstreetmap/josm/io/WMSLayerExporter.java
@@ -11,6 +11,7 @@ import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -43,11 +44,10 @@ public class WMSLayerExporter extends FileExporter {
                 oos.writeObject(Preferences.serializeStruct(entry, ImageryPreferenceEntry.class));
             }
         }
-
     }
 
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        setEnabled(newLayer instanceof AbstractTileSourceLayer);
+    public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+        setEnabled(e.getSource().getActiveLayer() instanceof AbstractTileSourceLayer);
     }
 }
diff --git a/src/org/openstreetmap/josm/io/WMSLayerImporter.java b/src/org/openstreetmap/josm/io/WMSLayerImporter.java
index 097406a..e875432 100644
--- a/src/org/openstreetmap/josm/io/WMSLayerImporter.java
+++ b/src/org/openstreetmap/josm/io/WMSLayerImporter.java
@@ -87,7 +87,7 @@ public class WMSLayerImporter extends FileImporter {
         GuiHelper.runInEDT(new Runnable() {
             @Override
             public void run() {
-                Main.main.addLayer(layer);
+                Main.getLayerManager().addLayer(layer);
                 if (zoomTo != null) {
                     Main.map.mapView.zoomTo(zoomTo);
                 }
diff --git a/src/org/openstreetmap/josm/io/auth/AbstractCredentialsAgent.java b/src/org/openstreetmap/josm/io/auth/AbstractCredentialsAgent.java
index 42c98c9..a86bd5c 100644
--- a/src/org/openstreetmap/josm/io/auth/AbstractCredentialsAgent.java
+++ b/src/org/openstreetmap/josm/io/auth/AbstractCredentialsAgent.java
@@ -19,7 +19,7 @@ public abstract class AbstractCredentialsAgent implements CredentialsAgent {
             throws CredentialsAgentException {
         if (requestorType == null)
             return null;
-        PasswordAuthentication credentials =  lookup(requestorType, host);
+        PasswordAuthentication credentials = lookup(requestorType, host);
         final String username = (credentials == null || credentials.getUserName() == null) ? "" : credentials.getUserName();
         final String password = (credentials == null || credentials.getPassword() == null) ? "" : String.valueOf(credentials.getPassword());
 
diff --git a/src/org/openstreetmap/josm/io/imagery/WMSImagery.java b/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
index 7ecd654..d4c500e 100644
--- a/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
+++ b/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
@@ -17,7 +17,6 @@ import java.util.regex.Pattern;
 
 import javax.imageio.ImageIO;
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.openstreetmap.josm.Main;
@@ -40,11 +39,31 @@ public class WMSImagery {
     public static class WMSGetCapabilitiesException extends Exception {
         private final String incomingData;
 
+        /**
+         * Constructs a new {@code WMSGetCapabilitiesException}
+         * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method)
+         * @param incomingData the answer from WMS server
+         */
         public WMSGetCapabilitiesException(Throwable cause, String incomingData) {
             super(cause);
             this.incomingData = incomingData;
         }
 
+        /**
+         * Constructs a new {@code WMSGetCapabilitiesException}
+         * @param message   the detail message. The detail message is saved for later retrieval by the {@link #getMessage()} method
+         * @param incomingData the answer from the server
+         * @since 10520
+         */
+        public WMSGetCapabilitiesException(String message, String incomingData) {
+            super(message);
+            this.incomingData = incomingData;
+        }
+
+        /**
+         * Returns the answer from WMS server.
+         * @return the answer from WMS server
+         */
         public String getIncomingData() {
             return incomingData;
         }
@@ -151,10 +170,7 @@ public class WMSImagery {
         Main.debug(incomingData);
 
         try {
-            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-            builderFactory.setValidating(false);
-            builderFactory.setNamespaceAware(true);
-            DocumentBuilder builder = builderFactory.newDocumentBuilder();
+            DocumentBuilder builder = Utils.newSafeDOMBuilder();
             builder.setEntityResolver(new EntityResolver() {
                 @Override
                 public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
@@ -163,9 +179,15 @@ public class WMSImagery {
                 }
             });
             Document document = builder.parse(new InputSource(new StringReader(incomingData)));
+            Element root = document.getDocumentElement();
+
+            // Check if the request resulted in ServiceException
+            if ("ServiceException".equals(root.getTagName())) {
+                throw new WMSGetCapabilitiesException(root.getTextContent(), incomingData);
+            }
 
             // Some WMS service URLs specify a different base URL for their GetMap service
-            Element child = getChild(document.getDocumentElement(), "Capability");
+            Element child = getChild(root, "Capability");
             child = getChild(child, "Request");
             child = getChild(child, "GetMap");
 
@@ -200,7 +222,7 @@ public class WMSImagery {
                 }
             }
 
-            Element capabilityElem = getChild(document.getDocumentElement(), "Capability");
+            Element capabilityElem = getChild(root, "Capability");
             List<Element> children = getChildren(capabilityElem, "Layer");
             layers = parseLayers(children, new HashSet<String>());
         } catch (MalformedURLException | ParserConfigurationException | SAXException e) {
@@ -330,9 +352,11 @@ public class WMSImagery {
 
     private static List<Element> getChildren(Element parent, String name) {
         List<Element> retVal = new ArrayList<>();
-        for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
-            if (child instanceof Element && name.equals(child.getNodeName())) {
-                retVal.add((Element) child);
+        if (parent != null) {
+            for (Node child = parent.getFirstChild(); child != null; child = child.getNextSibling()) {
+                if (child instanceof Element && name.equals(child.getNodeName())) {
+                    retVal.add((Element) child);
+                }
             }
         }
         return retVal;
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
index 1e39e92..830cc32 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
@@ -149,7 +149,7 @@ public class AddTagsDialog extends ExtendedDialog {
             Boolean b = Boolean.TRUE;
             ExistingValues old = new ExistingValues(key);
             for (OsmPrimitive osm : sel) {
-                oldValue  = osm.get(key);
+                oldValue = osm.get(key);
                 if (oldValue != null) {
                     old.addValue(oldValue);
                     if (!oldValue.equals(value)) {
@@ -208,7 +208,7 @@ public class AddTagsDialog extends ExtendedDialog {
         propertyTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
         propertyTable.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_MASK), "shiftenter");
         propertyTable.getActionMap().put("shiftenter", new AbstractAction() {
-            @Override  public void actionPerformed(ActionEvent e) {
+            @Override public void actionPerformed(ActionEvent e) {
                 buttonAction(1, e); // add all tags on Shift-Enter
             }
         });
@@ -241,7 +241,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.main.getCurrentDataSet() != null  && buttonIndex != 2) {
+        if (Main.getLayerManager().getEditDataSet() != null && buttonIndex != 2) {
             TableModel tm = propertyTable.getModel();
             for (int i = 0; i < tm.getRowCount(); i++) {
                 if (buttonIndex == 1 || (Boolean) tm.getValueAt(i, 0)) {
@@ -303,7 +303,7 @@ public class AddTagsDialog extends ExtendedDialog {
      */
     public static void addTags(String[][] keyValue, String sender, Collection<? extends OsmPrimitive> primitives) {
         if (trustedSenders.contains(sender)) {
-            if (Main.main.getCurrentDataSet() != null) {
+            if (Main.getLayerManager().getEditDataSet() != null) {
                 for (String[] row : keyValue) {
                     Main.main.undoRedo.add(new ChangePropertyCommand(primitives, row[0], row[1]));
                 }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
index 19036cb..8d8dd68 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandler.java
@@ -101,7 +101,7 @@ public class AddNodeHandler extends RequestHandler {
             Main.main.undoRedo.add(new AddCommand(node));
         }
 
-        Main.main.getCurrentDataSet().setSelected(node);
+        Main.getLayerManager().getEditDataSet().setSelected(node);
         if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
             AutoScaleAction.autoScale("selection");
         } else {
@@ -119,7 +119,7 @@ public class AddNodeHandler extends RequestHandler {
         } catch (NumberFormatException e) {
             throw new RequestHandlerBadRequestException("NumberFormatException ("+e.getMessage()+')', e);
         }
-        if (!Main.main.hasEditLayer()) {
+        if (Main.getLayerManager().getEditLayer() == null) {
              throw new RequestHandlerBadRequestException(tr("There is no layer opened to add node"));
         }
     }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
index 217eac0..75488ac 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandler.java
@@ -113,7 +113,7 @@ public class AddWayHandler extends RequestHandler {
         } else if (allCoordinates.size() == 1) {
             throw new RequestHandlerBadRequestException(tr("One node ways"));
         }
-        if (!Main.main.hasEditLayer()) {
+        if (Main.getLayerManager().getEditLayer() == null) {
              throw new RequestHandlerBadRequestException(tr("There is no layer opened to add way"));
         }
     }
@@ -170,7 +170,7 @@ public class AddWayHandler extends RequestHandler {
         allCoordinates.clear();
         commands.add(new AddCommand(way));
         Main.main.undoRedo.add(new SequenceCommand(tr("Add way"), commands));
-        Main.main.getCurrentDataSet().setSelected(way);
+        Main.getLayerManager().getEditDataSet().setSelected(way);
         if (PermissionPrefWithDefault.CHANGE_VIEWPORT.isAllowed()) {
             AutoScaleAction.autoScale("selection");
         } else {
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
index d601f15..90ef687 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandler.java
@@ -94,7 +94,7 @@ public class ImageryHandler extends RequestHandler.RawURLParseRequestHandler {
     protected void handleRequest() throws RequestHandlerErrorException {
         final ImageryInfo imgInfo = buildImageryInfo();
         if (Main.isDisplayingMapView()) {
-            for (ImageryLayer layer : Main.map.mapView.getLayersOfType(ImageryLayer.class)) {
+            for (ImageryLayer layer : Main.getLayerManager().getLayersOfType(ImageryLayer.class)) {
                 if (layer.getInfo().equals(imgInfo)) {
                     Main.info("Imagery layer already exists: "+imgInfo);
                     return;
@@ -105,7 +105,7 @@ public class ImageryHandler extends RequestHandler.RawURLParseRequestHandler {
             @Override
             public void run() {
                 try {
-                    Main.main.addLayer(ImageryLayer.create(imgInfo));
+                    Main.getLayerManager().addLayer(ImageryLayer.create(imgInfo));
                 } catch (IllegalArgumentException e) {
                     Main.error(e, false);
                 }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
index 5fbeb91..30a07b0 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
@@ -118,7 +118,7 @@ public class LoadAndZoomHandler extends RequestHandler {
                     if (!newLayer) {
                         // find out whether some data has already been downloaded
                         Area present = null;
-                        DataSet ds = Main.main.getCurrentDataSet();
+                        DataSet ds = Main.getLayerManager().getEditDataSet();
                         if (ds != null) {
                             present = ds.getDataSourceArea();
                         }
@@ -157,7 +157,7 @@ public class LoadAndZoomHandler extends RequestHandler {
             GuiHelper.executeByMainWorkerInEDT(new Runnable() {
                 @Override
                 public void run() {
-                    DataSet ds = Main.main.getCurrentDataSet();
+                    DataSet ds = Main.getLayerManager().getEditDataSet();
                     if (ds == null) // e.g. download failed
                         return;
                     ds.clearSelection();
@@ -173,7 +173,7 @@ public class LoadAndZoomHandler extends RequestHandler {
                 @Override
                 public void run() {
                     Set<OsmPrimitive> newSel = new HashSet<>();
-                    DataSet ds = Main.main.getCurrentDataSet();
+                    DataSet ds = Main.getLayerManager().getEditDataSet();
                     if (ds == null) // e.g. download failed
                         return;
                     for (SimplePrimitiveId id : toSelect) {
@@ -199,7 +199,7 @@ public class LoadAndZoomHandler extends RequestHandler {
                 Main.worker.submit(new Runnable() {
                     @Override
                     public void run() {
-                        final DataSet ds = Main.main.getCurrentDataSet();
+                        final DataSet ds = Main.getLayerManager().getEditDataSet();
                         final Collection<OsmPrimitive> filteredPrimitives = Utils.filter(ds.allPrimitives(), search);
                         ds.setSelected(filteredPrimitives);
                         forTagAdd.addAll(filteredPrimitives);
@@ -220,12 +220,12 @@ public class LoadAndZoomHandler extends RequestHandler {
             Main.worker.submit(new Runnable() {
                 @Override
                 public void run() {
-                    if (Main.main.getCurrentDataSet() != null) {
+                    if (Main.getLayerManager().getEditDataSet() != null) {
                         if (args.containsKey("changeset_comment")) {
-                            Main.main.getCurrentDataSet().addChangeSetTag("comment", args.get("changeset_comment"));
+                            Main.getLayerManager().getEditDataSet().addChangeSetTag("comment", args.get("changeset_comment"));
                         }
                         if (args.containsKey("changeset_source")) {
-                            Main.main.getCurrentDataSet().addChangeSetTag("source", args.get("changeset_source"));
+                            Main.getLayerManager().getEditDataSet().addChangeSetTag("source", args.get("changeset_source"));
                         }
                     }
                 }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
index c1347d7..59f8c77 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
@@ -71,7 +71,7 @@ public class LoadObjectHandler extends RequestHandler {
                 @Override
                 public void run() {
                     final List<PrimitiveId> downloaded = task.getDownloadedId();
-                    final DataSet ds = Main.main.getCurrentDataSet();
+                    final DataSet ds = Main.getLayerManager().getEditDataSet();
                     if (downloaded != null) {
                         GuiHelper.runInEDT(new Runnable() {
                             @Override
diff --git a/src/org/openstreetmap/josm/io/session/GenericSessionExporter.java b/src/org/openstreetmap/josm/io/session/GenericSessionExporter.java
index aa3b09b..7a907df 100644
--- a/src/org/openstreetmap/josm/io/session/GenericSessionExporter.java
+++ b/src/org/openstreetmap/josm/io/session/GenericSessionExporter.java
@@ -73,7 +73,7 @@ public abstract class GenericSessionExporter<T extends Layer> extends AbstractSe
          * Constructs a new {@code LayerSaveAction}.
          */
         LayerSaveAction() {
-            putValue(SMALL_ICON, new ImageProvider("save").setWidth(16).get());
+            new ImageProvider("save").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, ((AbstractModifiableLayer) layer).requiresSaveToFile() ?
                     tr("Layer contains unsaved data - save to file.") :
                     tr("Layer does not contain unsaved data."));
diff --git a/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java b/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java
index fe34c07..838997d 100644
--- a/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java
+++ b/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java
@@ -43,7 +43,7 @@ public class MarkerSessionExporter extends AbstractSessionExporter<MarkerLayer>
     @Override
     public Collection<Layer> getDependencies() {
         Layer gpxLayer = layer.fromLayer;
-        if (gpxLayer != null && Main.map.mapView.hasLayer(gpxLayer))
+        if (gpxLayer != null && Main.getLayerManager().containsLayer(gpxLayer))
             return Collections.singleton(gpxLayer);
         return Collections.emptySet();
     }
diff --git a/src/org/openstreetmap/josm/io/session/SessionReader.java b/src/org/openstreetmap/josm/io/session/SessionReader.java
index 423c8d9..fac766a 100644
--- a/src/org/openstreetmap/josm/io/session/SessionReader.java
+++ b/src/org/openstreetmap/josm/io/session/SessionReader.java
@@ -28,8 +28,6 @@ import java.util.zip.ZipFile;
 
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.openstreetmap.josm.Main;
@@ -632,12 +630,7 @@ public class SessionReader {
         this.zip = zip;
 
         try {
-            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-            builderFactory.setValidating(false);
-            builderFactory.setNamespaceAware(true);
-            DocumentBuilder builder = builderFactory.newDocumentBuilder();
-            Document document = builder.parse(josIS);
-            parseJos(document, progressMonitor);
+            parseJos(Utils.parseSafeDOM(josIS), progressMonitor);
         } catch (SAXException e) {
             throw new IllegalDataException(e);
         } catch (ParserConfigurationException e) {
diff --git a/src/org/openstreetmap/josm/io/session/SessionWriter.java b/src/org/openstreetmap/josm/io/session/SessionWriter.java
index 158747a..5f002b1 100644
--- a/src/org/openstreetmap/josm/io/session/SessionWriter.java
+++ b/src/org/openstreetmap/josm/io/session/SessionWriter.java
@@ -18,7 +18,6 @@ import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
@@ -200,14 +199,11 @@ public class SessionWriter {
      * @throws IOException if any I/O error occurs
      */
     public Document createJosDocument() throws IOException {
-        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
-        builderFactory.setValidating(false);
-        builderFactory.setNamespaceAware(true);
         DocumentBuilder builder = null;
         try {
-            builder = builderFactory.newDocumentBuilder();
+            builder = Utils.newSafeDOMBuilder();
         } catch (ParserConfigurationException e) {
-            throw new RuntimeException(e);
+            throw new IOException(e);
         }
         Document doc = builder.newDocument();
 
diff --git a/src/org/openstreetmap/josm/plugins/PluginHandler.java b/src/org/openstreetmap/josm/plugins/PluginHandler.java
index a65c8cc..83c2f64 100644
--- a/src/org/openstreetmap/josm/plugins/PluginHandler.java
+++ b/src/org/openstreetmap/josm/plugins/PluginHandler.java
@@ -130,6 +130,7 @@ public final class PluginHandler {
             new DeprecatedPlugin("missingRoads", tr("replaced by new {0} plugin", "ImproveOsm")),
             new DeprecatedPlugin("trafficFlowDirection", tr("replaced by new {0} plugin", "ImproveOsm")),
             new DeprecatedPlugin("kendzi3d-jogl", tr("replaced by new {0} plugin", "jogl")),
+            new DeprecatedPlugin("josm-geojson", tr("replaced by new {0} plugin", "geojson")),
         });
     }
 
@@ -367,7 +368,7 @@ public final class PluginHandler {
                 )
                 + "</html>";
             togglePreferenceKey = "pluginmanager.version-based-update.policy";
-        }  else {
+        } else {
             long tim = System.currentTimeMillis();
             long last = Main.pref.getLong("pluginmanager.lastupdate", 0);
             Integer maxTime = Main.pref.getInteger("pluginmanager.time-based-update.interval", DEFAULT_TIME_BASED_UPDATE_INTERVAL);
@@ -724,7 +725,7 @@ public final class PluginHandler {
                 msg = tr("<html>Could not load plugin {0} because the plugin<br>main class ''{1}'' was not found.<br>"
                         + "Delete from preferences?</html>", plugin.name, plugin.className);
             }
-        }  catch (RuntimeException e) {
+        } catch (RuntimeException e) {
             pluginLoadingExceptions.put(plugin.name, e);
             Main.error(e);
         }
diff --git a/src/org/openstreetmap/josm/plugins/PluginInformation.java b/src/org/openstreetmap/josm/plugins/PluginInformation.java
index 1ae133c..8020335 100644
--- a/src/org/openstreetmap/josm/plugins/PluginInformation.java
+++ b/src/org/openstreetmap/josm/plugins/PluginInformation.java
@@ -3,8 +3,6 @@ package org.openstreetmap.josm.plugins;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Image;
-import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -76,15 +74,15 @@ public class PluginInformation {
     /** The plugin icon path inside jar. */
     public String iconPath;
     /** The plugin icon. */
-    public ImageIcon icon;
+    private ImageProvider icon;
     /** Plugin can be loaded at any time and not just at start. */
     public boolean canloadatruntime;
     /** The libraries referenced in Class-Path manifest attribute. */
     public List<URL> libraries = new LinkedList<>();
     /** All manifest attributes. */
     public final Map<String, String> attr = new TreeMap<>();
-
-    private static final ImageIcon emptyIcon = new ImageIcon(new BufferedImage(24, 24, BufferedImage.TYPE_INT_ARGB));
+    /** Empty icon for these plugins which have none */
+    private static final ImageIcon emptyIcon = ImageProvider.getEmpty(ImageProvider.ImageSizes.LARGEICON);
 
     /**
      * Creates a plugin information object by reading the plugin information from
@@ -243,9 +241,9 @@ public class PluginInformation {
         if (iconPath != null) {
             if (file != null) {
                 // extract icon from the plugin jar file
-                icon = new ImageProvider(iconPath).setArchive(file).setMaxWidth(24).setMaxHeight(24).setOptional(true).get();
+                icon = new ImageProvider(iconPath).setArchive(file).setMaxSize(ImageProvider.ImageSizes.LARGEICON).setOptional(true);
             } else if (iconPath.startsWith("data:")) {
-                icon = new ImageProvider(iconPath).setMaxWidth(24).setMaxHeight(24).setOptional(true).get();
+                icon = new ImageProvider(iconPath).setMaxSize(ImageProvider.ImageSizes.LARGEICON).setOptional(true);
             }
         }
         canloadatruntime = Boolean.parseBoolean(attr.getValue("Plugin-Canloadatruntime"));
@@ -493,13 +491,14 @@ public class PluginInformation {
     }
 
     /**
-     * Replies the plugin icon, scaled to 24x24 pixels.
-     * @return the plugin icon, scaled to 24x24 pixels.
+     * Replies the plugin icon, scaled to LARGE_ICON size.
+     * @return the plugin icon, scaled to LARGE_ICON size.
      */
     public ImageIcon getScaledIcon() {
-        if (icon == null)
+        ImageIcon img = (icon != null) ? icon.get() : null;
+        if (img == null)
             return emptyIcon;
-        return new ImageIcon(icon.getImage().getScaledInstance(24, 24, Image.SCALE_SMOOTH));
+        return img;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/tools/ColorScale.java b/src/org/openstreetmap/josm/tools/ColorScale.java
index f2e482c..45a9f19 100644
--- a/src/org/openstreetmap/josm/tools/ColorScale.java
+++ b/src/org/openstreetmap/josm/tools/ColorScale.java
@@ -36,10 +36,12 @@ public final class ColorScale {
 
     public static ColorScale createCyclicScale(int count) {
         ColorScale sc = new ColorScale();
-        //                    red   yellow  green   blue    red
-        int[] h = new int[] {0,    59,     127,    244,    360};
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        //                   red  yellow  green   blue    red
+        int[] h = new int[] {0,    59,     127,    244,   360};
         int[] s = new int[] {100,  84,     99,     100};
         int[] b = new int[] {90,   93,     74,     83};
+        // CHECKSTYLE.ON: SingleSpaceSeparator
 
         sc.colors = new Color[count];
         for (int i = 0; i < sc.colors.length; i++) {
@@ -165,7 +167,7 @@ public final class ColorScale {
         }
         for (int i = 0; i <= intervalCount; i++) {
             g.setColor(colors[(int) (1.0*i*n/intervalCount-1e-10)]);
-            final double val =  min+i*(max-min)/intervalCount;
+            final double val = min+i*(max-min)/intervalCount;
             final String txt = String.format("%.3f", val*valueScale);
             if (w < h) {
                 g.drawString(txt, x-fw-3, y+i*h/intervalCount+fh/2);
diff --git a/src/org/openstreetmap/josm/tools/Diff.java b/src/org/openstreetmap/josm/tools/Diff.java
index b7dad91..ba4afae 100644
--- a/src/org/openstreetmap/josm/tools/Diff.java
+++ b/src/org/openstreetmap/josm/tools/Diff.java
@@ -326,7 +326,7 @@ public class Diff {
 
     static class ReverseScript implements ScriptBuilder {
         @Override
-        public  Change build_script(
+        public Change build_script(
                 final boolean[] changed0, int len0,
                 final boolean[] changed1, int len1) {
             Change script = null;
@@ -827,25 +827,22 @@ public class Diff {
         /** Number of elements (lines) in this file. */
         private final int bufferedLines;
 
-        /** Vector, indexed by line number, containing an equivalence code for
-           each line.  It is this vector that is actually compared with that
-           of another file to generate differences. */
-        private final int[]     equivs;
+        /** Vector, indexed by line number, containing an equivalence code for each line.
+         * It is this vector that is actually compared with that of another file to generate differences. */
+        private final int[] equivs;
 
-        /** Vector, like the previous one except that
-           the elements for discarded lines have been squeezed out.  */
-        private final int[]    undiscarded;
+        /** Vector, like the previous one except that the elements for discarded lines have been squeezed out. */
+        private final int[] undiscarded;
 
-        /** Vector mapping virtual line numbers (not counting discarded lines)
-           to real ones (counting those lines).  Both are origin-0.  */
-        private final int[]    realindexes;
+        /** Vector mapping virtual line numbers (not counting discarded lines) to real ones (counting those lines).
+         * Both are origin-0.  */
+        private final int[] realindexes;
 
         /** Total number of nondiscarded lines. */
-        private int         nondiscardedLines;
+        private int nondiscardedLines;
 
-        /** Array, indexed by real origin-1 line number,
-           containing true for a line that is an insertion or a deletion.
-           The results of comparison are stored here.  */
-        private boolean[]       changedFlag;
+        /** Array, indexed by real origin-1 line number, containing true for a line that is an insertion or a deletion.
+           The results of comparison are stored here. */
+        private boolean[] changedFlag;
     }
 }
diff --git a/src/org/openstreetmap/josm/tools/ExifReader.java b/src/org/openstreetmap/josm/tools/ExifReader.java
index 9924d85..7f428db 100644
--- a/src/org/openstreetmap/josm/tools/ExifReader.java
+++ b/src/org/openstreetmap/josm/tools/ExifReader.java
@@ -178,7 +178,7 @@ public final class ExifReader {
         return null;
     }
 
-    private static double readAxis(GpsDirectory dirGps, int gpsTag, int gpsTagRef, char cRef) throws MetadataException  {
+    private static double readAxis(GpsDirectory dirGps, int gpsTag, int gpsTagRef, char cRef) throws MetadataException {
         double value;
         Rational[] components = dirGps.getRationalArray(gpsTag);
         if (components != null) {
@@ -204,8 +204,7 @@ public final class ExifReader {
     /**
      * Returns a Transform that fixes the image orientation.
      *
-     * Only orientation 1, 3, 6 and 8 are supported. Everything else is treated
-     * as 1.
+     * Only orientation 1, 3, 6 and 8 are supported. Everything else is treated as 1.
      * @param orientation the exif-orientation of the image
      * @param width the original width of the image
      * @param height the original height of the image
diff --git a/src/org/openstreetmap/josm/tools/Geometry.java b/src/org/openstreetmap/josm/tools/Geometry.java
index 99a636b..4e955e3 100644
--- a/src/org/openstreetmap/josm/tools/Geometry.java
+++ b/src/org/openstreetmap/josm/tools/Geometry.java
@@ -788,7 +788,7 @@ public final class Geometry {
         }
 
         BigDecimal d = new BigDecimal(3, MathContext.DECIMAL128); // 1/2 * 6 = 3
-        area  = area.multiply(d, MathContext.DECIMAL128);
+        area = area.multiply(d, MathContext.DECIMAL128);
         if (area.compareTo(BigDecimal.ZERO) != 0) {
             north = north.divide(area, MathContext.DECIMAL128);
             east = east.divide(area, MathContext.DECIMAL128);
diff --git a/src/org/openstreetmap/josm/tools/HttpClient.java b/src/org/openstreetmap/josm/tools/HttpClient.java
index 18dac82..c58bf02 100644
--- a/src/org/openstreetmap/josm/tools/HttpClient.java
+++ b/src/org/openstreetmap/josm/tools/HttpClient.java
@@ -261,6 +261,7 @@ public final class HttpClient {
             try {
                 in = connection.getInputStream();
             } catch (IOException ioe) {
+                Main.debug(ioe);
                 in = connection.getErrorStream();
             }
             if (in != null) {
diff --git a/src/org/openstreetmap/josm/tools/ImageProvider.java b/src/org/openstreetmap/josm/tools/ImageProvider.java
index 00f84ab..d46e495 100644
--- a/src/org/openstreetmap/josm/tools/ImageProvider.java
+++ b/src/org/openstreetmap/josm/tools/ImageProvider.java
@@ -68,6 +68,7 @@ import org.openstreetmap.josm.gui.mappaint.styleelement.NodeElement;
 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.gui.util.GuiSizesHelper;
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.w3c.dom.Element;
@@ -100,9 +101,11 @@ import com.kitfox.svg.SVGUniverse;
  */
 public class ImageProvider {
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
     private static final String HTTP_PROTOCOL  = "http://";
     private static final String HTTPS_PROTOCOL = "https://";
     private static final String WIKI_PROTOCOL  = "wiki://";
+    // CHECKSTYLE.ON: SingleSpaceSeparator
 
     /**
      * Position of an overlay icon
@@ -144,13 +147,13 @@ public class ImageProvider {
         /** cursor icon size */
         CURSOR(Main.pref.getInteger("iconsize.cursor", 32)),
         /** cursor overlay icon size */
-        CURSOROVERLAY(CURSOR.imageSize),
+        CURSOROVERLAY(CURSOR),
         /** menu icon size */
-        MENU(SMALLICON.imageSize),
+        MENU(SMALLICON),
         /** menu icon size in popup menus
          * @since 8323
          */
-        POPUPMENU(LARGEICON.imageSize),
+        POPUPMENU(LARGEICON),
         /** Layer list icon size
          * @since 8323
          */
@@ -158,30 +161,83 @@ public class ImageProvider {
         /** Toolbar button icon size
          * @since 9253
          */
-        TOOLBAR(LARGEICON.imageSize),
+        TOOLBAR(LARGEICON),
         /** Side button maximum height
          * @since 9253
          */
         SIDEBUTTON(Main.pref.getInteger("iconsize.sidebutton", 20)),
+        /** Settings tab icon size
+         * @since 9253
+         */
+        SETTINGS_TAB(Main.pref.getInteger("iconsize.settingstab", 48)),
         /**
          * The default image size
          * @since 9705
          */
-        DEFAULT(Main.pref.getInteger("iconsize.default", 24));
+        DEFAULT(Main.pref.getInteger("iconsize.default", 24)),
+        /**
+         * Splash dialog logo size
+         * @since 10358
+         */
+        SPLASH_LOGO(128, 129),
+        /**
+         * About dialog logo size
+         * @since 10358
+         */
+        ABOUT_LOGO(256, 258);
 
-        private final int imageSize;
+        private final int virtualWidth;
+        private final int virtualHeight;
 
         ImageSizes(int imageSize) {
-            this.imageSize = imageSize;
+            this.virtualWidth = imageSize;
+            this.virtualHeight = imageSize;
+        }
+
+        ImageSizes(int width, int height) {
+            this.virtualWidth = width;
+            this.virtualHeight = height;
+        }
+
+        ImageSizes(ImageSizes that) {
+            this.virtualWidth = that.virtualWidth;
+            this.virtualHeight = that.virtualHeight;
         }
 
         /**
-         * Returns the image size in pixels
-         * @return the image size in pixels
+         * Returns the image width in virtual pixels
+         * @return the image width in virtual pixels
          * @since 9705
          */
-        public int getImageSize() {
-            return imageSize;
+        public int getVirtualWidth() {
+            return virtualWidth;
+        }
+
+        /**
+         * Returns the image height in virtual pixels
+         * @return the image height in virtual pixels
+         * @since 9705
+         */
+        public int getVirtualHeight() {
+            return virtualHeight;
+        }
+
+        /**
+         * Returns the image width in pixels to use for display
+         * @return the image width in pixels to use for display
+         * @since 10484
+         */
+        public int getAdjustedWidth() {
+            return GuiSizesHelper.getSizeDpiAdjusted(virtualWidth);
+        }
+
+        /**
+         * Returns the image height in pixels to use for display
+         * @return the image height in pixels to use for display
+         * @since 10484
+         */
+        public int getAdjustedHeight() {
+            return GuiSizesHelper.getSizeDpiAdjusted(virtualHeight);
         }
 
         /**
@@ -190,7 +246,7 @@ public class ImageProvider {
          * @since 9705
          */
         public Dimension getImageDimension() {
-            return new Dimension(imageSize, imageSize);
+            return new Dimension(virtualWidth, virtualHeight);
         }
     }
 
@@ -218,14 +274,14 @@ public class ImageProvider {
     protected File archive;
     /** directory inside the archive */
     protected String inArchiveDir;
-    /** width of the resulting image, -1 when original image data should be used */
-    protected int width = -1;
-    /** height of the resulting image, -1 when original image data should be used */
-    protected int height = -1;
-    /** maximum width of the resulting image, -1 for no restriction */
-    protected int maxWidth = -1;
-    /** maximum height of the resulting image, -1 for no restriction */
-    protected int maxHeight = -1;
+    /** virtual width of the resulting image, -1 when original image data should be used */
+    protected int virtualWidth = -1;
+    /** virtual height of the resulting image, -1 when original image data should be used */
+    protected int virtualHeight = -1;
+    /** virtual maximum width of the resulting image, -1 for no restriction */
+    protected int virtualMaxWidth = -1;
+    /** virtual maximum height of the resulting image, -1 for no restriction */
+    protected int virtualMaxHeight = -1;
     /** In case of errors do not throw exception but return <code>null</code> for missing image */
     protected boolean optional;
     /** <code>true</code> if warnings should be suppressed */
@@ -234,6 +290,8 @@ public class ImageProvider {
     protected Collection<ClassLoader> additionalClassLoaders;
     /** ordered list of overlay images */
     protected List<ImageOverlay> overlayInfo;
+    /** <code>true</code> if icon must be grayed out */
+    protected boolean isDisabled = false;
 
     private static SVGUniverse svgUniverse;
 
@@ -305,14 +363,15 @@ public class ImageProvider {
         this.name = image.name;
         this.archive = image.archive;
         this.inArchiveDir = image.inArchiveDir;
-        this.width = image.width;
-        this.height = image.height;
-        this.maxWidth = image.maxWidth;
-        this.maxHeight = image.maxHeight;
+        this.virtualWidth = image.virtualWidth;
+        this.virtualHeight = image.virtualHeight;
+        this.virtualMaxWidth = image.virtualMaxWidth;
+        this.virtualMaxHeight = image.virtualMaxHeight;
         this.optional = image.optional;
         this.suppressWarnings = image.suppressWarnings;
         this.additionalClassLoaders = image.additionalClassLoaders;
         this.overlayInfo = image.overlayInfo;
+        this.isDisabled = image.isDisabled;
     }
 
     /**
@@ -388,8 +447,8 @@ public class ImageProvider {
      * @return the current object, for convenience
      */
     public ImageProvider setSize(Dimension size) {
-        this.width = size.width;
-        this.height = size.height;
+        this.virtualWidth = size.width;
+        this.virtualHeight = size.height;
         return this;
     }
 
@@ -406,13 +465,27 @@ public class ImageProvider {
     }
 
     /**
+     * Set the dimensions of the image.
+     *
+     * @param width final width of the image
+     * @param height final height of the image
+     * @return the current object, for convenience
+     * @since 10358
+     */
+    public ImageProvider setSize(int width, int height) {
+        this.virtualWidth = width;
+        this.virtualHeight = height;
+        return this;
+    }
+
+    /**
      * Set image width
      * @param width final width of the image
      * @return the current object, for convenience
      * @see #setSize
      */
     public ImageProvider setWidth(int width) {
-        this.width = width;
+        this.virtualWidth = width;
         return this;
     }
 
@@ -423,7 +496,7 @@ public class ImageProvider {
      * @see #setSize
      */
     public ImageProvider setHeight(int height) {
-        this.height = height;
+        this.virtualHeight = height;
         return this;
     }
 
@@ -438,8 +511,8 @@ public class ImageProvider {
      * @return the current object, for convenience
      */
     public ImageProvider setMaxSize(Dimension maxSize) {
-        this.maxWidth = maxSize.width;
-        this.maxHeight = maxSize.height;
+        this.virtualMaxWidth = maxSize.width;
+        this.virtualMaxHeight = maxSize.height;
         return this;
     }
 
@@ -457,11 +530,11 @@ public class ImageProvider {
      * @see #setMaxSize(Dimension)
      */
     public ImageProvider resetMaxSize(Dimension maxSize) {
-        if (this.maxWidth == -1 || maxSize.width < this.maxWidth) {
-            this.maxWidth = maxSize.width;
+        if (this.virtualMaxWidth == -1 || maxSize.width < this.virtualMaxWidth) {
+            this.virtualMaxWidth = maxSize.width;
         }
-        if (this.maxHeight == -1 || maxSize.height < this.maxHeight) {
-            this.maxHeight = maxSize.height;
+        if (this.virtualMaxHeight == -1 || maxSize.height < this.virtualMaxHeight) {
+            this.virtualMaxHeight = maxSize.height;
         }
         return this;
     }
@@ -497,7 +570,7 @@ public class ImageProvider {
      * @see #setMaxSize
      */
     public ImageProvider setMaxWidth(int maxWidth) {
-        this.maxWidth = maxWidth;
+        this.virtualMaxWidth = maxWidth;
         return this;
     }
 
@@ -508,7 +581,7 @@ public class ImageProvider {
      * @see #setMaxSize
      */
     public ImageProvider setMaxHeight(int maxHeight) {
-        this.maxHeight = maxHeight;
+        this.virtualMaxHeight = maxHeight;
         return this;
     }
 
@@ -549,17 +622,31 @@ public class ImageProvider {
     }
 
     /**
+     * Set, if image must be filtered to grayscale so it will look like disabled icon.
+     *
+     * @param disabled true, if image must be grayed out for disabled state
+     * @return the current object, for convenience
+     * @since 10428
+     */
+    public ImageProvider setDisabled(boolean disabled) {
+        this.isDisabled = disabled;
+        return this;
+    }
+
+    /**
      * Execute the image request and scale result.
      * @return the requested image or null if the request failed
      */
     public ImageIcon get() {
         ImageResource ir = getResource();
-        if (ir == null)
+
+        if (ir == null) {
             return null;
-        if (maxWidth != -1 || maxHeight != -1)
-            return ir.getImageIconBounded(new Dimension(maxWidth, maxHeight));
+        }
+        if (virtualMaxWidth != -1 || virtualMaxHeight != -1)
+            return ir.getImageIconBounded(new Dimension(virtualMaxWidth, virtualMaxHeight));
         else
-            return ir.getImageIcon(new Dimension(width, height));
+            return ir.getImageIcon(new Dimension(virtualWidth, virtualHeight));
     }
 
     /**
@@ -586,6 +673,9 @@ public class ImageProvider {
         if (overlayInfo != null) {
             ir = new ImageResource(ir, overlayInfo);
         }
+        if (isDisabled) {
+            ir.setDisabled(true);
+        }
         return ir;
     }
 
@@ -666,6 +756,33 @@ public class ImageProvider {
     }
 
     /**
+     * Load an image from directory with a given file name and size.
+     *
+     * @param subdir subdirectory the image lies in
+     * @param name The icon name (base name with or without '.png' or '.svg' extension)
+     * @param size Target icon size
+     * @return The requested Image.
+     * @throws RuntimeException if the image cannot be located
+     * @since 10428
+     */
+    public static ImageIcon get(String subdir, String name, ImageSizes size) {
+        return new ImageProvider(subdir, name).setSize(size).get();
+    }
+
+    /**
+     * Load an empty image with a given size.
+     *
+     * @param size Target icon size
+     * @return The requested Image.
+     * @since 10358
+     */
+    public static ImageIcon getEmpty(ImageSizes size) {
+        Dimension iconRealSize = GuiSizesHelper.getDimensionDpiAdjusted(size.getImageDimension());
+        return new ImageIcon(new BufferedImage(iconRealSize.width, iconRealSize.height,
+            BufferedImage.TYPE_INT_ARGB));
+    }
+
+    /**
      * Load an image with a given file name, but do not throw an exception
      * when the image cannot be found.
      *
@@ -679,6 +796,19 @@ public class ImageProvider {
     }
 
     /**
+     * Load an image with a given file name and size.
+     *
+     * @param name The icon name (base name with or without '.png' or '.svg' extension)
+     * @param size Target icon size
+     * @return the requested image or null if the request failed
+     * @see #get(String, String)
+     * @since 10428
+     */
+    public static ImageIcon get(String name, ImageSizes size) {
+        return new ImageProvider(name).setSize(size).get();
+    }
+
+    /**
      * Load an image with a given file name, but do not throw an exception
      * when the image cannot be found.
      *
@@ -711,13 +841,16 @@ public class ImageProvider {
             if (name == null)
                 return null;
 
+            String prefix = "";
+            if (isDisabled)
+                prefix = "dis:"+prefix;
             if (name.startsWith("data:")) {
                 String url = name;
-                ImageResource ir = cache.get(url);
+                ImageResource ir = cache.get(prefix+url);
                 if (ir != null) return ir;
                 ir = getIfAvailableDataUrl(url);
                 if (ir != null) {
-                    cache.put(url, ir);
+                    cache.put(prefix+url, ir);
                 }
                 return ir;
             }
@@ -726,19 +859,19 @@ public class ImageProvider {
 
             if (name.startsWith(HTTP_PROTOCOL) || name.startsWith(HTTPS_PROTOCOL)) {
                 String url = name;
-                ImageResource ir = cache.get(url);
+                ImageResource ir = cache.get(prefix+url);
                 if (ir != null) return ir;
                 ir = getIfAvailableHttp(url, type);
                 if (ir != null) {
-                    cache.put(url, ir);
+                    cache.put(prefix+url, ir);
                 }
                 return ir;
             } else if (name.startsWith(WIKI_PROTOCOL)) {
-                ImageResource ir = cache.get(name);
+                ImageResource ir = cache.get(prefix+name);
                 if (ir != null) return ir;
                 ir = getIfAvailableWiki(name, type);
                 if (ir != null) {
-                    cache.put(name, ir);
+                    cache.put(prefix+name, ir);
                 }
                 return ir;
             }
@@ -766,7 +899,7 @@ public class ImageProvider {
                     }
 
                     String fullName = subdir + name + ext;
-                    String cacheName = fullName;
+                    String cacheName = prefix + fullName;
                     /* cache separately */
                     if (dirs != null && !dirs.isEmpty()) {
                         cacheName = "id:" + id + ':' + fullName;
@@ -775,12 +908,13 @@ public class ImageProvider {
                         }
                     }
 
-                    ImageResource ir = cache.get(cacheName);
-                    if (ir != null) return ir;
-
                     switch (place) {
                     case typeArchive:
                         if (archive != null) {
+                            cacheName = "zip:"+archive.hashCode()+':'+cacheName;
+                            ImageResource ir = cache.get(cacheName);
+                            if (ir != null) return ir;
+
                             ir = getIfAvailableZip(fullName, archive, inArchiveDir, type);
                             if (ir != null) {
                                 cache.put(cacheName, ir);
@@ -789,6 +923,9 @@ public class ImageProvider {
                         }
                         break;
                     case typeLocal:
+                        ImageResource ir = cache.get(cacheName);
+                        if (ir != null) return ir;
+
                         // getImageUrl() does a ton of "stat()" calls and gets expensive
                         // and redundant when you have a whole ton of objects. So,
                         // index the cache by the name of the icon we're looking for
@@ -1332,31 +1469,31 @@ public class ImageProvider {
                     NodeElement nodeStyle = (NodeElement) style;
                     MapImage icon = nodeStyle.mapImage;
                     if (icon != null) {
-                        int backgroundWidth = iconSize.width;
-                        int backgroundHeight = iconSize.height;
-                        int iconWidth = icon.getWidth();
-                        int iconHeight = icon.getHeight();
-                        BufferedImage image = new BufferedImage(backgroundWidth, backgroundHeight,
+                        int backgroundRealWidth = GuiSizesHelper.getSizeDpiAdjusted(iconSize.width);
+                        int backgroundRealHeight = GuiSizesHelper.getSizeDpiAdjusted(iconSize.height);
+                        int iconRealWidth = icon.getWidth();
+                        int iconRealHeight = icon.getHeight();
+                        BufferedImage image = new BufferedImage(backgroundRealWidth, backgroundRealHeight,
                                 BufferedImage.TYPE_INT_ARGB);
-                        double scaleFactor = Math.min(backgroundWidth / (double) iconWidth, backgroundHeight
-                                / (double) iconHeight);
+                        double scaleFactor = Math.min(backgroundRealWidth / (double) iconRealWidth, backgroundRealHeight
+                                / (double) iconRealHeight);
                         BufferedImage iconImage = icon.getImage(false);
                         Image scaledIcon;
                         final int scaledWidth;
                         final int scaledHeight;
                         if (scaleFactor < 1) {
                             // Scale icon such that it fits on background.
-                            scaledWidth = (int) (iconWidth * scaleFactor);
-                            scaledHeight = (int) (iconHeight * scaleFactor);
+                            scaledWidth = (int) (iconRealWidth * scaleFactor);
+                            scaledHeight = (int) (iconRealHeight * scaleFactor);
                             scaledIcon = iconImage.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
                         } else {
                             // Use original size, don't upscale.
-                            scaledWidth = iconWidth;
-                            scaledHeight = iconHeight;
+                            scaledWidth = iconRealWidth;
+                            scaledHeight = iconRealHeight;
                             scaledIcon = iconImage;
                         }
-                        image.getGraphics().drawImage(scaledIcon, (backgroundWidth - scaledWidth) / 2,
-                                (backgroundHeight - scaledHeight) / 2, null);
+                        image.getGraphics().drawImage(scaledIcon, (backgroundRealWidth - scaledWidth) / 2,
+                                (backgroundRealHeight - scaledHeight) / 2, null);
 
                         return new ImageIcon(image);
                     }
@@ -1393,35 +1530,36 @@ public class ImageProvider {
      * @return an image from the given SVG data at the desired dimension.
      */
     public static BufferedImage createImageFromSvg(SVGDiagram svg, Dimension dim) {
-        float realWidth = svg.getWidth();
-        float realHeight = svg.getHeight();
-        int width = Math.round(realWidth);
-        int height = Math.round(realHeight);
-        Double scaleX = null, scaleY = null;
+        float sourceWidth = svg.getWidth();
+        float sourceHeight = svg.getHeight();
+        int realWidth = Math.round(GuiSizesHelper.getSizeDpiAdjusted(sourceWidth));
+        int realHeight = Math.round(GuiSizesHelper.getSizeDpiAdjusted(sourceHeight));
+        Double scaleX, scaleY;
         if (dim.width != -1) {
-            width = dim.width;
-            scaleX = (double) width / realWidth;
+            realWidth = dim.width;
+            scaleX = (double) realWidth / sourceWidth;
             if (dim.height == -1) {
                 scaleY = scaleX;
-                height = (int) Math.round(realHeight * scaleY);
+                realHeight = (int) Math.round(sourceHeight * scaleY);
             } else {
-                height = dim.height;
-                scaleY = (double) height / realHeight;
+                realHeight = dim.height;
+                scaleY = (double) realHeight / sourceHeight;
             }
         } else if (dim.height != -1) {
-            height = dim.height;
-            scaleX = scaleY = (double) height / realHeight;
-            width = (int) Math.round(realWidth * scaleX);
+            realHeight = dim.height;
+            scaleX = scaleY = (double) realHeight / sourceHeight;
+            realWidth = (int) Math.round(sourceWidth * scaleX);
+        } else {
+            scaleX = scaleY = (double) realHeight / sourceHeight;
         }
-        if (width == 0 || height == 0) {
+
+        if (realWidth == 0 || realHeight == 0) {
             return null;
         }
-        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        BufferedImage img = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_INT_ARGB);
         Graphics2D g = img.createGraphics();
-        g.setClip(0, 0, width, height);
-        if (scaleX != null && scaleY != null) {
-            g.scale(scaleX, scaleY);
-        }
+        g.setClip(0, 0, realWidth, realHeight);
+        g.scale(scaleX, scaleY);
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
         try {
             synchronized (getSvgUniverse()) {
diff --git a/src/org/openstreetmap/josm/tools/ImageResource.java b/src/org/openstreetmap/josm/tools/ImageResource.java
index bc0c754..28e2c30 100644
--- a/src/org/openstreetmap/josm/tools/ImageResource.java
+++ b/src/org/openstreetmap/josm/tools/ImageResource.java
@@ -10,7 +10,12 @@ import java.util.Map;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
+import javax.swing.Icon;
 import javax.swing.ImageIcon;
+import javax.swing.JPanel;
+import javax.swing.UIManager;
+
+import org.openstreetmap.josm.gui.util.GuiSizesHelper;
 
 import com.kitfox.svg.SVGDiagram;
 
@@ -40,6 +45,13 @@ public class ImageResource {
      * ordered list of overlay images
      */
     protected List<ImageOverlay> overlayInfo;
+    /**
+     * <code>true</code> if icon must be grayed out
+     */
+    protected boolean isDisabled = false;
+    /**
+     * The base raster image for the final output
+     */
     private Image baseImage;
 
     /**
@@ -48,8 +60,26 @@ public class ImageResource {
      */
     public ImageResource(Image img) {
         CheckParameterUtil.ensureParameterNotNull(img);
-        this.baseImage = img;
-        imgCache.put(DEFAULT_DIMENSION, img);
+        baseImage = scaleBaseImageIfNeeded(img);
+    }
+
+    /** Scale image according to screen DPI if needed.
+     *
+     * @param img an image loaded from file (it's width and height are virtual pixels)
+     * @return original img if virtual size is the same as real size or new image resized to real pixels
+     */
+    private static Image scaleBaseImageIfNeeded(Image img) {
+        int imgWidth = img.getWidth(null);
+        int imgHeight = img.getHeight(null);
+        int realWidth = GuiSizesHelper.getSizeDpiAdjusted(imgWidth);
+        int realHeight = GuiSizesHelper.getSizeDpiAdjusted(imgHeight);
+        if (realWidth != -1 && realHeight != -1 && imgWidth != realWidth && imgHeight != realHeight) {
+            Image realImage = img.getScaledInstance(realWidth, realHeight, Image.SCALE_SMOOTH);
+            BufferedImage bimg = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_INT_ARGB);
+            bimg.getGraphics().drawImage(realImage, 0, 0, null);
+            return bimg;
+        }
+        return img;
     }
 
     /**
@@ -74,30 +104,57 @@ public class ImageResource {
     }
 
     /**
-     * Returns the image icon at default dimension.
-     * @return the image icon at default dimension
+     * Set, if image must be filtered to grayscale so it will look like disabled icon.
+     *
+     * @param disabled true, if image must be grayed out for disabled state
+     * @return the current object, for convenience
+     * @since 10428
      */
-    public ImageIcon getImageIcon() {
-        return getImageIcon(DEFAULT_DIMENSION);
+    public ImageResource setDisabled(boolean disabled) {
+        this.isDisabled = disabled;
+        return this;
     }
 
     /**
      * Set both icons of an Action
      * @param a The action for the icons
-     * @since 7693
+     * @since 10369
      */
-    public void getImageIcon(AbstractAction a) {
-        ImageIcon icon = getImageIconBounded(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
+    public void attachImageIcon(AbstractAction a) {
+        Dimension iconDimension = ImageProvider.ImageSizes.SMALLICON.getImageDimension();
+        ImageIcon icon = getImageIconBounded(iconDimension);
         a.putValue(Action.SMALL_ICON, icon);
-        icon = getImageIconBounded(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
+
+        iconDimension = ImageProvider.ImageSizes.LARGEICON.getImageDimension();
+        icon = getImageIconBounded(iconDimension);
         a.putValue(Action.LARGE_ICON_KEY, icon);
     }
 
     /**
+     * Set both icons of an Action
+     * @param a The action for the icons
+     * @param addresource Adds an resource named "ImageResource" if <code>true</code>
+     * @since 10369
+     */
+    public void attachImageIcon(AbstractAction a, boolean addresource) {
+        attachImageIcon(a);
+        if (addresource) {
+            a.putValue("ImageResource", this);
+        }
+    }
+
+    /**
+     * Returns the image icon at default dimension.
+     * @return the image icon at default dimension
+     */
+    public ImageIcon getImageIcon() {
+        return getImageIcon(DEFAULT_DIMENSION);
+    }
+
+    /**
      * Get an ImageIcon object for the image of this resource
-     * @param   dim The requested dimensions. Use (-1,-1) for the original size
-     *          and (width, -1) to set the width, but otherwise scale the image
-     *          proportionally.
+     * @param  dim The requested dimensions. Use (-1,-1) for the original size and (width, -1)
+     *         to set the width, but otherwise scale the image proportionally.
      * @return ImageIcon object for the image of this resource, scaled according to dim
      */
     public ImageIcon getImageIcon(Dimension dim) {
@@ -107,43 +164,46 @@ public class ImageResource {
         if (img != null) {
             return new ImageIcon(img);
         }
+        BufferedImage bimg;
         if (svg != null) {
-            BufferedImage bimg = ImageProvider.createImageFromSvg(svg, dim);
+            Dimension realDim = GuiSizesHelper.getDimensionDpiAdjusted(dim);
+            bimg = ImageProvider.createImageFromSvg(svg, realDim);
             if (bimg == null) {
                 return null;
             }
-            if (overlayInfo != null) {
-                for (ImageOverlay o : overlayInfo) {
-                    o.process(bimg);
-                }
-            }
-            imgCache.put(dim, bimg);
-            return new ImageIcon(bimg);
         } else {
             if (baseImage == null) throw new AssertionError();
 
-            int width = dim.width;
-            int height = dim.height;
+            int realWidth = GuiSizesHelper.getSizeDpiAdjusted(dim.width);
+            int realHeight = GuiSizesHelper.getSizeDpiAdjusted(dim.height);
             ImageIcon icon = new ImageIcon(baseImage);
-            if (width == -1 && height == -1) {
-                width = icon.getIconWidth();
-                height = icon.getIconHeight();
-            } else if (width == -1) {
-                width = Math.max(1, icon.getIconWidth() * height / icon.getIconHeight());
-            } else if (height == -1) {
-                height = Math.max(1, icon.getIconHeight() * width / icon.getIconWidth());
+            if (realWidth == -1 && realHeight == -1) {
+                realWidth = GuiSizesHelper.getSizeDpiAdjusted(icon.getIconWidth());
+                realHeight = GuiSizesHelper.getSizeDpiAdjusted(icon.getIconHeight());
+            } else if (realWidth == -1) {
+                realWidth = Math.max(1, icon.getIconWidth() * realHeight / icon.getIconHeight());
+            } else if (realHeight == -1) {
+                realHeight = Math.max(1, icon.getIconHeight() * realWidth / icon.getIconWidth());
             }
-            Image i = icon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH);
-            BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+            Image i = icon.getImage().getScaledInstance(realWidth, realHeight, Image.SCALE_SMOOTH);
+            bimg = new BufferedImage(realWidth, realHeight, BufferedImage.TYPE_INT_ARGB);
             bimg.getGraphics().drawImage(i, 0, 0, null);
-            if (overlayInfo != null) {
-                for (ImageOverlay o : overlayInfo) {
-                    o.process(bimg);
-                }
+        }
+        if (overlayInfo != null) {
+            for (ImageOverlay o : overlayInfo) {
+                o.process(bimg);
             }
-            imgCache.put(dim, bimg);
-            return new ImageIcon(bimg);
         }
+        if (isDisabled) {
+            //Use default Swing functionality to make icon look disabled by applying grayscaling filter.
+            Icon disabledIcon = UIManager.getLookAndFeel().getDisabledIcon(null, new ImageIcon(bimg));
+
+            //Convert Icon to ImageIcon with BufferedImage inside
+            bimg = new BufferedImage(bimg.getWidth(), bimg.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
+            disabledIcon.paintIcon(new JPanel(), bimg.getGraphics(), 0, 0);
+        }
+        imgCache.put(dim, bimg);
+        return new ImageIcon(bimg);
     }
 
     /**
@@ -157,22 +217,22 @@ public class ImageResource {
     public ImageIcon getImageIconBounded(Dimension maxSize) {
         if (maxSize.width < -1 || maxSize.width == 0 || maxSize.height < -1 || maxSize.height == 0)
             throw new IllegalArgumentException(maxSize+" is invalid");
-        float realWidth;
-        float realHeight;
+        float sourceWidth;
+        float sourceHeight;
         int maxWidth = maxSize.width;
         int maxHeight = maxSize.height;
         if (svg != null) {
-            realWidth = svg.getWidth();
-            realHeight = svg.getHeight();
+            sourceWidth = svg.getWidth();
+            sourceHeight = svg.getHeight();
         } else {
             if (baseImage == null) throw new AssertionError();
             ImageIcon icon = new ImageIcon(baseImage);
-            realWidth = icon.getIconWidth();
-            realHeight = icon.getIconHeight();
-            if (realWidth <= maxWidth) {
+            sourceWidth = icon.getIconWidth();
+            sourceHeight = icon.getIconHeight();
+            if (sourceWidth <= maxWidth) {
                 maxWidth = -1;
             }
-            if (realHeight <= maxHeight) {
+            if (sourceHeight <= maxHeight) {
                 maxHeight = -1;
             }
         }
@@ -183,7 +243,7 @@ public class ImageResource {
             return getImageIcon(new Dimension(-1, maxHeight));
         else if (maxHeight == -1)
             return getImageIcon(new Dimension(maxWidth, -1));
-        else if (realWidth / maxWidth > realHeight / maxHeight)
+        else if (sourceWidth / maxWidth > sourceHeight / maxHeight)
             return getImageIcon(new Dimension(maxWidth, -1));
         else
             return getImageIcon(new Dimension(-1, maxHeight));
diff --git a/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java b/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java
index 33d6422..751e272 100644
--- a/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java
+++ b/src/org/openstreetmap/josm/tools/MultikeyShortcutAction.java
@@ -26,7 +26,7 @@ public interface MultikeyShortcutAction extends Action {
             else if (index == 9)
                 return '0';
             else
-                return (char) ('A' +  index - 10);
+                return (char) ('A' + index - 10);
         }
 
         public String getDescription() {
diff --git a/src/org/openstreetmap/josm/tools/PlatformHookOsx.java b/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
index dc5df01..062451f 100644
--- a/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
+++ b/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
@@ -177,36 +177,36 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
     @Override
     public void initSystemShortcuts() {
         // CHECKSTYLE.OFF: LineLength
-        Shortcut.registerSystemShortcut("apple-reserved-01", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK).setAutomatic(); // Show or hide the Spotlight search field (when multiple languages are installed, may rotate through enabled script systems).
-        Shortcut.registerSystemShortcut("apple-reserved-02", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Apple reserved.
-        Shortcut.registerSystemShortcut("apple-reserved-03", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Show the Spotlight search results window (when multiple languages are installed, may rotate through keyboard layouts and input methods within a script).
-        Shortcut.registerSystemShortcut("apple-reserved-04", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK).setAutomatic(); //  | Apple reserved.
-        Shortcut.registerSystemShortcut("apple-reserved-05", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Navigate through controls in a reverse direction. See "Keyboard Focus and Navigation."
-        Shortcut.registerSystemShortcut("apple-reserved-06", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK).setAutomatic(); // Move forward to the next most recently used application in a list of open applications.
-        Shortcut.registerSystemShortcut("apple-reserved-07", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Move backward through a list of open applications (sorted by recent use).
-        Shortcut.registerSystemShortcut("apple-reserved-08", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the next grouping of controls in a dialog or the next table (when Tab moves to the next cell). See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-09", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Move focus to the previous grouping of controls. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-10", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK).setAutomatic(); // Open Front Row.
-        Shortcut.registerSystemShortcut("apple-reserved-11", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Open the Force Quit dialog.
-        Shortcut.registerSystemShortcut("apple-reserved-12", tr("reserved"), KeyEvent.VK_F1, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Toggle full keyboard access on or off. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-13", tr("reserved"), KeyEvent.VK_F2, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the menu bar. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-14", tr("reserved"), KeyEvent.VK_F3, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the Dock. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-15", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the active (or next) window. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-16", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Move focus to the previously active window. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-17", tr("reserved"), KeyEvent.VK_F5, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the toolbar. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-18", tr("reserved"), KeyEvent.VK_F5, KeyEvent.META_DOWN_MASK).setAutomatic(); // Turn VoiceOver on or off. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-19", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Move focus to the first (or next) panel. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-20", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Move focus to the previous panel. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-21", tr("reserved"), KeyEvent.VK_F7, KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Temporarily override the current keyboard access mode in windows and dialogs. See Accessibility Overview.
-        //Shortcut.registerSystemShortcut("apple-reserved-22", tr("reserved"), KeyEvent.VK_F9, 0).setAutomatic(); // Tile or untile all open windows.
-        //Shortcut.registerSystemShortcut("apple-reserved-23", tr("reserved"), KeyEvent.VK_F10, 0).setAutomatic(); // Tile or untile all open windows in the currently active application.
-        //Shortcut.registerSystemShortcut("apple-reserved-24", tr("reserved"), KeyEvent.VK_F11, 0).setAutomatic(); // Hide or show all open windows.
-        //Shortcut.registerSystemShortcut("apple-reserved-25", tr("reserved"), KeyEvent.VK_F12, 0).setAutomatic(); // Hide or display Dashboard.
-        Shortcut.registerSystemShortcut("apple-reserved-26", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK).setAutomatic(); // Activate the next open window in the frontmost application. See "Window Layering."
-        Shortcut.registerSystemShortcut("apple-reserved-27", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Activate the previous open window in the frontmost application. See "Window Layering."
-        Shortcut.registerSystemShortcut("apple-reserved-28", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Move focus to the window drawer.
-        //Shortcut.registerSystemShortcut("apple-reserved-29", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK).setAutomatic(); // Decrease the size of the selected item (equivalent to the Smaller command). See "The Format Menu."
-        Shortcut.registerSystemShortcut("apple-reserved-30", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Zoom out when screen zooming is on. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-01", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK)); // Show or hide the Spotlight search field (when multiple languages are installed, may rotate through enabled script systems).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-02", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Apple reserved.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-03", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show the Spotlight search results window (when multiple languages are installed, may rotate through keyboard layouts and input methods within a script).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-04", tr("reserved"), KeyEvent.VK_SPACE, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); //  | Apple reserved.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-05", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK)); // Navigate through controls in a reverse direction. See "Keyboard Focus and Navigation."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-06", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK)); // Move forward to the next most recently used application in a list of open applications.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-07", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move backward through a list of open applications (sorted by recent use).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-08", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the next grouping of controls in a dialog or the next table (when Tab moves to the next cell). See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-09", tr("reserved"), KeyEvent.VK_TAB, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous grouping of controls. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-10", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK)); // Open Front Row.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-11", tr("reserved"), KeyEvent.VK_ESCAPE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Open the Force Quit dialog.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-12", tr("reserved"), KeyEvent.VK_F1, KeyEvent.CTRL_DOWN_MASK)); // Toggle full keyboard access on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-13", tr("reserved"), KeyEvent.VK_F2, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the menu bar. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-14", tr("reserved"), KeyEvent.VK_F3, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the Dock. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-15", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the active (or next) window. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-16", tr("reserved"), KeyEvent.VK_F4, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previously active window. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-17", tr("reserved"), KeyEvent.VK_F5, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the toolbar. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-18", tr("reserved"), KeyEvent.VK_F5, KeyEvent.META_DOWN_MASK)); // Turn VoiceOver on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-19", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK)); // Move focus to the first (or next) panel. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-20", tr("reserved"), KeyEvent.VK_F6, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Move focus to the previous panel. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-21", tr("reserved"), KeyEvent.VK_F7, KeyEvent.CTRL_DOWN_MASK)); // Temporarily override the current keyboard access mode in windows and dialogs. See Accessibility Overview.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-22", tr("reserved"), KeyEvent.VK_F9, 0)); // Tile or untile all open windows.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-23", tr("reserved"), KeyEvent.VK_F10, 0)); // Tile or untile all open windows in the currently active application.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-24", tr("reserved"), KeyEvent.VK_F11, 0)); // Hide or show all open windows.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-25", tr("reserved"), KeyEvent.VK_F12, 0)); // Hide or display Dashboard.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-26", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK)); // Activate the next open window in the frontmost application. See "Window Layering."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-27", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Activate the previous open window in the frontmost application. See "Window Layering."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-28", tr("reserved"), KeyEvent.VK_DEAD_GRAVE, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Move focus to the window drawer.
+        //auto(Shortcut.registerSystemShortcut("apple-reserved-29", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK)); // Decrease the size of the selected item (equivalent to the Smaller command). See "The Format Menu."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-30", tr("reserved"), KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom out when screen zooming is on. See Accessibility Overview.
 
         //Shortcut.registerSystemShortcut("system:align-left", tr("reserved"), KeyEvent.VK_OPEN_BRACKET, KeyEvent.META_DOWN_MASK); // Left-align a selection (equivalent to the Align Left command). See "The Format Menu."
         //Shortcut.registerSystemShortcut("system:align-right",tr("reserved"), KeyEvent.VK_CLOSE_BRACKET, KeyEvent.META_DOWN_MASK); // Right-align a selection (equivalent to the Align Right command). See "The Format Menu."
@@ -214,32 +214,32 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         //Shortcut.registerSystemCut("system:align-center", tr("reserved"), '|', KeyEvent.META_DOWN_MASK); // Center-align a selection (equivalent to the Align Center command). See "The Format Menu."
         //Shortcut.registerSystemShortcut("system:spelling", tr("reserved"), KeyEvent.VK_COLON, KeyEvent.META_DOWN_MASK); // Display the Spelling window (equivalent to the Spelling command). See "The Edit Menu."
         //Shortcut.registerSystemShortcut("system:spellcheck", tr("reserved"), KeyEvent.VK_SEMICOLON, KeyEvent.META_DOWN_MASK); // Find misspelled words in the document (equivalent to the Check Spelling command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:preferences", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK).setAutomatic(); // Open the application's preferences window (equivalent to the Preferences command). See "The Application Menu."
+        auto(Shortcut.registerSystemShortcut("system:preferences", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK)); // Open the application's preferences window (equivalent to the Preferences command). See "The Application Menu."
 
-        Shortcut.registerSystemShortcut("apple-reserved-31", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Decrease screen contrast. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-32", tr("reserved"), KeyEvent.VK_PERIOD, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Increase screen contrast. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-31", tr("reserved"), KeyEvent.VK_COMMA, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Decrease screen contrast. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-32", tr("reserved"), KeyEvent.VK_PERIOD, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Increase screen contrast. See Accessibility Overview.
 
         // I found no KeyEvent for ?
-        //Shortcut.registerSystemCut("system:help", tr("reserved"), '?', KeyEvent.META_DOWN_MASK).setAutomatic(); // Open the application's help in Help Viewer. See "The Help Menu."
-
-        Shortcut.registerSystemShortcut("apple-reserved-33", tr("reserved"), KeyEvent.VK_SLASH, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Turn font smoothing on or off.
-        Shortcut.registerSystemShortcut("apple-reserved-34", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Increase the size of the selected item (equivalent to the Bigger command). See "The Format Menu."
-        Shortcut.registerSystemShortcut("apple-reserved-35", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Zoom in when screen zooming is on. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-36", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Capture the screen to a file.
-        Shortcut.registerSystemShortcut("apple-reserved-37", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Capture the screen to the Clipboard.
-        Shortcut.registerSystemShortcut("apple-reserved-38", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Capture a selection to a file.
-        Shortcut.registerSystemShortcut("apple-reserved-39", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Capture a selection to the Clipboard.
-        Shortcut.registerSystemShortcut("apple-reserved-40", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Turn screen zooming on or off. See Accessibility Overview.
-        Shortcut.registerSystemShortcut("apple-reserved-41", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Invert the screen colors. See Accessibility Overview.
+        //auto(Shortcut.registerSystemCut("system:help", tr("reserved"), '?', KeyEvent.META_DOWN_MASK)); // Open the application's help in Help Viewer. See "The Help Menu."
+
+        auto(Shortcut.registerSystemShortcut("apple-reserved-33", tr("reserved"), KeyEvent.VK_SLASH, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn font smoothing on or off.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-34", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Increase the size of the selected item (equivalent to the Bigger command). See "The Format Menu."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-35", tr("reserved"), KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Zoom in when screen zooming is on. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-36", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture the screen to a file.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-37", tr("reserved"), KeyEvent.VK_3, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture the screen to the Clipboard.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-38", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Capture a selection to a file.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-39", tr("reserved"), KeyEvent.VK_4, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Capture a selection to the Clipboard.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-40", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Turn screen zooming on or off. See Accessibility Overview.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-41", tr("reserved"), KeyEvent.VK_8, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Invert the screen colors. See Accessibility Overview.
 
         Shortcut.registerSystemShortcut("system:selectall", tr("reserved"), KeyEvent.VK_A, KeyEvent.META_DOWN_MASK); // Highlight every item in a document or window, or all characters in a text field (equivalent to the Select All command). See "The Edit Menu."
         //Shortcut.registerSystemShortcut("system:bold", tr("reserved"), KeyEvent.VK_B, KeyEvent.META_DOWN_MASK); // Boldface the selected text or toggle boldfaced text on and off (equivalent to the Bold command). See "The Edit Menu."
         Shortcut.registerSystemShortcut("system:copy", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK); // Duplicate the selected data and store on the Clipboard (equivalent to the Copy command). See "The Edit Menu."
         //Shortcut.registerSystemShortcut("system:colors", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Colors window (equivalent to the Show Colors command). See "The Format Menu."
         //Shortcut.registerSystemShortcut("system:copystyle", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Copy the style of the selected text (equivalent to the Copy Style command). See "The Format Menu."
-        //Shortcut.registerSystemShortcut("system:copyformat", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK).setAutomatic(); // Copy the formatting settings of the selected item and store on the Clipboard (equivalent to the Copy Ruler command). See "The Format Menu."
+        //Shortcut.registerSystemShortcut("system:copyformat", tr("reserved"), KeyEvent.VK_C, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK)); // Copy the formatting settings of the selected item and store on the Clipboard (equivalent to the Copy Ruler command). See "The Format Menu."
 
-        Shortcut.registerSystemShortcut("apple-reserved-42", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Show or hide the Dock. See "The Dock."
+        auto(Shortcut.registerSystemShortcut("apple-reserved-42", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Show or hide the Dock. See "The Dock."
 
         Shortcut.registerSystemShortcut("system:dictionarylookup", tr("reserved"), KeyEvent.VK_D, KeyEvent.META_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK); // Display the definition of the selected word in the Dictionary application.
         //Shortcut.registerSystemShortcut("system:findselected", tr("reserved"), KeyEvent.VK_E, KeyEvent.META_DOWN_MASK); // Use the selection for a find operation. See "Find Windows."
@@ -247,8 +247,8 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         Shortcut.registerSystemShortcut("system:search", tr("reserved"), KeyEvent.VK_F, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK); // Jump to the search field control. See "Search Fields."
         //Shortcut.registerSystemShortcut("system:findnext", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK); // Find the next occurrence of the selection (equivalent to the Find Next command). See "The Edit Menu."
         //Shortcut.registerSystemShortcut("system:findprev", tr("reserved"), KeyEvent.VK_G, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Find the previous occurrence of the selection (equivalent to the Find Previous command). See "The Edit Menu."
-        Shortcut.registerSystemShortcut("system:hide", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK).setAutomatic(); // Hide the windows of the currently running application (equivalent to the Hide ApplicationName command). See "The Application Menu."
-        Shortcut.registerSystemShortcut("system:hideothers", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Hide the windows of all other running applications (equivalent to the Hide Others command). See "The Application Menu."
+        auto(Shortcut.registerSystemShortcut("system:hide", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK)); // Hide the windows of the currently running application (equivalent to the Hide ApplicationName command). See "The Application Menu."
+        auto(Shortcut.registerSystemShortcut("system:hideothers", tr("reserved"), KeyEvent.VK_H, KeyEvent.META_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Hide the windows of all other running applications (equivalent to the Hide Others command). See "The Application Menu."
         // What about applications that have italic text AND info windows?
         //Shortcut.registerSystemCut("system:italic", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Italicize the selected text or toggle italic text on or off (equivalent to the Italic command). See "The Format Menu."
         //Shortcut.registerSystemShortcut("system:info", tr("reserved"), KeyEvent.VK_I, KeyEvent.META_DOWN_MASK); // Display an Info window. See "Inspector Windows."
@@ -260,10 +260,10 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         Shortcut.registerSystemShortcut("system:open", tr("reserved"), KeyEvent.VK_O, KeyEvent.META_DOWN_MASK); // Display a dialog for choosing a document to open (equivalent to the Open command). See "The File Menu."
         Shortcut.registerSystemShortcut("system:print", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK); // Display the Print dialog (equivalent to the Print command). See "The File Menu."
         //Shortcut.registerSystemShortcut("system:printsetup", tr("reserved"), KeyEvent.VK_P, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display a dialog for specifying printing parameters (equivalent to the Page Setup command). See "The File Menu."
-        Shortcut.registerSystemShortcut("system:menuexit", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK).setAutomatic(); // Quit the application (equivalent to the Quit command). See "The Application Menu."
+        auto(Shortcut.registerSystemShortcut("system:menuexit", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK)); // Quit the application (equivalent to the Quit command). See "The Application Menu."
 
-        Shortcut.registerSystemShortcut("apple-reserved-43", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Log out the current user (equivalent to the Log Out command).
-        Shortcut.registerSystemShortcut("apple-reserved-44", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK).setAutomatic(); // Log out the current user without confirmation.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-43", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Log out the current user (equivalent to the Log Out command).
+        auto(Shortcut.registerSystemShortcut("apple-reserved-44", tr("reserved"), KeyEvent.VK_Q, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.ALT_DOWN_MASK)); // Log out the current user without confirmation.
 
         Shortcut.registerSystemShortcut("system:save", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK); // Save the active document (equivalent to the Save command). See "The File Menu."
         Shortcut.registerSystemShortcut("system:saveas", tr("reserved"), KeyEvent.VK_S, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Display the Save dialog (equivalent to the Save As command). See "The File Menu."
@@ -281,39 +281,45 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         Shortcut.registerSystemShortcut("system:undo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK); // Reverse the effect of the user's previous operation (equivalent to the Undo command). See "The Edit Menu."
         Shortcut.registerSystemShortcut("system:redo", tr("reserved"), KeyEvent.VK_Z, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK); // Reverse the effect of the last Undo command (equivalent to the Redo command). See "The Edit Menu."
 
-        Shortcut.registerSystemShortcut("apple-reserved-45", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK).setAutomatic(); // Change the keyboard layout to current layout of Roman script.
-        //Shortcut.registerSystemCut("apple-reserved-46", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the next semantic unit, typically the end of the current line.
-        //Shortcut.registerSystemCut("apple-reserved-47", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection one character to the right.
-        //Shortcut.registerSystemCut("apple-reserved-48", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the end of the current word, then to the end of the next word.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-45", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of Roman script.
+        //auto(Shortcut.registerSystemCut("apple-reserved-46", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the next semantic unit, typically the end of the current line.
+        //auto(Shortcut.registerSystemCut("apple-reserved-47", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the right.
+        //auto(Shortcut.registerSystemCut("apple-reserved-48", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current word, then to the end of the next word.
 
         Shortcut.registerSystemShortcut("system:movefocusright", tr("reserved"), KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
 
-        Shortcut.registerSystemShortcut("apple-reserved-49", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK).setAutomatic(); // Change the keyboard layout to current layout of system script.
-        //Shortcut.registerSystemCut("apple-reserved-50", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the previous semantic unit, typically the beginning of the current line.
-        //Shortcut.registerSystemCut("apple-reserved-51", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection one character to the left.
-        //Shortcut.registerSystemCut("apple-reserved-52", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the beginning of the current word, then to the beginning of the previous word.
+        auto(Shortcut.registerSystemShortcut("apple-reserved-49", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK)); // Change the keyboard layout to current layout of system script.
+        //auto(Shortcut.registerSystemCut("apple-reserved-50", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the previous semantic unit, typically the beginning of the current line.
+        //auto(Shortcut.registerSystemCut("apple-reserved-51", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection one character to the left.
+        //auto(Shortcut.registerSystemCut("apple-reserved-52", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current word, then to the beginning of the previous word.
 
         Shortcut.registerSystemShortcut("system:movefocusleft", tr("reserved"), KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
 
-        //Shortcut.registerSystemCut("apple-reserved-53", tr("reserved"), KeyEvent.VK_UP, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection upward in the next semantic unit, typically the beginning of the document.
-        //Shortcut.registerSystemCut("apple-reserved-54", tr("reserved"), KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the line above, to the nearest character boundary at the same horizontal location.
-        //Shortcut.registerSystemCut("apple-reserved-55", tr("reserved"), KeyEvent.VK_UP, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the beginning of the current paragraph, then to the beginning of the next paragraph.
+        //auto(Shortcut.registerSystemCut("apple-reserved-53", tr("reserved"), KeyEvent.VK_UP, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection upward in the next semantic unit, typically the beginning of the document.
+        //auto(Shortcut.registerSystemCut("apple-reserved-54", tr("reserved"), KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line above, to the nearest character boundary at the same horizontal location.
+        //auto(Shortcut.registerSystemCut("apple-reserved-55", tr("reserved"), KeyEvent.VK_UP, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the beginning of the current paragraph, then to the beginning of the next paragraph.
 
         Shortcut.registerSystemShortcut("system:movefocusup", tr("reserved"), KeyEvent.VK_UP, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
 
-        //Shortcut.registerSystemCut("apple-reserved-56", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection downward in the next semantic unit, typically the end of the document.
-        //Shortcut.registerSystemCut("apple-reserved-57", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the line below, to the nearest character boundary at the same horizontal location.
-        //Shortcut.registerSystemCut("apple-reserved-58", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK).setAutomatic(); // Extend selection to the end of the current paragraph, then to the end of the next paragraph (include the blank line between paragraphs in cut, copy, and paste operations).
+        //auto(Shortcut.registerSystemCut("apple-reserved-56", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.META_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection downward in the next semantic unit, typically the end of the document.
+        //auto(Shortcut.registerSystemCut("apple-reserved-57", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the line below, to the nearest character boundary at the same horizontal location.
+        //auto(Shortcut.registerSystemCut("apple-reserved-58", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK)); // Extend selection to the end of the current paragraph, then to the end of the next paragraph (include the blank line between paragraphs in cut, copy, and paste operations).
 
         Shortcut.registerSystemShortcut("system:movefocusdown", tr("reserved"), KeyEvent.VK_DOWN, KeyEvent.CTRL_DOWN_MASK); // Move focus to another value or cell within a view, such as a table. See Accessibility Overview.
 
-        Shortcut.registerSystemShortcut("system:about", tr("reserved"), 0, -1).setAutomatic(); // About
+        auto(Shortcut.registerSystemShortcut("system:about", tr("reserved"), 0, -1)); // About
 
         Shortcut.registerSystemShortcut("view:zoomin", tr("reserved"), KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK); // Zoom in
         Shortcut.registerSystemShortcut("view:zoomout", tr("reserved"), KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK); // Zoom out
         // CHECKSTYLE.ON: LineLength
     }
 
+    private static void auto(Shortcut sc) {
+        if (sc != null) {
+            sc.setAutomatic();
+        }
+    }
+
     @Override
     public String makeTooltip(String name, Shortcut sc) {
         String lafid = UIManager.getLookAndFeel().getID();
diff --git a/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java b/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
index 1617f32..6d4433f 100644
--- a/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
+++ b/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
@@ -208,7 +208,10 @@ public class PlatformHookUnixoid implements PlatformHook {
             String dist = Utils.execOutput(Arrays.asList("lsb_release", "-i", "-s"));
             return "Debian".equalsIgnoreCase(dist) || "Ubuntu".equalsIgnoreCase(dist) || "Mint".equalsIgnoreCase(dist);
         } catch (IOException e) {
-            Main.warn(e);
+            if (Main.isDebugEnabled()) {
+                // lsb_release is not available on all Linux systems, so don't log at warning level
+                Main.debug(e.getMessage());
+            }
             return false;
         }
     }
@@ -231,9 +234,11 @@ public class PlatformHookUnixoid implements PlatformHook {
      */
     public static String getPackageDetails(String ... packageNames) {
         try {
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             boolean dpkg = Files.exists(Paths.get("/usr/bin/dpkg-query"));
             boolean eque = Files.exists(Paths.get("/usr/bin/equery"));
             boolean rpm  = Files.exists(Paths.get("/bin/rpm"));
+            // CHECKSTYLE.ON: SingleSpaceSeparator
             if (dpkg || rpm || eque) {
                 for (String packageName : packageNames) {
                     String[] args;
diff --git a/src/org/openstreetmap/josm/tools/PlatformHookWindows.java b/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
index d13a9c1..f5b996d 100644
--- a/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
+++ b/src/org/openstreetmap/josm/tools/PlatformHookWindows.java
@@ -78,7 +78,7 @@ public class PlatformHookWindows extends PlatformHookUnixoid {
         0x7e, (byte) 0xb9, (byte) 0x96, 0x2c, (byte) 0xeb, (byte) 0x8f, (byte) 0xbc, 0x6e, 0x40, (byte) 0xe6, (byte) 0xe2,
         (byte) 0xfc, (byte) 0xf1, 0x7f, 0x73, (byte) 0xa7, (byte) 0x9d, (byte) 0xde, (byte) 0xc7, (byte) 0x88, 0x57, 0x51,
         (byte) 0x84, (byte) 0xed, (byte) 0x96, (byte) 0xfb, (byte) 0xe1, 0x38, (byte) 0xef, 0x08, 0x2b, (byte) 0xf3,
-        (byte) 0xc7, (byte) 0xc3,  0x5d, (byte) 0xfe, (byte) 0xf9, 0x51, (byte) 0xe6, 0x29, (byte) 0xfc, (byte) 0xe5, 0x0d,
+        (byte) 0xc7, (byte) 0xc3, 0x5d, (byte) 0xfe, (byte) 0xf9, 0x51, (byte) 0xe6, 0x29, (byte) 0xfc, (byte) 0xe5, 0x0d,
         (byte) 0xa1, 0x0d, (byte) 0xa8, (byte) 0xb4, (byte) 0xae, 0x26, 0x18, 0x19, 0x4d, 0x6c, 0x0c, 0x3b, 0x12, (byte) 0xba,
         (byte) 0xbc, 0x5f, 0x32, (byte) 0xb3, (byte) 0xbe, (byte) 0x9d, 0x17, 0x0d, 0x4d, 0x2f, 0x1a, 0x48, (byte) 0xb7,
         (byte) 0xac, (byte) 0xf7, 0x1a, 0x43, 0x01, (byte) 0x97, (byte) 0xf4, (byte) 0xf8, 0x4c, (byte) 0xbb, 0x6a, (byte) 0xbc,
@@ -345,12 +345,15 @@ public class PlatformHookWindows extends PlatformHookUnixoid {
 
     @Override
     public Collection<FontEntry> getAdditionalFonts() {
-        Collection<FontEntry> def = new ArrayList<>();
+        Collection<FontEntry> def = new ArrayList<>(33);
         def.add(new FontEntry("devanagari", "", "")); // just include in fallback list font already defined in template
 
         // Windows scripts: https://msdn.microsoft.com/en-us/goglobal/bb688099.aspx
         // IE default fonts: https://msdn.microsoft.com/en-us/library/ie/dn467844(v=vs.85).aspx
 
+        // Windows 10 and later
+        def.add(new FontEntry("historic", "Segoe UI Historic", "SEGUIHIS.TTF"));       // historic charsets
+
         // Windows 8/8.1 and later
         def.add(new FontEntry("javanese", "Javanese Text", "JAVATEXT.TTF"));           // ISO 639: jv
         def.add(new FontEntry("leelawadee", "Leelawadee", "LEELAWAD.TTF"));            // ISO 639: bug
diff --git a/src/org/openstreetmap/josm/tools/Shortcut.java b/src/org/openstreetmap/josm/tools/Shortcut.java
index 840be39..2448aec 100644
--- a/src/org/openstreetmap/josm/tools/Shortcut.java
+++ b/src/org/openstreetmap/josm/tools/Shortcut.java
@@ -220,7 +220,7 @@ public final class Shortcut {
      * @param button button
      */
     public void setMnemonic(AbstractButton button) {
-        if (assignedModifier == getGroupModifier(MNEMONIC)  && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
+        if (assignedModifier == getGroupModifier(MNEMONIC) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
             button.setMnemonic(KeyEvent.getKeyText(assignedKey).charAt(0)); //getKeyStroke().getKeyChar() seems not to work here
         }
     }
@@ -230,7 +230,7 @@ public final class Shortcut {
      * @param component component
      */
     public void setFocusAccelerator(JTextComponent component) {
-        if (assignedModifier == getGroupModifier(MNEMONIC)  && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
+        if (assignedModifier == getGroupModifier(MNEMONIC) && getKeyStroke() != null && KeyEvent.getKeyText(assignedKey).length() == 1) {
             component.setFocusAccelerator(KeyEvent.getKeyText(assignedKey).charAt(0));
         }
     }
@@ -415,7 +415,7 @@ public final class Shortcut {
         Shortcut potentialShortcut = findShortcut(key, modifier);
         if (potentialShortcut != null) {
             // this always is a logic error in the hook
-            Main.error("CONFLICT WITH SYSTEM KEY "+shortText);
+            Main.error("CONFLICT WITH SYSTEM KEY "+shortText+": "+potentialShortcut);
             return null;
         }
         potentialShortcut = new Shortcut(shortText, longText, key, RESERVED, key, modifier, true, false);
diff --git a/src/org/openstreetmap/josm/tools/TextTagParser.java b/src/org/openstreetmap/josm/tools/TextTagParser.java
index fe78e25..a6aa70b 100644
--- a/src/org/openstreetmap/josm/tools/TextTagParser.java
+++ b/src/org/openstreetmap/josm/tools/TextTagParser.java
@@ -124,7 +124,7 @@ public final class TextTagParser {
             boolean signFound = false;
             while (pos < n) {
                 c = data.charAt(pos);
-                if (c == '\t' || c == '\n'  || c == ' ') {
+                if (c == '\t' || c == '\n' || c == ' ') {
                     pos++;
                 } else if (c == '=') {
                     if (signFound) break; // a  =  =qwerty means "a"="=qwerty"
@@ -176,7 +176,7 @@ public final class TextTagParser {
          Map<String, String> tags = new HashMap<>();
          String k;
          String v;
-         for (String  line: lines) {
+         for (String line: lines) {
             if (line.trim().isEmpty()) continue; // skip empty lines
             Matcher m = p.matcher(line);
             if (m.matches()) {
@@ -194,7 +194,7 @@ public final class TextTagParser {
          }
          if (!tags.isEmpty()) {
             return tags;
-         }  else {
+         } else {
             return null;
          }
     }
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index 10fc99e..bc151aa 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -63,12 +63,15 @@ import java.util.zip.ZipFile;
 import java.util.zip.ZipInputStream;
 
 import javax.xml.XMLConstants;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
 import org.openstreetmap.josm.Main;
+import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -1410,6 +1413,44 @@ public final class Utils {
     }
 
     /**
+     * Returns a new secure DOM builder, supporting XML namespaces.
+     * @return a new secure DOM builder, supporting XML namespaces
+     * @throws ParserConfigurationException if a parser cannot be created which satisfies the requested configuration.
+     * @throws ParserConfigurationException if a parser cannot be created which satisfies the requested configuration.
+     * @since 10404
+     */
+    public static DocumentBuilder newSafeDOMBuilder() throws ParserConfigurationException {
+        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+        builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+        builderFactory.setNamespaceAware(true);
+        builderFactory.setValidating(false);
+        return builderFactory.newDocumentBuilder();
+    }
+
+    /**
+     * Parse the content given {@link InputStream} as XML.
+     * This method uses a secure DOM builder, supporting XML namespaces.
+     *
+     * @param is The InputStream containing the content to be parsed.
+     * @return the result DOM document
+     * @throws ParserConfigurationException if a parser cannot be created which satisfies the requested configuration.
+     * @throws IOException if any IO errors occur.
+     * @throws SAXException for SAX errors.
+     * @since 10404
+     */
+    public static Document parseSafeDOM(InputStream is) throws ParserConfigurationException, IOException, SAXException {
+        long start = System.currentTimeMillis();
+        if (Main.isDebugEnabled()) {
+            Main.debug("Starting DOM parsing of " + is);
+        }
+        Document result = newSafeDOMBuilder().parse(is);
+        if (Main.isDebugEnabled()) {
+            Main.debug("DOM parsing done in " + getDurationString(System.currentTimeMillis() - start));
+        }
+        return result;
+    }
+
+    /**
      * Returns a new secure SAX parser, supporting XML namespaces.
      * @return a new secure SAX parser, supporting XML namespaces
      * @throws ParserConfigurationException if a parser cannot be created which satisfies the requested configuration.
diff --git a/src/org/openstreetmap/josm/tools/WindowGeometry.java b/src/org/openstreetmap/josm/tools/WindowGeometry.java
index 8483e99..5d428ea 100644
--- a/src/org/openstreetmap/josm/tools/WindowGeometry.java
+++ b/src/org/openstreetmap/josm/tools/WindowGeometry.java
@@ -8,6 +8,7 @@ import java.awt.Dimension;
 import java.awt.GraphicsConfiguration;
 import java.awt.GraphicsDevice;
 import java.awt.GraphicsEnvironment;
+import java.awt.IllegalComponentStateException;
 import java.awt.Insets;
 import java.awt.Point;
 import java.awt.Rectangle;
@@ -56,8 +57,9 @@ public class WindowGeometry {
      * Creates a window geometry from the position and the size of a window.
      *
      * @param window the window
+     * @throws IllegalComponentStateException if the window is not showing on the screen
      */
-    public WindowGeometry(Window window)  {
+    public WindowGeometry(Window window) {
         this(window.getLocationOnScreen(), window.getSize());
     }
 
@@ -164,7 +166,7 @@ public class WindowGeometry {
      *
      * @param window the window
      */
-    public void fixScreen(Window window)  {
+    public void fixScreen(Window window) {
         Rectangle oldScreen = getScreenInfo(getRectangle());
         Rectangle newScreen = getScreenInfo(new Rectangle(window.getLocationOnScreen(), window.getSize()));
         if (oldScreen.x != newScreen.x) {
@@ -401,7 +403,7 @@ public class WindowGeometry {
             // Max displayable dimension (max screen dimension - insets)
             Rectangle bounds = gc.getBounds();
             Insets insets = component.getToolkit().getScreenInsets(gc);
-            result.width  = bounds.width  - insets.left - insets.right;
+            result.width = bounds.width - insets.left - insets.right;
             result.height = bounds.height - insets.top - insets.bottom;
         }
         return result;
diff --git a/src/org/openstreetmap/josm/tools/XmlObjectParser.java b/src/org/openstreetmap/josm/tools/XmlObjectParser.java
index 9c3b8eb..cf12342 100644
--- a/src/org/openstreetmap/josm/tools/XmlObjectParser.java
+++ b/src/org/openstreetmap/josm/tools/XmlObjectParser.java
@@ -105,7 +105,7 @@ public class XmlObjectParser implements Iterable<Object> {
                 report();
             } else if (mapping.containsKey(qname) && characters != null && !current.isEmpty()) {
                 setValue(mapping.get(qname), qname, characters.toString().trim());
-                characters  = new StringBuilder(64);
+                characters = new StringBuilder(64);
             }
         }
 
@@ -116,7 +116,7 @@ public class XmlObjectParser implements Iterable<Object> {
 
         private void report() {
             queue.add(current.pop());
-            characters  = new StringBuilder(64);
+            characters = new StringBuilder(64);
         }
 
         private Object getValueForClass(Class<?> klass, String value) {
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
index 16758bf..f74af94 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
@@ -30,12 +30,12 @@ package org.openstreetmap.josm.tools.bugreport;
  * @author Michael Zangl
  * @since 10285
  */
-public class BugReport {
+public final class BugReport {
     /**
      * Create a new bug report
      * @param e The {@link ReportedException} to use. No more data should be added after creating the report.
      */
-    public BugReport(ReportedException e) {
+    private BugReport(ReportedException e) {
         // TODO: Use this class to create the bug report.
     }
 
@@ -62,7 +62,7 @@ public class BugReport {
      *            How many methods to look back in the stack trace. 1 gives the method calling this method, 0 gives you getCallingMethod().
      * @return The method name.
      */
-    static String getCallingMethod(int offset) {
+    public static String getCallingMethod(int offset) {
         StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
         String className = BugReport.class.getName();
         for (int i = 0; i < stackTrace.length - offset; i++) {
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java b/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
index 054eca0..155a1b3 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
@@ -102,7 +102,7 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
                                 String.valueOf(josmVersion), String.valueOf(latestVersion));
                     }
                 } catch (IOException | NumberFormatException ex) {
-                    Main.warn("Unable to detect latest version of JOSM: "+ex.getMessage());
+                    Main.warn(ex, "Unable to detect latest version of JOSM:");
                 }
             }
             // Build panel
@@ -136,7 +136,7 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
                 try {
                     Main.platform.openUrl(Main.getJOSMWebsite());
                 } catch (IOException ex) {
-                    Main.warn("Unable to access JOSM website: "+ex.getMessage());
+                    Main.warn(ex, "Unable to access JOSM website:");
                 }
             } else {
                 // "Report bug"
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReportSender.java b/src/org/openstreetmap/josm/tools/bugreport/BugReportSender.java
index 5e6f39c..04269a5 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReportSender.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReportSender.java
@@ -17,8 +17,6 @@ import java.nio.charset.StandardCharsets;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
@@ -99,9 +97,7 @@ public class BugReportSender extends Thread {
             }
 
             try (InputStream in = connection.getContent()) {
-                DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-                Document document = builder.parse(in);
-                return retrieveDebugToken(document);
+                return retrieveDebugToken(Utils.parseSafeDOM(in));
             }
         } catch (IOException | SAXException | ParserConfigurationException | XPathExpressionException t) {
             throw new BugReportSenderException(t);
diff --git a/src/org/openstreetmap/josm/tools/date/DateUtils.java b/src/org/openstreetmap/josm/tools/date/DateUtils.java
index b956925..c8a3245 100644
--- a/src/org/openstreetmap/josm/tools/date/DateUtils.java
+++ b/src/org/openstreetmap/josm/tools/date/DateUtils.java
@@ -29,9 +29,10 @@ import org.openstreetmap.josm.tools.UncheckedParseException;
  */
 public final class DateUtils {
 
-    protected DateUtils() {
-        // Hide default constructor for utils classes
-    }
+    /**
+     * The UTC time zone.
+     */
+    public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
 
     /**
      * Property to enable display of ISO dates globally.
@@ -45,7 +46,10 @@ public final class DateUtils {
      * The shared instance is used because the construction, together
      * with the timezone lookup, is very expensive.
      */
-    private static final GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
+    private static final GregorianCalendar calendar = new GregorianCalendar(UTC);
+    /**
+     * A shared instance to convert local times. The time zone should be set before every conversion.
+     */
     private static final GregorianCalendar calendarLocale = new GregorianCalendar(TimeZone.getDefault());
     private static final DatatypeFactory XML_DATE;
 
@@ -62,13 +66,17 @@ public final class DateUtils {
         XML_DATE = fact;
     }
 
+    protected DateUtils() {
+        // Hide default constructor for utils classes
+    }
+
     /**
      * Parses XML date quickly, regardless of current locale.
      * @param str The XML date as string
      * @return The date
      * @throws UncheckedParseException if the date does not match any of the supported date formats
      */
-    public static synchronized Date fromString(String str) throws UncheckedParseException {
+    public static synchronized Date fromString(String str) {
         return new Date(tsFromString(str));
     }
 
@@ -78,7 +86,7 @@ public final class DateUtils {
      * @return The date in milliseconds since epoch
      * @throws UncheckedParseException if the date does not match any of the supported date formats
      */
-    public static synchronized long tsFromString(String str) throws UncheckedParseException {
+    public static synchronized long tsFromString(String str) {
         // "2007-07-25T09:26:24{Z|{+|-}01[:00]}"
         if (checkLayout(str, "xxxx-xx-xxTxx:xx:xxZ") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx") ||
@@ -88,7 +96,12 @@ public final class DateUtils {
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx-xx") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx+xx:00") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx-xx:00")) {
-            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx") ? calendarLocale : calendar; // consider EXIF date in default timezone
+            final Calendar c; // consider EXIF date in default timezone
+            if (checkLayout(str, "xxxx:xx:xx xx:xx:xx")) {
+                c = getLocalCalendar();
+            } else {
+                c = calendar;
+            }
             c.set(
                 parsePart4(str, 0),
                 parsePart2(str, 5)-1,
@@ -110,7 +123,8 @@ public final class DateUtils {
                 checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx+xx:00") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx-xx:00")) {
-            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? calendarLocale : calendar; // consider EXIF date in default timezone
+            // consider EXIF date in default timezone
+            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? getLocalCalendar() : calendar;
             c.set(
                 parsePart4(str, 0),
                 parsePart2(str, 5)-1,
@@ -140,6 +154,12 @@ public final class DateUtils {
         }
     }
 
+    private static Calendar getLocalCalendar() {
+        final Calendar c = calendarLocale;
+        c.setTimeZone(TimeZone.getDefault());
+        return c;
+    }
+
     private static String toXmlFormat(GregorianCalendar cal) {
         XMLGregorianCalendar xgc = XML_DATE.newXMLGregorianCalendar(cal);
         if (cal.get(Calendar.MILLISECOND) == 0) {
@@ -309,12 +329,4 @@ public final class DateUtils {
         CheckParameterUtil.ensureParameterNotNull(datetime, "datetime");
         return getDateTimeFormat(dateStyle, timeStyle).format(datetime);
     }
-
-    /**
-     * Allows to override the timezone for unit tests.
-     * @param zone the timezone to use
-     */
-    protected static synchronized void setTimeZone(TimeZone zone) {
-        calendarLocale.setTimeZone(zone);
-    }
 }
diff --git a/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java b/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java
index de6a25a..c003aa7 100644
--- a/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java
+++ b/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java
@@ -107,7 +107,7 @@ public class TemplateParser {
             skipWhitespace();
 
             Token token = tokenizer.lookAhead();
-            if (token.getType()  == TokenType.END) {
+            if (token.getType() == TokenType.END) {
                 tokenizer.nextToken();
                 return result;
             } else {
diff --git a/styles/standard/elemstyles.mapcss b/styles/standard/elemstyles.mapcss
index 6beb051..f763e88 100644
--- a/styles/standard/elemstyles.mapcss
+++ b/styles/standard/elemstyles.mapcss
@@ -451,12 +451,9 @@ node[barrier=spikes] {
     icon-image: "vehicle/spikes.svg";
     set icon_z17;
 }
-node[barrier=fence][!is_prop_set(icon-image)],
 node[barrier=kissing_gate][!is_prop_set(icon-image)],
 node[barrier=bump_gate][!is_prop_set(icon-image)],
-node[barrier=portcullis][!is_prop_set(icon-image)],
 node[barrier=bus_trap][!is_prop_set(icon-image)],
-node[barrier=drawbridge][!is_prop_set(icon-image)],
 node[barrier=jersey_barrier][!is_prop_set(icon-image)],
 node[barrier=hampshire_gate][!is_prop_set(icon-image)] {
     icon-image: "misc/no_icon.png";
@@ -706,7 +703,7 @@ node[traffic_sign=city_limit] {
     icon-image: "vehicle/restriction/city_limit.svg";
     set icon_z17;
 }
-node[highway=crossing] {
+node[highway=crossing][crossing!=no] {
     icon-image: "vehicle/crossing.svg";
     set icon_z17;
 }
@@ -1712,7 +1709,7 @@ node[leisure=common] {
     set icon_z17;
 }
 node[leisure=firepit] { 
-    icon-image: "leisure/firepit.svg"; 
+    icon-image: "leisure/firepit.svg";
     set icon_z17;
 }
 node[leisure=picnic_table] {
@@ -2473,7 +2470,7 @@ node[amenity=toilets] {
     set icon_z17;
 }
 node[amenity=shower] { 
-    icon-image: "service/shower.svg"; 
+    icon-image: "service/shower.svg";
     set icon_z17;
 }
 node[amenity=recycling] {
@@ -2739,8 +2736,7 @@ node[amenity=bus_station] {
     set icon_z17;
 }
 node[amenity=ferry_terminal] {
-    icon-image: "nautical/ferry.png";
-    icon-width: 16;
+    icon-image: "nautical/ferry.svg";
     set icon_z17;
 }
 node[amenity=theatre] {
@@ -3277,83 +3273,19 @@ node[military=range] {
     set icon_z17;
 }
 
-/*************************/
-/* public_transport tags */
-/*************************/
-
-node[public_transport=stop_position] {
-    icon-image: "transport/railway_small.png";
-    set icon_z17;
-}
-node[highway=bus_stop] {
-    icon-image: "transport/bus_small.png";
-    set icon_z17;
-}
-node[public_transport=stop_position][bus=yes] {
-    icon-image: "transport/bus_small.png";
-    set icon_z17;
-}
-node[public_transport=stop_position][aerial=yes] {
-    icon-image: "transport/aerialway.png";
-    set icon_z17;
-}
-node[public_transport=stop_position][ferry=yes] {
-    icon-image: "transport/ferry.png";
-    set icon_z17;
-}
-node[public_transport=stop_position][tram=yes] {
-    icon-image: "transport/tram.png";
-    set icon_z17;
-}
-node[public_transport=stop_position][train=yes] {
-    icon-image: "transport/railway_small.png";
-    set icon_z17;
-}
-area[public_transport=platform]:closed {
-    fill-color: service#809bc0;
-}
-way[public_transport=platform]!:closed {
-    width: 3;
-    color: service#809bc0;
-    dashes: 12,3;
-}
-node[public_transport=platform] {
-    icon-image: "transport/bus_small.png";
-    set icon_z17;
-}
-node[public_transport=platform][bus=yes] {
-    icon-image: "transport/bus_small.png";
-    set icon_z17;
-}
-node[public_transport=platform][aerial=yes] {
-    icon-image: "transport/aerialway/station.png";
-    set icon_z17;
-}
-node[public_transport=platform][ferry=yes] {
-    icon-image: "transport/ferry.png";
-    set icon_z17;
-}
-node[public_transport=platform][tram=yes],
-node[public_transport=platform][train=yes] {
-    icon-image: "transport/railway_station.png";
-    set icon_z17;
-}
-
 /****************/
 /* railway tags */
 /****************/
 
-area[railway=station],
-area[railway=tram_station],
-area[railway=subway_entrance] {
+area[railway=station] {
     fill-color: railwaypoint#f7efb7;
 }
-node[railway=station], node[railway=tram_station] {
+node[railway=station] {
     icon-image: "transport/railway_station.png";
     set icon_z17;
 }
 node[railway=halt] {
-    icon-image: "transport/railway_small.png";
+    icon-image: "presets/station16.png";
     set icon_z17;
 }
 node[railway=tram_stop] {
@@ -3681,6 +3613,78 @@ node[aerialway=goods] {
     set icon_z17;
 }
 
+/*************************/
+/* public_transport tags */
+/*************************/
+
+node[highway=bus_stop] {
+    icon-image: "transport/bus_small.png";
+    set icon_z17;
+}
+node[public_transport=stop_position] {
+    icon-image: "transport/railway_small.png";
+    set icon_z17;
+}
+node[public_transport=stop_position][share_taxi=yes] {
+    icon-image: "transport/share_taxi.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][bus=yes] {
+    icon-image: "transport/bus.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][train=yes] {
+    icon-image: "transport/train.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][tram=yes] {
+    icon-image: "transport/railway/tram.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][subway=yes] {
+    icon-image: "transport/railway/subway.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][monorail=yes] {
+    icon-image: "transport/railway/monorail.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][trolleybus=yes] {
+    icon-image: "transport/trolleybus.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][funicular=yes] {
+    icon-image: "transport/funicular.svg";
+    set icon_z17;
+}
+node[public_transport=stop_position][aerialway=yes] {
+    icon-image: "transport/aerialway/station.png";
+    set icon_z17;
+}
+node[public_transport=stop_position][ferry=yes] {
+    icon-image: "nautical/ferry.svg";
+    set icon_z17;
+}
+area[public_transport=platform]:closed {
+    fill-color: service#809bc0;
+}
+way[public_transport=platform]!:closed {
+    width: 3;
+    color: service#809bc0;
+    dashes: 12,3;
+}
+node[public_transport=platform] {
+    icon-image: "transport/platform.svg";
+    set icon_z17;
+}
+area[public_transport=station] {
+    fill-color: railwaypoint#f7efb7;
+}
+node[public_transport=station] {
+    icon-image: "transport/station.svg";
+    set icon_z17;
+}
+
 /**************/
 /* sport tags */
 /**************/
@@ -4060,7 +4064,7 @@ area[natural=wetland] {
 area[natural=water] {
     fill-color: water#0000ff;
 }
-way[natural=water][intermittent=yes] {
+area[natural=water][intermittent=yes] {
     width: 2;
     dashes: 15, 5;
 }
@@ -4069,7 +4073,7 @@ way[natural=coastline] {
     color: water#0000ff;
     right-casing-color: water#0000ff;
     right-casing-width: 5;
-    right-casing-opacity: 0.30; 
+    right-casing-opacity: 0.30;
 }
 area[natural=mud] {
     fill-color: mud#cba762;
@@ -4175,7 +4179,7 @@ way[waterway=drain] {
     color: water#0000ff;
 }
 way[waterway=river][intermittent=yes],
-way[waterway=riverbank][intermittent=yes],
+area[waterway=riverbank][intermittent=yes],
 way[waterway=canal][intermittent=yes],
 way[waterway=stream][intermittent=yes],
 way[waterway=ditch][intermittent=yes],
@@ -4436,22 +4440,6 @@ node|z-16[prop(maxspeedclass, default)][setting("hide_icons")]::core_maxnodefg {
 /* place tags */
 /**************/
 
-/* lot's of "openGeoDB:..." tags can be found in germany */
-node["openGeoDB:type"=Stadt],
-node["openGeoDB:type"=Kreis],
-node["openGeoDB:type"=Gemeinde],
-node["openGeoDB:type"=Ort],
-node["openGeoDB:type"=District],
-node["openGeoDB:location"=locality] {
-    icon-image: "place/settlement/openGeoDB.png";
-    set icon_z0;
-    set text_z0;
-    font-size: 10;
-    font-weight: bold;
-    text-color:black;
-    text-halo-color: white;
-    text-halo-radius: 1;
-}
 area[setting("place_fill_colour")][place=continent],
 area[setting("place_fill_colour")][place=country],
 area[setting("place_fill_colour")][place=state],
@@ -4469,6 +4457,7 @@ area[setting("place_fill_colour")][place=locality],
 area[setting("place_fill_colour")][place=island],
 area[setting("place_fill_colour")][place=islet] {
     fill-color: place#8de3cb;
+    set place;
 }
 node[place=continent],
 node[place=country],
@@ -4487,11 +4476,11 @@ node[place=island],
 node[place=islet] {
     set icon_z0;
     set text_z0;
-    font-size: 10;
     font-weight: bold;
     text-color:black;
     text-halo-color: white;
     text-halo-radius: 1;
+    set place;
 }
 
 node[place=continent],
@@ -4537,7 +4526,6 @@ node[place=farm] {
 node|z15-[place=locality],
 node|z-14[place=locality][!setting("hide_icons")] {
     icon-image: "place/locality.png";
-    font-size: 10;
     font-weight: bold;
     text-color:black;
     text-halo-color: white;
@@ -4595,7 +4583,7 @@ Summary of different zoom levels:
                 street name along highway=* ways
   |z18-         text for normal POI icons is shown
   
- * text size and node size is adapted according to zoom level (see style source below)
+ * text size and node size is adapted according to zoom level (see style source below), place labels (except locality) don't get smaller
  * maxspeed icons should not be distinguishable from POIs with "icon-image" property
 
 */
@@ -4659,6 +4647,9 @@ node|z-18,area|z-18 { font-size: 8; }
 node|z19,area|z19   { font-size: 9; }
 node|z20-,area|z20- { font-size: 11; }
 
+node.place, way.place, area.place { font-size: 11; }
+
+
 /*******************/
 /* way text labels */
 /*******************/
diff --git a/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java b/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java
index 8a4cc99..b922b63 100644
--- a/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java
+++ b/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java
@@ -31,7 +31,7 @@ public class TagMergerTestFT extends JFrame {
     }
 
     public static void main(String[] args) {
-        TagMergerTestFT test  = new TagMergerTestFT();
+        TagMergerTestFT test = new TagMergerTestFT();
         test.setSize(600, 600);
         test.setVisible(true);
     }
diff --git a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
index eb293b5..0534f79 100644
--- a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
@@ -137,7 +137,7 @@ public class OsmServerBackreferenceReaderTest {
         logger.info("creating data set on the server ...");
         ds.adjustRelationUploadOrder();
         OsmServerWriter writer = new OsmServerWriter();
-        Changeset cs  = new Changeset();
+        Changeset cs = new Changeset();
         writer.uploadOsm(
                 new UploadStrategySpecification().setStrategy(UploadStrategy.SINGLE_REQUEST_STRATEGY),
                 ds.getPrimitives(), cs, NullProgressMonitor.INSTANCE);
diff --git a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
index 63e4e75..a5a670d 100644
--- a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
+++ b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
@@ -21,7 +21,7 @@ public class UploadStrategySelectionPanelTest extends JFrame {
 
     protected UploadStrategySelectionPanel uploadStrategySelectionPanel;
 
-    protected void build()  {
+    protected void build() {
         getContentPane().setLayout(new BorderLayout());
         uploadStrategySelectionPanel = new UploadStrategySelectionPanel();
         getContentPane().add(uploadStrategySelectionPanel, BorderLayout.CENTER);
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java
index ab38a03..1b5bbc2 100644
--- a/test/unit/org/openstreetmap/josm/JOSMFixture.java
+++ b/test/unit/org/openstreetmap/josm/JOSMFixture.java
@@ -1,6 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm;
 
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
@@ -9,11 +11,13 @@ import java.nio.file.Paths;
 import java.security.GeneralSecurityException;
 import java.text.MessageFormat;
 import java.util.Locale;
+import java.util.TimeZone;
 
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.LayerManagerTest.TestLayer;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.CertificateAmendment;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.tools.I18n;
@@ -85,6 +89,7 @@ public class JOSMFixture {
             }
         }
         System.setProperty("josm.home", josmHome);
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
         Main.initApplicationPreferences();
         Main.pref.enableSaveOnPut(false);
         I18n.init();
@@ -93,6 +98,7 @@ public class JOSMFixture {
         // call the really early hook before we anything else
         Main.platform.preStartupHook();
 
+        Main.logLevel = 3;
         Main.pref.init(false);
         I18n.set(Main.pref.get("language", "en"));
 
@@ -114,19 +120,30 @@ public class JOSMFixture {
         }
 
         if (createGui) {
-            if (Main.toolbar == null) {
-                Main.toolbar = new ToolbarPreferences();
-            }
-            if (Main.main == null) {
-                new MainApplication();
-            }
-            if (Main.map == null) {
-                Main.main.createMapFrame(null, null);
-            } else {
-                for (Layer l: Main.map.mapView.getAllLayers()) {
-                    Main.map.mapView.removeLayer(l);
+            GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+                @Override
+                public void run() {
+                    setupGUI();
                 }
-            }
+            });
+        }
+    }
+
+    private void setupGUI() {
+        Main.getLayerManager().resetState();
+        assertTrue(Main.getLayerManager().getLayers().isEmpty());
+        assertNull(Main.getLayerManager().getEditLayer());
+        assertNull(Main.getLayerManager().getActiveLayer());
+
+        if (Main.toolbar == null) {
+            Main.toolbar = new ToolbarPreferences();
+        }
+        if (Main.main == null) {
+            new MainApplication().initialize();
+        } else {
+            Main.mainPanel.reAddListeners();
         }
+        // Add a test layer to the layer manager to get the MapFrame
+        Main.getLayerManager().addLayer(new TestLayer());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/MainTest.java b/test/unit/org/openstreetmap/josm/MainTest.java
index 3e6f015..2b4bcb3 100644
--- a/test/unit/org/openstreetmap/josm/MainTest.java
+++ b/test/unit/org/openstreetmap/josm/MainTest.java
@@ -6,15 +6,12 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.awt.Dimension;
-import java.awt.Point;
 import java.util.Collection;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.Main.DownloadParamType;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.tools.WindowGeometry;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -51,7 +48,7 @@ public class MainTest {
     public void testPreConstructorInit() {
         Main.preConstructorInit(MainApplication.buildCommandLineArgumentMap(new String[0]));
         Main.preConstructorInit(MainApplication.buildCommandLineArgumentMap(new String[]{"--geometry=400x300+10+5", "--no-maximize"}));
-        assertEquals(new WindowGeometry(new Point(10, 5), new Dimension(400, 300)), Main.geometry);
+        //assertEquals(new WindowGeometry(new Point(10, 5), new Dimension(400, 300)), Main.geometry); // FIXME see #12927
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/TestUtils.java b/test/unit/org/openstreetmap/josm/TestUtils.java
index 453b503..11507e4 100644
--- a/test/unit/org/openstreetmap/josm/TestUtils.java
+++ b/test/unit/org/openstreetmap/josm/TestUtils.java
@@ -3,37 +3,13 @@ package org.openstreetmap.josm;
 
 import static org.junit.Assert.fail;
 
-import java.awt.Canvas;
-import java.awt.Color;
 import java.awt.Component;
-import java.awt.Composite;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
 import java.awt.Graphics2D;
-import java.awt.GraphicsConfiguration;
-import java.awt.Image;
-import java.awt.Paint;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.RenderingHints.Key;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.geom.AffineTransform;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ImageObserver;
-import java.awt.image.RenderedImage;
-import java.awt.image.renderable.RenderableImage;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.text.AttributedCharacterIterator;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.Map;
 
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmUtils;
@@ -45,6 +21,7 @@ import org.openstreetmap.josm.gui.progress.CancelHandler;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressTaskId;
 import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.testutils.FakeGraphics;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -231,328 +208,14 @@ public final class TestUtils {
         };
     }
 
-    // CHECKSTYLE.OFF: AnonInnerLength
-    // CHECKSTYLE.OFF: MethodLength
-    // CHECKSTYLE.OFF: ParameterNumber
-
     /**
      * Returns an instance of {@link Graphics2D}.
      * @return a mockup graphics instance
      */
     public static Graphics2D newGraphics() {
-        return new Graphics2D() {
-
-            @Override
-            public void setXORMode(Color c1) {
-            }
-
-            @Override
-            public void setPaintMode() {
-            }
-
-            @Override
-            public void setFont(Font font) {
-            }
-
-            @Override
-            public void setColor(Color c) {
-            }
-
-            @Override
-            public void setClip(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void setClip(Shape clip) {
-            }
-
-            @Override
-            public FontMetrics getFontMetrics(Font f) {
-                return new Canvas().getFontMetrics(getFont());
-            }
-
-            @Override
-            public Font getFont() {
-                return new Font(null, 0, 0);
-            }
-
-            @Override
-            public Color getColor() {
-                return null;
-            }
-
-            @Override
-            public Rectangle getClipBounds() {
-                return null;
-            }
-
-            @Override
-            public Shape getClip() {
-                return null;
-            }
-
-            @Override
-            public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-            }
-
-            @Override
-            public void fillRect(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-            }
-
-            @Override
-            public void fillOval(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-            }
-
-            @Override
-            public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
-            }
-
-            @Override
-            public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
-            }
-
-            @Override
-            public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
-            }
-
-            @Override
-            public void drawOval(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void drawLine(int x1, int y1, int x2, int y2) {
-            }
-
-            @Override
-            public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
-                    Color bgcolor, ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
-                    ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
-                return false;
-            }
-
-            @Override
-            public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
-            }
-
-            @Override
-            public void dispose() {
-            }
-
-            @Override
-            public Graphics create() {
-                return this;
-            }
-
-            @Override
-            public void copyArea(int x, int y, int width, int height, int dx, int dy) {
-            }
-
-            @Override
-            public void clipRect(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void clearRect(int x, int y, int width, int height) {
-            }
-
-            @Override
-            public void translate(double tx, double ty) {
-            }
-
-            @Override
-            public void translate(int x, int y) {
-            }
-
-            @Override
-            public void transform(AffineTransform Tx) {
-            }
-
-            @Override
-            public void shear(double shx, double shy) {
-            }
-
-            @Override
-            public void setTransform(AffineTransform Tx) {
-            }
-
-            @Override
-            public void setStroke(Stroke s) {
-            }
-
-            @Override
-            public void setRenderingHints(Map<?, ?> hints) {
-            }
-
-            @Override
-            public void setRenderingHint(Key hintKey, Object hintValue) {
-            }
-
-            @Override
-            public void setPaint(Paint paint) {
-            }
-
-            @Override
-            public void setComposite(Composite comp) {
-            }
-
-            @Override
-            public void setBackground(Color color) {
-            }
-
-            @Override
-            public void scale(double sx, double sy) {
-            }
-
-            @Override
-            public void rotate(double theta, double x, double y) {
-            }
-
-            @Override
-            public void rotate(double theta) {
-            }
-
-            @Override
-            public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
-                return false;
-            }
-
-            @Override
-            public AffineTransform getTransform() {
-                return null;
-            }
-
-            @Override
-            public Stroke getStroke() {
-                return null;
-            }
-
-            @Override
-            public RenderingHints getRenderingHints() {
-                return null;
-            }
-
-            @Override
-            public Object getRenderingHint(Key hintKey) {
-                return null;
-            }
-
-            @Override
-            public Paint getPaint() {
-                return null;
-            }
-
-            @Override
-            public FontRenderContext getFontRenderContext() {
-                return new FontRenderContext(null, false, false);
-            }
-
-            @Override
-            public GraphicsConfiguration getDeviceConfiguration() {
-                return null;
-            }
-
-            @Override
-            public Composite getComposite() {
-                return null;
-            }
-
-            @Override
-            public Color getBackground() {
-                return null;
-            }
-
-            @Override
-            public void fill(Shape s) {
-            }
-
-            @Override
-            public void drawString(AttributedCharacterIterator iterator, float x, float y) {
-            }
-
-            @Override
-            public void drawString(AttributedCharacterIterator iterator, int x, int y) {
-            }
-
-            @Override
-            public void drawString(String str, float x, float y) {
-            }
-
-            @Override
-            public void drawString(String str, int x, int y) {
-            }
-
-            @Override
-            public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
-            }
-
-            @Override
-            public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
-            }
-
-            @Override
-            public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
-            }
-
-            @Override
-            public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
-                return false;
-            }
-
-            @Override
-            public void drawGlyphVector(GlyphVector g, float x, float y) {
-            }
-
-            @Override
-            public void draw(Shape s) {
-            }
-
-            @Override
-            public void clip(Shape s) {
-            }
-
-            @Override
-            public void addRenderingHints(Map<?, ?> hints) {
-            }
-        };
+        return new FakeGraphics();
     }
 
-    // CHECKSTYLE.ON: ParameterNumber
-    // CHECKSTYLE.ON: MethodLength
-    // CHECKSTYLE.ON: AnonInnerLength
-
     /**
      * Creates a new way with the given tags (see {@link OsmUtils#createPrimitive(java.lang.String)}) and the nodes added
      *
diff --git a/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java b/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
index da3a1f8..7c9ee79 100644
--- a/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
@@ -7,26 +7,26 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.List;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.gui.layer.TMSLayer;
 import org.openstreetmap.josm.gui.layer.WMSLayer;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests for class {@link AddImageryLayerAction}.
  */
 public final class AddImageryLayerActionTest {
-
     /**
-     * Setup test.
+     * We need prefs for this. We need platform for actions and the OSM API for checking blacklist.
      */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().platform().fakeAPI();
 
     /**
      * Unit test of {@link AddImageryLayerAction#updateEnabledState}.
@@ -34,7 +34,6 @@ public final class AddImageryLayerActionTest {
     @Test
     public void testEnabledState() {
         assertFalse(new AddImageryLayerAction(new ImageryInfo()).isEnabled());
-        assertFalse(new AddImageryLayerAction(new ImageryInfo("google", "http://maps.google.com/api", "tms", null, null)).isEnabled());
         assertTrue(new AddImageryLayerAction(new ImageryInfo("foo_tms", "http://bar", "tms", null, null)).isEnabled());
         assertTrue(new AddImageryLayerAction(new ImageryInfo("foo_bing", "http://bar", "bing", null, null)).isEnabled());
         assertTrue(new AddImageryLayerAction(new ImageryInfo("foo_scanex", "http://bar", "scanex", null, null)).isEnabled());
@@ -46,20 +45,20 @@ public final class AddImageryLayerActionTest {
      */
     @Test
     public void testActionPerformedEnabled() {
-        assertTrue(Main.map.mapView.getLayersOfType(TMSLayer.class).isEmpty());
+        assertTrue(Main.getLayerManager().getLayersOfType(TMSLayer.class).isEmpty());
         new AddImageryLayerAction(new ImageryInfo("foo_tms", "http://bar", "tms", null, null)).actionPerformed(null);
-        List<TMSLayer> tmsLayers = Main.map.mapView.getLayersOfType(TMSLayer.class);
+        List<TMSLayer> tmsLayers = Main.getLayerManager().getLayersOfType(TMSLayer.class);
         assertEquals(1, tmsLayers.size());
 
         try {
             new AddImageryLayerAction(new ImageryInfo("wms.openstreetmap.fr", "http://wms.openstreetmap.fr/wms?",
                     "wms_endpoint", null, null)).actionPerformed(null);
-            List<WMSLayer> wmsLayers = Main.map.mapView.getLayersOfType(WMSLayer.class);
+            List<WMSLayer> wmsLayers = Main.getLayerManager().getLayersOfType(WMSLayer.class);
             assertEquals(1, wmsLayers.size());
 
-            Main.map.mapView.removeLayer(wmsLayers.get(0));
+            Main.getLayerManager().removeLayer(wmsLayers.get(0));
         } finally {
-            Main.map.mapView.removeLayer(tmsLayers.get(0));
+            Main.getLayerManager().removeLayer(tmsLayers.get(0));
         }
     }
 
@@ -68,8 +67,8 @@ public final class AddImageryLayerActionTest {
      */
     @Test
     public void testActionPerformedDisabled() {
-        assertTrue(Main.map.mapView.getLayersOfType(TMSLayer.class).isEmpty());
+        assertTrue(Main.getLayerManager().getLayersOfType(TMSLayer.class).isEmpty());
         new AddImageryLayerAction(new ImageryInfo()).actionPerformed(null);
-        assertTrue(Main.map.mapView.getLayersOfType(TMSLayer.class).isEmpty());
+        assertTrue(Main.getLayerManager().getLayersOfType(TMSLayer.class).isEmpty());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java b/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
index 2f5c4b7..d8210b6 100644
--- a/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/AlignInLineActionTest.java
@@ -2,11 +2,14 @@
 package org.openstreetmap.josm.actions;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AlignInLineAction.InvalidSelection;
+import org.openstreetmap.josm.actions.AlignInLineAction.Line;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -55,7 +58,7 @@ public final class AlignInLineActionTest {
         Node point3 = new Node(new EastNorth(1, 1));
 
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
 
             // Create an open way.
             createWay(dataSet, point1, point2, point3);
@@ -66,7 +69,7 @@ public final class AlignInLineActionTest {
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Points 1 and 3 are the extremities and must not have moved. Only point 2 must have moved.
@@ -95,7 +98,7 @@ public final class AlignInLineActionTest {
         Node point4 = new Node(new EastNorth(0, 2));
 
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
 
             // Create a closed way.
             createWay(dataSet, point1, point2, point3, point4, point1);
@@ -105,7 +108,7 @@ public final class AlignInLineActionTest {
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Only point 1 must have moved.
@@ -135,7 +138,7 @@ public final class AlignInLineActionTest {
         Node point4 = new Node(new EastNorth(2, 0));
 
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
 
             // Create 2 ways.
             createWay(dataSet, point1, point2);
@@ -148,7 +151,7 @@ public final class AlignInLineActionTest {
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         assertCoordEq(point1, 0, 2);
@@ -188,4 +191,38 @@ public final class AlignInLineActionTest {
         assertEquals("Wrong x coordinate.", x, coordinate.getX(), LatLon.MAX_SERVER_PRECISION);
         assertEquals("Wrong y coordinate.", y, coordinate.getY(), LatLon.MAX_SERVER_PRECISION);
     }
+
+    /**
+     * Test that a {@link Line} can be constructed with nodes of different coordinates.
+     * @throws InvalidSelection never
+     */
+    @Test
+    public void testLineDifferentCoordinates() throws InvalidSelection {
+        assertNotNull(new Line(new Node(new EastNorth(0, 1)),
+                               new Node(new EastNorth(0, 2))));
+        assertNotNull(new Line(new Node(new EastNorth(0, 1)),
+                               new Node(new EastNorth(1, 1))));
+        assertNotNull(new Line(new Node(new EastNorth(0, 1)),
+                               new Node(new EastNorth(0+1e-150, 1+1e-150))));
+    }
+
+    /**
+     * Test that a {@link Line} cannot be constructed with nodes of same coordinates.
+     * @throws InvalidSelection always
+     */
+    @Test(expected = InvalidSelection.class)
+    public void testLineSameCoordinates1() throws InvalidSelection {
+        new Line(new Node(new EastNorth(0, 1)),
+                 new Node(new EastNorth(0, 1)));
+    }
+
+    /**
+     * Test that a {@link Line} cannot be constructed with nodes of same coordinates.
+     * @throws InvalidSelection always
+     */
+    @Test(expected = InvalidSelection.class)
+    public void testLineSameCoordinates2() throws InvalidSelection {
+        new Line(new Node(new EastNorth(0, 1)),
+                 new Node(new EastNorth(0+1e-175, 1+1e-175)));
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java b/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
index ee1d0be..464c4b9 100644
--- a/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
@@ -93,11 +93,11 @@ public final class CreateCircleActionTest {
         CreateCircleAction action = new CreateCircleAction();
         action.setEnabled(true);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Expected result: Dataset contain one closed way, clockwise
@@ -169,11 +169,11 @@ public final class CreateCircleActionTest {
         CreateCircleAction action = new CreateCircleAction();
         action.setEnabled(true);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Expected result: Dataset contain one closed way, clockwise
diff --git a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
index 4aa0026..231f693 100644
--- a/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/JoinAreasActionTest.java
@@ -5,6 +5,7 @@ import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collection;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -13,10 +14,13 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Unit tests of {@link JoinAreasAction} class.
@@ -41,13 +45,13 @@ public class JoinAreasActionTest {
         try (InputStream is = TestUtils.getRegressionDataStream(10511, "10511_mini.osm")) {
             DataSet ds = OsmReader.parseDataSet(is, null);
             Layer layer = new OsmDataLayer(ds, null, null);
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             // FIXME enable this test after we fix the bug. Test disabled for now
             // try {
             //     new JoinAreasAction().join(ds.getWays());
             // } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
             // }
         }
     }
@@ -63,19 +67,17 @@ public class JoinAreasActionTest {
             DataSet ds = OsmReader.parseDataSet(is, null);
             assertEquals(10, ds.getWays().size());
             Layer layer = new OsmDataLayer(ds, null, null);
-            Main.main.addLayer(layer);
-            try {
-                for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
-                    System.out.print("Joining ways " + ref);
-                    SearchAction.search("type:way ref="+ref, SearchAction.SearchMode.replace);
-                    assertEquals(2, ds.getSelectedWays().size());
-                    Main.main.menu.joinAreas.join(ds.getSelectedWays());
-                    assertEquals(1, ds.getSelectedWays().size());
-                    System.out.println(" ==> OK");
-                }
-            } finally {
-                // Ensure we clean the place before leaving, even if test fails.
-                Main.main.removeLayer(layer);
+            Main.getLayerManager().addLayer(layer);
+            for (String ref : new String[]{"A", "B", "C", "D", "E"}) {
+                System.out.print("Joining ways " + ref);
+                Collection<OsmPrimitive> found = SearchAction.searchAndReturn("type:way ref="+ref, SearchAction.SearchMode.replace);
+                assertEquals(2, found.size());
+
+                Main.main.menu.joinAreas.join(Utils.filteredCollection(found, Way.class));
+
+                Collection<OsmPrimitive> found2 = SearchAction.searchAndReturn("type:way ref="+ref, SearchAction.SearchMode.replace);
+                assertEquals(1, found2.size());
+                System.out.println(" ==> OK");
             }
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/actions/OrthogonalizeActionTest.java b/test/unit/org/openstreetmap/josm/actions/OrthogonalizeActionTest.java
index 89bd4b1..a813187 100644
--- a/test/unit/org/openstreetmap/josm/actions/OrthogonalizeActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/OrthogonalizeActionTest.java
@@ -95,7 +95,7 @@ public class OrthogonalizeActionTest {
 
     void verifyRectangleClockwise(final Way way) {
         for (int i = 1; i < way.getNodesCount() - 1; i++) {
-            assertEquals(-Math.PI / 2,  Geometry.getCornerAngle(
+            assertEquals(-Math.PI / 2, Geometry.getCornerAngle(
                     way.getNode(i - 1).getEastNorth(), way.getNode(i).getEastNorth(), way.getNode(i + 1).getEastNorth()), 1e-6);
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/actions/PurgeActionTest.java b/test/unit/org/openstreetmap/josm/actions/PurgeActionTest.java
index 8d5548c..de7fba3 100644
--- a/test/unit/org/openstreetmap/josm/actions/PurgeActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/PurgeActionTest.java
@@ -43,7 +43,7 @@ public class PurgeActionTest {
         try (InputStream is = TestUtils.getRegressionDataStream(12038, "data.osm")) {
             DataSet ds = OsmReader.parseDataSet(is, null);
             OsmDataLayer layer = new OsmDataLayer(ds, null, null);
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             try {
                 for (Way w : ds.getWays()) {
                     if (w.getId() == 222191929L) {
@@ -59,7 +59,7 @@ public class PurgeActionTest {
                 }
             } finally {
                 // Ensure we clean the place before leaving, even if test fails.
-                Main.main.removeLayer(layer);
+                Main.getLayerManager().removeLayer(layer);
             }
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/actions/SelectByInternalPointActionTest.java b/test/unit/org/openstreetmap/josm/actions/SelectByInternalPointActionTest.java
index ad668d1..6e0a1b2 100644
--- a/test/unit/org/openstreetmap/josm/actions/SelectByInternalPointActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/SelectByInternalPointActionTest.java
@@ -6,9 +6,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -18,6 +17,7 @@ import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 /**
  * Unit tests for class {@link SelectByInternalPointAction}.
@@ -27,20 +27,15 @@ public final class SelectByInternalPointActionTest {
     /**
      * Setup test.
      */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    public JOSMTestRules rules = new JOSMTestRules().preferences().projection();
 
     /**
      * Unit test - no dataset.
      */
     @Test
     public void testNoDataSet() {
-        while (Main.main.hasEditLayer()) {
-            Main.main.removeLayer(Main.main.getEditLayer());
-        }
-        assertNull(JosmAction.getCurrentDataSet());
+        assertNull(Main.getLayerManager().getEditDataSet());
         assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(null).size());
         assertNull(SelectByInternalPointAction.getSmallestSurroundingObject(null));
         SelectByInternalPointAction.performSelection(null, false, false);
@@ -68,7 +63,7 @@ public final class SelectByInternalPointActionTest {
         r.addMember(new RelationMember("outer", w));
         ds.addPrimitive(r);
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
-        Main.main.addLayer(layer);
+        Main.getLayerManager().addLayer(layer);
         return layer;
     }
 
@@ -77,16 +72,11 @@ public final class SelectByInternalPointActionTest {
      */
     @Test
     public void testGetSurroundingObjects() {
-        Layer layer = initDataSet();
-        try {
-            assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(null).size());
-            assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(0, 0)).size());
-            assertEquals(1, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(1.5, 1.5)).size());
-            assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(3, 3)).size());
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
-        }
+        initDataSet();
+        assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(null).size());
+        assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(0, 0)).size());
+        assertEquals(1, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(1.5, 1.5)).size());
+        assertEquals(0, SelectByInternalPointAction.getSurroundingObjects(new EastNorth(3, 3)).size());
     }
 
     /**
@@ -94,14 +84,9 @@ public final class SelectByInternalPointActionTest {
      */
     @Test
     public void testGetSmallestSurroundingObject() {
-        Layer layer = initDataSet();
-        try {
-            assertNull(SelectByInternalPointAction.getSmallestSurroundingObject(null));
-            assertNotNull(SelectByInternalPointAction.getSmallestSurroundingObject(new EastNorth(1.5, 1.5)));
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
-        }
+        initDataSet();
+        assertNull(SelectByInternalPointAction.getSmallestSurroundingObject(null));
+        assertNotNull(SelectByInternalPointAction.getSmallestSurroundingObject(new EastNorth(1.5, 1.5)));
     }
 
     /**
@@ -109,27 +94,22 @@ public final class SelectByInternalPointActionTest {
      */
     @Test
     public void testPerformSelection() {
-        Layer layer = initDataSet();
-        try {
-            DataSet ds = JosmAction.getCurrentDataSet();
+        initDataSet();
+        DataSet ds = Main.getLayerManager().getEditDataSet();
 
-            assertEquals(0, ds.getSelected().size());
-            SelectByInternalPointAction.performSelection(null, false, false);
-            assertEquals(0, ds.getSelected().size());
-            SelectByInternalPointAction.performSelection(new EastNorth(0, 0), false, false);
-            assertEquals(0, ds.getSelected().size());
-            SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), false, false);
-            assertEquals(1, ds.getSelected().size());
-            ds.clearSelection();
-            ds.addSelected(ds.getNodes());
-            assertEquals(4, ds.getSelected().size());
-            SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), true, false);
-            assertEquals(5, ds.getSelected().size());
-            SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), false, true);
-            assertEquals(4, ds.getSelected().size());
-        } finally {
-            // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
-        }
+        assertEquals(0, ds.getSelected().size());
+        SelectByInternalPointAction.performSelection(null, false, false);
+        assertEquals(0, ds.getSelected().size());
+        SelectByInternalPointAction.performSelection(new EastNorth(0, 0), false, false);
+        assertEquals(0, ds.getSelected().size());
+        SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), false, false);
+        assertEquals(1, ds.getSelected().size());
+        ds.clearSelection();
+        ds.addSelected(ds.getNodes());
+        assertEquals(4, ds.getSelected().size());
+        SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), true, false);
+        assertEquals(5, ds.getSelected().size());
+        SelectByInternalPointAction.performSelection(new EastNorth(1.5, 1.5), false, true);
+        assertEquals(4, ds.getSelected().size());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java
index ad419bf..0b01a1c 100644
--- a/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java
@@ -53,11 +53,11 @@ public final class SimplifyWayActionTest {
         DataSet ds = new DataSet();
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertTrue(ds.getSelected().isEmpty());
             action.actionPerformed(null);
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -70,11 +70,11 @@ public final class SimplifyWayActionTest {
         createWaySelected(ds, 0.0);
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(1, ds.getSelected().size());
             action.actionPerformed(null);
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -89,11 +89,11 @@ public final class SimplifyWayActionTest {
         }
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(11, ds.getSelected().size());
             action.actionPerformed(null);
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
index d9b0bc0..938fc44 100644
--- a/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
@@ -78,11 +78,11 @@ public final class SplitWayActionTest {
         dataSet.addSelected(w2);
 
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Ensures 3 ways.
diff --git a/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java b/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java
index 8b17e9d..57a9e86 100644
--- a/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java
@@ -40,13 +40,13 @@ public final class UnGlueActionTest {
         DataSet ds = new DataSet();
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertTrue(ds.getSelected().isEmpty());
             assertTrue(ds.allPrimitives().isEmpty());
             action.actionPerformed(null);
             assertTrue(ds.allPrimitives().isEmpty());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -61,13 +61,13 @@ public final class UnGlueActionTest {
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         ds.setSelected(n);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(1, ds.getSelected().size());
             assertEquals(1, ds.allPrimitives().size());
             action.actionPerformed(null);
             assertEquals(1, ds.allPrimitives().size());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -88,13 +88,13 @@ public final class UnGlueActionTest {
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         ds.setSelected(n1);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(1, ds.getSelected().size());
             assertEquals(3, ds.allPrimitives().size());
             action.actionPerformed(null);
             assertEquals(3, ds.allPrimitives().size());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -121,13 +121,13 @@ public final class UnGlueActionTest {
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         ds.setSelected(n1);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(1, ds.getSelected().size());
             assertEquals(5, ds.allPrimitives().size());
             action.actionPerformed(null);
             assertEquals(6, ds.allPrimitives().size());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
index 3b7744f..a71ed17 100644
--- a/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
@@ -73,11 +73,11 @@ public final class UnJoinNodeWayActionTest {
         UnJoinNodeWayActionTestClass action = new UnJoinNodeWayActionTestClass();
         action.setEnabled(true);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             action.actionPerformed(null);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
 
         // Ensures node n2 remove from w
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/AddNoteActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/AddNoteActionTest.java
index 7ccc72a..366baec 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/AddNoteActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/AddNoteActionTest.java
@@ -35,14 +35,14 @@ public class AddNoteActionTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             AddNoteAction mapMode = new AddNoteAction(Main.map, new NoteData(Collections.<Note>emptyList()));
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/DeleteActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/DeleteActionTest.java
index 1941dcd..71461f9 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/DeleteActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/DeleteActionTest.java
@@ -31,14 +31,14 @@ public class DeleteActionTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             DeleteAction mapMode = new DeleteAction(Main.map);
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
index 7e588f2..1bd00dc 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
@@ -52,10 +52,11 @@ public class DrawActionTest {
     public void testTicket12011() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
         DataSet dataSet = new DataSet();
         OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
+        Main.getLayerManager().addLayer(layer);
 
         Field mapView = MapFrame.class.getDeclaredField("mapView");
         Utils.setObjectsAccessible(mapView);
-        mapView.set(Main.map, new MapViewMock(dataSet, layer));
+        mapView.set(Main.map, new MapViewMock());
 
         Node n1 = new Node(new EastNorth(0, 0));
         Node n2 = new Node(new EastNorth(100, 0));
@@ -67,7 +68,6 @@ public class DrawActionTest {
         w.setNodes(Arrays.asList(new Node[] {n1, n2}));
         dataSet.addPrimitive(w);
 
-        Main.main.addLayer(layer);
         try {
             assertTrue(Main.map.selectDrawTool(false));
 
@@ -98,7 +98,7 @@ public class DrawActionTest {
             assertNotNull(renderer.getListCellRendererComponent(lstPrimitives, n3, 0, false, false));
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/ExtrudeActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/ExtrudeActionTest.java
index 18c1bc7..9936a56 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/ExtrudeActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/ExtrudeActionTest.java
@@ -31,14 +31,14 @@ public class ExtrudeActionTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             ExtrudeAction mapMode = new ExtrudeAction(Main.map);
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyActionTest.java
index f1a14e9..6787813 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyActionTest.java
@@ -31,14 +31,14 @@ public class ImproveWayAccuracyActionTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             ImproveWayAccuracyAction mapMode = new ImproveWayAccuracyAction(Main.map);
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java b/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
index a05c332..284bc9c 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
@@ -7,19 +7,11 @@ import java.awt.geom.Point2D;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 class MapViewMock extends MapView {
-    private final transient OsmDataLayer layer;
-    private final transient DataSet currentDataSet;
-
-    MapViewMock(DataSet dataSet, OsmDataLayer layer) {
+    MapViewMock() {
         super(Main.getLayerManager(), null, null);
-        this.layer = layer;
-        this.currentDataSet = dataSet;
     }
 
     @Override
@@ -48,23 +40,7 @@ class MapViewMock extends MapView {
     }
 
     @Override
-    public void requestClearRect() {}
-
-    @Override
     public Point2D getPoint2D(EastNorth p) {
         return p != null ? new Point2D.Double(p.getX(), p.getY()) : null;
     }
-
-    @Override
-    public void setActiveLayer(Layer layer) {}
-
-    @Override
-    public Layer getActiveLayer() {
-        return layer;
-    }
-
-    @Override
-    protected DataSet getCurrentDataSet() {
-        return currentDataSet;
-    }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/ParallelWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/ParallelWayActionTest.java
index a90ab0d..daf0ba5 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/ParallelWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/ParallelWayActionTest.java
@@ -31,14 +31,14 @@ public class ParallelWayActionTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             ParallelWayAction mapMode = new ParallelWayAction(Main.map);
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/PlayHeadDragModeTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/PlayHeadDragModeTest.java
index 558237d..e206187 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/PlayHeadDragModeTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/PlayHeadDragModeTest.java
@@ -32,14 +32,14 @@ public class PlayHeadDragModeTest {
     public void testMode() {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             PlayHeadDragMode mapMode = new PlayHeadDragMode(PlayHeadMarker.create());
             MapMode oldMapMode = Main.map.mapMode;
             assertTrue(Main.map.selectMapMode(mapMode));
             assertEquals(mapMode, Main.map.mapMode);
             assertTrue(Main.map.selectMapMode(oldMapMode));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
index f47c31e..05d7783 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
@@ -54,7 +54,7 @@ public class SelectActionTest {
             try {
                 Field mv = SelectAction.class.getDeclaredField("mv");
                 Utils.setObjectsAccessible(mv);
-                mv.set(this, new MapViewMock(dataSet, layer));
+                mv.set(this, new MapViewMock());
             } catch (ReflectiveOperationException e) {
                 e.printStackTrace();
                 fail("Can't setup testing environnement");
@@ -104,7 +104,7 @@ public class SelectActionTest {
         dataSet.addSelected(w);
 
         Main.pref = new PreferencesMock();
-        Main.main.addLayer(layer);
+        Main.getLayerManager().addLayer(layer);
         try {
             SelectAction action = new SelectActionMock(Main.map, dataSet, layer);
             nodesMerged = false;
@@ -159,7 +159,7 @@ public class SelectActionTest {
                        Double.compare(r2.getEastNorth().east(), 100), 0);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
index 097d1e3..1c52f3a 100644
--- a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
@@ -4,10 +4,10 @@ package org.openstreetmap.josm.actions.search;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
 import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -22,6 +22,7 @@ import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WayData;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -30,12 +31,10 @@ import org.openstreetmap.josm.tools.date.DateUtils;
 public class SearchCompilerTest {
 
     /**
-     * Setup test.
+     * We need prefs for this. We access preferences when creating OSM primitives.
      */
-    @Before
-    public void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
+    @Rule
+    public JOSMTestRules test = new JOSMTestRules().preferences();
 
     private static final class SearchContext {
         final DataSet ds = new DataSet();
@@ -389,7 +388,7 @@ public class SearchCompilerTest {
     public void testFooTypeBar() {
         try {
             SearchCompiler.compile("foo type bar");
-            throw new RuntimeException();
+            fail();
         } catch (ParseError parseError) {
             assertEquals("<html>Expecting <code>:</code> after <i>type</i>", parseError.getMessage());
         }
diff --git a/test/unit/org/openstreetmap/josm/command/conflict/ConflictAddCommandTest.java b/test/unit/org/openstreetmap/josm/command/conflict/ConflictAddCommandTest.java
index 9a8d73a..d78ac98 100644
--- a/test/unit/org/openstreetmap/josm/command/conflict/ConflictAddCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/conflict/ConflictAddCommandTest.java
@@ -34,7 +34,7 @@ public class ConflictAddCommandTest {
     public static void setUpBeforeClass() {
         JOSMFixture.createUnitTestFixture().init(true);
         layer = new OsmDataLayer(new DataSet(), null, null);
-        Main.main.addLayer(layer);
+        Main.getLayerManager().addLayer(layer);
     }
 
     /**
@@ -42,7 +42,7 @@ public class ConflictAddCommandTest {
      */
     @AfterClass
     public static void tearDownAfterClass() {
-        Main.main.removeLayer(layer);
+        Main.getLayerManager().removeLayer(layer);
     }
 
     /**
@@ -50,7 +50,7 @@ public class ConflictAddCommandTest {
      */
     @Test
     public void testExecuteUndoCommand() {
-        OsmDataLayer layer = Main.map.mapView.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         Conflict<Node> conflict = new Conflict<>(new Node(), new Node());
         ConflictAddCommand cmd = new ConflictAddCommand(layer, conflict);
         assertTrue(cmd.executeCommand());
@@ -66,7 +66,7 @@ public class ConflictAddCommandTest {
      */
     @Test
     public void testGetDescriptionIcon() {
-        OsmDataLayer layer = Main.map.mapView.getEditLayer();
+        OsmDataLayer layer = Main.getLayerManager().getEditLayer();
         Conflict<Node> conflict = new Conflict<>(new Node(), new Node());
         assertNotNull(new ConflictAddCommand(layer, conflict).getDescriptionIcon());
     }
diff --git a/test/unit/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommandTest.java b/test/unit/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommandTest.java
index bc5b1c1..a2a8b98 100644
--- a/test/unit/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommandTest.java
@@ -36,7 +36,7 @@ public class CoordinateConflictResolveCommandTest {
     public static void setUpBeforeClass() {
         JOSMFixture.createUnitTestFixture().init(true);
         layer = new OsmDataLayer(new DataSet(), null, null);
-        Main.main.addLayer(layer);
+        Main.getLayerManager().addLayer(layer);
     }
 
     /**
@@ -44,7 +44,7 @@ public class CoordinateConflictResolveCommandTest {
      */
     @AfterClass
     public static void tearDownAfterClass() {
-        Main.main.removeLayer(layer);
+        Main.getLayerManager().removeLayer(layer);
     }
 
     private static Conflict<Node> createConflict() {
diff --git a/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
index 1eea7b7..ce6b72c 100644
--- a/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
+++ b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
@@ -8,37 +8,48 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.io.FileWriter;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
-import org.junit.BeforeClass;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.AutosaveTask.AutosaveLayerInfo;
+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.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests for class {@link AutosaveTask}.
  */
 public class AutosaveTaskTest {
+    /**
+     * We need preferences and a home directory for this.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().platform().projection();
 
-    private static AutosaveTask task;
+    private AutosaveTask task;
 
     /**
      * Setup test.
      * @throws IOException if autosave directory cannot be created
      */
-    @BeforeClass
-    public static void setUpBeforeClass() throws IOException {
-        JOSMFixture.createUnitTestFixture().init();
+    @Before
+    public void setUp() throws IOException {
         task = new AutosaveTask();
-        Files.createDirectories(task.getAutosaveDir());
     }
 
     /**
@@ -55,21 +66,16 @@ public class AutosaveTaskTest {
      */
     @Test
     public void testGetUnsavedLayersFilesNotEmpty() throws IOException {
+        Files.createDirectories(task.getAutosaveDir());
         String autodir = task.getAutosaveDir().toString();
         File layer1 = Files.createFile(Paths.get(autodir, "layer1.osm")).toFile();
         File layer2 = Files.createFile(Paths.get(autodir, "layer2.osm")).toFile();
         File dir = Files.createDirectory(Paths.get(autodir, "dir.osm")).toFile();
-        try {
-            List<File> files = task.getUnsavedLayersFiles();
-            assertEquals(2, files.size());
-            assertTrue(files.contains(layer1));
-            assertTrue(files.contains(layer2));
-            assertFalse(files.contains(dir));
-        } finally {
-            Files.delete(dir.toPath());
-            Files.delete(layer2.toPath());
-            Files.delete(layer1.toPath());
-        }
+        List<File> files = task.getUnsavedLayersFiles();
+        assertEquals(2, files.size());
+        assertTrue(files.contains(layer1));
+        assertTrue(files.contains(layer2));
+        assertFalse(files.contains(dir));
     }
 
     /**
@@ -78,42 +84,167 @@ public class AutosaveTaskTest {
      */
     @Test
     public void testGetNewLayerFile() throws IOException {
+        Files.createDirectories(task.getAutosaveDir());
         AutosaveLayerInfo info = new AutosaveLayerInfo(new OsmDataLayer(new DataSet(), "layer", null));
         Calendar cal = Calendar.getInstance();
         cal.set(2016, 0, 1, 1, 2, 3);
         cal.set(Calendar.MILLISECOND, 456);
         Date fixed = cal.getTime();
 
-        List<File> files = new ArrayList<>();
-
-        try {
-            for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get()+1; i++) {
-                // Only retry 2 indexes to avoid 1000*1000 disk operations
-                File f = task.getNewLayerFile(info, fixed, Math.max(0, i-2));
-                files.add(f);
-                if (i > AutosaveTask.PROP_INDEX_LIMIT.get()) {
-                    assertNull(f);
+        AutosaveTask.PROP_INDEX_LIMIT.put(5);
+        for (int i = 0; i <= AutosaveTask.PROP_INDEX_LIMIT.get() + 2; i++) {
+            // Only retry 2 indexes to avoid 1000*1000 disk operations
+            File f = task.getNewLayerFile(info, fixed, Math.max(0, i - 2));
+            if (i > AutosaveTask.PROP_INDEX_LIMIT.get()) {
+                assertNull(f);
+            } else {
+                assertNotNull(f);
+                File pid = task.getPidFile(f);
+                assertTrue(pid.exists());
+                assertTrue(f.exists());
+                if (i == 0) {
+                    assertEquals("null_20160101_010203456.osm", f.getName());
+                    assertEquals("null_20160101_010203456.pid", pid.getName());
                 } else {
-                    assertNotNull(f);
-                    File pid = task.getPidFile(f);
-                    assertTrue(pid.exists());
-                    assertTrue(f.exists());
-                    if (i == 0) {
-                        assertEquals("null_20160101_010203456.osm", f.getName());
-                        assertEquals("null_20160101_010203456.pid", pid.getName());
-                    } else {
-                        assertEquals("null_20160101_010203456_"+i+".osm", f.getName());
-                        assertEquals("null_20160101_010203456_"+i+".pid", pid.getName());
-                    }
+                    assertEquals("null_20160101_010203456_" + i + ".osm", f.getName());
+                    assertEquals("null_20160101_010203456_" + i + ".pid", pid.getName());
                 }
             }
+        }
+    }
+
+    /**
+     * Tests if {@link AutosaveTask#schedule()} creates the directories.
+     */
+    @Test
+    public void testScheduleCreatesDirectories() {
+        try {
+            task.schedule();
+            assertTrue(task.getAutosaveDir().toFile().isDirectory());
         } finally {
-            for (File f : files) {
-                if (f != null) {
-                    Files.delete(task.getPidFile(f).toPath());
-                    Files.delete(f.toPath());
-                }
+            task.cancel();
+        }
+    }
+
+    /**
+     * Tests that {@link AutosaveTask#run()} saves every layer
+     */
+    @Test
+    public void testAutosaveIgnoresUnmodifiedLayer() {
+        OsmDataLayer layer = new OsmDataLayer(new DataSet(), "OsmData", null);
+        Main.getLayerManager().addLayer(layer);
+        try {
+            task.schedule();
+            assertEquals(0, countFiles());
+            task.run();
+            assertEquals(0, countFiles());
+        } finally {
+            task.cancel();
+        }
+    }
+
+    private int countFiles() {
+        return task.getAutosaveDir().toFile().list(new FilenameFilter() {
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.endsWith(".osm");
+            }
+        }).length;
+    }
+
+    /**
+     * Tests that {@link AutosaveTask#run()} saves every layer.
+     */
+    @Test
+    public void testAutosaveSavesLayer() {
+        runAutosaveTaskSeveralTimes(1);
+    }
+
+    /**
+     * Tests that {@link AutosaveTask#run()} saves every layer.
+     */
+    @Test
+    public void testAutosaveSavesLayerMultipleTimes() {
+        AutosaveTask.PROP_FILES_PER_LAYER.put(3);
+        runAutosaveTaskSeveralTimes(5);
+    }
+
+    private void runAutosaveTaskSeveralTimes(int times) {
+        DataSet data = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(data, "OsmData", null);
+        Main.getLayerManager().addLayer(layer);
+        try {
+            task.schedule();
+            assertEquals(0, countFiles());
+
+            for (int i = 0; i < times; i++) {
+                data.addPrimitive(new Node(new LatLon(10, 10)));
+                task.run();
+                assertEquals(Math.min(i + 1, 3), countFiles());
             }
+
+        } finally {
+            task.cancel();
         }
     }
+
+    /**
+     * Tests that {@link AutosaveTask#discardUnsavedLayers()} ignores layers from the current instance
+     * @throws IOException in case of I/O error
+     */
+    @Test
+    public void testDiscardUnsavedLayersIgnoresCurrentInstance() throws IOException {
+        runAutosaveTaskSeveralTimes(1);
+        try (FileWriter file = new FileWriter(new File(task.getAutosaveDir().toFile(), "any_other_file.osm"))) {
+            file.append("");
+        }
+        assertEquals(2, countFiles());
+
+        task.discardUnsavedLayers();
+        assertEquals(1, countFiles());
+    }
+
+    /**
+     * Tests that {@link AutosaveTask#run()} handles duplicate layers
+     */
+    @Test
+    public void testAutosaveHandlesDupplicateNames() {
+        DataSet data1 = new DataSet();
+        OsmDataLayer layer1 = new OsmDataLayer(data1, "OsmData", null);
+        Main.getLayerManager().addLayer(layer1);
+
+        DataSet data2 = new DataSet();
+        OsmDataLayer layer2 = new OsmDataLayer(data2, "OsmData", null);
+
+        try {
+            task.schedule();
+            assertEquals(0, countFiles());
+            // also test adding layer later
+            Main.getLayerManager().addLayer(layer2);
+
+            data1.addPrimitive(new Node(new LatLon(10, 10)));
+            data2.addPrimitive(new Node(new LatLon(10, 10)));
+            task.run();
+            assertEquals(2, countFiles());
+        } finally {
+            task.cancel();
+        }
+    }
+
+    /**
+     * Test that {@link AutosaveTask#recoverUnsavedLayers()} recovers unsaved layers.
+     * @throws Exception in case of error
+     */
+    @Test
+    public void testRecoverLayers() throws Exception {
+        runAutosaveTaskSeveralTimes(1);
+        try (FileWriter file = new FileWriter(new File(task.getAutosaveDir().toFile(), "any_other_file.osm"))) {
+            file.append("<?xml version=\"1.0\"?><osm version=\"0.6\"><node id=\"1\" lat=\"1\" lon=\"2\" version=\"1\"/></osm>");
+        }
+
+        assertEquals(2, countFiles());
+        task.recoverUnsavedLayers().get();
+
+        assertEquals(1, countFiles());
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
index 7046cec..dcccb2e 100644
--- a/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
+++ b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
@@ -36,7 +36,7 @@ class PreferencesTest extends GroovyTestCase {
             "  <tag key='jdk.Arrays.useLegacyMergeSort' value='false'/>%n" +
             "  <tag key='language' value='en'/>%n" +
             "  <tag key='osm-server.url' value='http://api06.dev.openstreetmap.org/api'/>%n" +
-            "  <tag key='osm-server.username' value='josm_test'/>%n" +
-            "</preferences>%n", Version.getInstance().getVersion())
+            "  <tag key='osm-server.username' value='%s'/>%n" +
+            "</preferences>%n", Version.getInstance().getVersion(), Main.pref.get("osm-server.username"))
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
index c8756cc..a2026e6 100644
--- a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
+++ b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
@@ -78,7 +78,7 @@ public class JCSCachedTileLoaderJobTest {
      * @throws IOException in case of I/O error
      */
     @Test
-    public void testStatusCodes() throws IOException, InterruptedException  {
+    public void testStatusCodes() throws IOException, InterruptedException {
         doTestStatusCode(200);
         // can't test for 3xx, as httpstat.us redirects finally to 200 page
         doTestStatusCode(401);
diff --git a/test/unit/org/openstreetmap/josm/data/coor/CachedLatLonTest.java b/test/unit/org/openstreetmap/josm/data/coor/CachedLatLonTest.java
new file mode 100644
index 0000000..11031ea
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/coor/CachedLatLonTest.java
@@ -0,0 +1,36 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.coor;
+
+import java.text.DecimalFormat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+import nl.jqno.equalsverifier.Warning;
+
+/**
+ * Unit tests for class {@link CachedLatLon}.
+ */
+public class CachedLatLonTest {
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of methods {@link CachedLatLon#equals} and {@link CachedLatLon#hashCode}.
+     */
+    @Test
+    public void equalsContract() {
+        EqualsVerifier.forClass(CachedLatLon.class).usingGetClass()
+            .suppress(Warning.NONFINAL_FIELDS)
+            .withPrefabValues(DecimalFormat.class, new DecimalFormat("00.0"), new DecimalFormat("00.000"))
+            .verify();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
index c93d26f..bf1439a 100644
--- a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
+++ b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
@@ -3,11 +3,14 @@ package org.openstreetmap.josm.data.coor;
 
 import static org.junit.Assert.assertEquals;
 
+import java.text.DecimalFormat;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Unit tests for class {@link LatLon}.
@@ -29,12 +32,14 @@ public class LatLonTest {
      */
     @SuppressFBWarnings(value = "MS_PKGPROTECT")
     public static final double[] SAMPLE_VALUES = new double[]{
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             -180.0, -179.9, -179.6, -179.5, -179.4, -179.1, -179.0, -100.0, -99.9, -10.0, -9.9, -1.0, -0.1,
-            180.0,  179.9,  179.6,  179.5,  179.4,  179.1,  179.0,  100.0,  99.9,  10.0,  9.9,  1.0,  0.1,
+             180.0,  179.9,  179.6,  179.5,  179.4,  179.1,  179.0,  100.0,  99.9,  10.0,  9.9,  1.0,  0.1,
             0.12, 0.123, 0.1234, 0.12345, 0.123456, 0.1234567,
             1.12, 1.123, 1.1234, 1.12345, 1.123456, 1.1234567,
             10.12, 10.123, 10.1234, 10.12345, 10.123456, 10.1234567,
             100.12, 100.123, 100.1234, 100.12345, 100.123456, 100.1234567
+            // CHECKSTYLE.ON: SingleSpaceSeparator
            };
 
     /**
@@ -50,6 +55,7 @@ public class LatLonTest {
         assertEquals(LatLon.roundToOsmPrecision(0.0), 0.0, 0);
         assertEquals(LatLon.roundToOsmPrecision(-0.0), 0.0, 0);
 
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         assertEquals(LatLon.roundToOsmPrecision(0.12345678),  0.1234568, 0);
         assertEquals(LatLon.roundToOsmPrecision(0.123456789), 0.1234568, 0);
 
@@ -61,36 +67,37 @@ public class LatLonTest {
 
         assertEquals(LatLon.roundToOsmPrecision(100.12345678),  100.1234568, 0);
         assertEquals(LatLon.roundToOsmPrecision(100.123456789), 100.1234568, 0);
-
-        assertEquals(LatLon.roundToOsmPrecision(100.00000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.0000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.00000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.0000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.00000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.0000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.00000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.000000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.0000000000000000001),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(100.00000000000000000001),  100.0000000, 0);
-
-        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.999999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.99999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.9999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.999999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.99999999),  100.0000000, 0);
-        assertEquals(LatLon.roundToOsmPrecision(99.9999999),  99.9999999, 0);
+        // CHECKSTYLE.ON: SingleSpaceSeparator
+
+        assertEquals(LatLon.roundToOsmPrecision(100.00000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.0000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.00000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.0000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.00000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.000000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.0000000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.00000000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.000000000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.0000000000000000001), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(100.00000000000000000001), 100.0000000, 0);
+
+        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.999999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.99999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.9999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.999999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.99999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.9999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.999999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.99999999), 100.0000000, 0);
+        assertEquals(LatLon.roundToOsmPrecision(99.9999999), 99.9999999, 0);
     }
 
     /**
@@ -119,27 +126,13 @@ public class LatLonTest {
     }
 
     /**
-     * Test of {@link LatLon#equals}
+     * Unit test of methods {@link LatLon#equals} and {@link LatLon#hashCode}.
      */
     @Test
-    public void testEquals() {
-        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
-            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            assertEquals(a, b);
-        }
-    }
-
-    /**
-     * Test of {@link LatLon#hashCode}
-     */
-    @Test
-    public void testHashCode() {
-        for (int i = 1; i < SAMPLE_VALUES.length; i++) {
-            LatLon a = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            LatLon b = new LatLon(SAMPLE_VALUES[i-1], SAMPLE_VALUES[i]);
-            assertEquals(a.hashCode(), b.hashCode());
-        }
+    public void equalsContract() {
+        EqualsVerifier.forClass(LatLon.class).usingGetClass()
+            .withPrefabValues(DecimalFormat.class, new DecimalFormat("00.0"), new DecimalFormat("00.000"))
+            .verify();
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java b/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
index b943418..52b62d3 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
@@ -35,7 +35,7 @@ public class ImageryInfoTest {
      */
     @Test
     public void testGetExtendedUrl() {
-        ImageryInfo testImageryTMS =  new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
+        ImageryInfo testImageryTMS = new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
         testImageryTMS.setDefaultMinZoom(16);
         testImageryTMS.setDefaultMaxZoom(23);
         assertEquals("tms[16,23]:http://localhost", testImageryTMS.getExtendedUrl());
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java b/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
index 8d521d7..03f19cf 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
@@ -22,8 +22,8 @@ import org.openstreetmap.josm.data.projection.Projections;
  */
 public class TemplatedWMSTileSourceTest {
 
-    private ImageryInfo testImageryWMS =  new ImageryInfo("test imagery", "http://localhost", "wms", null, null);
-    private ImageryInfo testImageryTMS =  new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
+    private ImageryInfo testImageryWMS = new ImageryInfo("test imagery", "http://localhost", "wms", null, null);
+    private ImageryInfo testImageryTMS = new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
 
     /**
      * Setup test.
@@ -189,7 +189,7 @@ public class TemplatedWMSTileSourceTest {
 
     private static boolean isWithin(EastNorth point, EastNorth topLeft, EastNorth bottomRight) {
         return Math.min(topLeft.east(), bottomRight.east()) <= point.east() &&
-                point.east() <= Math.max(topLeft.east(), bottomRight.east())  &&
+                point.east() <= Math.max(topLeft.east(), bottomRight.east()) &&
                 Math.min(topLeft.north(), bottomRight.north()) <= point.north() &&
                 point.north() <= Math.max(topLeft.north(), bottomRight.north());
     }
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java b/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
index b99ad0f..e865c39 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
@@ -24,7 +24,7 @@ import org.openstreetmap.josm.data.projection.Projections;
  */
 public class WMTSTileSourceTest {
 
-    private ImageryInfo testImageryTMS =  new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
+    private ImageryInfo testImageryTMS = new ImageryInfo("test imagery", "http://localhost", "tms", null, null);
     private ImageryInfo testImageryPSEUDO_MERCATOR = getImagery(TestUtils.getTestDataRoot() + "wmts/getcapabilities-pseudo-mercator.xml");
     private ImageryInfo testImageryTOPO_PL = getImagery(TestUtils.getTestDataRoot() + "wmts/getcapabilities-TOPO.xml");
     private ImageryInfo testImageryORTO_PL = getImagery(TestUtils.getTestDataRoot() + "wmts/getcapabilities-ORTO.xml");
@@ -191,7 +191,7 @@ public class WMTSTileSourceTest {
                 "http://mapy.geoportal.gov.pl/wss/service/WMTS/guest/wmts/TOPO?SERVICE=WMTS&REQUEST=GetTile&"
                 + "VERSION=1.0.0&LAYER=MAPA TOPOGRAFICZNA&STYLE=default&FORMAT=image/jpeg&tileMatrixSet=EPSG:4326&"
                 + "tileMatrix=EPSG:4326:0&tileRow=1&tileCol=1",
-                testSource.getTileUrl(0,  1,  1));
+                testSource.getTileUrl(0, 1, 1));
     }
 
     @Test
@@ -220,7 +220,7 @@ public class WMTSTileSourceTest {
         testSource.initProjection(Main.getProjection());
         assertEquals(
                 "http://www.ngi.be/cartoweb/1.0.0/topo/default/3857/7/1/1.png",
-                testSource.getTileUrl(0,  1,  1));
+                testSource.getTileUrl(0, 1, 1));
     }
 
     @Test
@@ -231,7 +231,6 @@ public class WMTSTileSourceTest {
         testSource.initProjection(Main.getProjection());
         verifyTile(new LatLon(45.4105023, -75.7153702), testSource, 303751, 375502, 12);
         verifyTile(new LatLon(45.4601306, -75.7617187), testSource, 1186, 1466, 4);
-
     }
 
     @Test
diff --git a/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java b/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java
new file mode 100644
index 0000000..53193c4
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+import nl.jqno.equalsverifier.Warning;
+
+/**
+ * Unit tests for class {@link BBox}.
+ */
+public class BBoxTest {
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of methods {@link BBox#equals} and {@link BBox#hashCode}.
+     */
+    @Test
+    public void equalsContract() {
+        EqualsVerifier.forClass(BBox.class).usingGetClass()
+            .suppress(Warning.NONFINAL_FIELDS)
+            .verify();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java b/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
index aaee689..3c9b53d 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.StringWriter;
 import java.util.Arrays;
@@ -52,9 +53,9 @@ public class DataSetMergerTest {
         Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
     }
 
-    private void runConsistencyTests(DataSet ds) throws Exception {
+    private void runConsistencyTests(DataSet ds) {
         StringWriter writer = new StringWriter();
-        DatasetConsistencyTest test =  new DatasetConsistencyTest(ds, writer);
+        DatasetConsistencyTest test = new DatasetConsistencyTest(ds, writer);
         test.checkReferrers();
         test.checkCompleteWaysWithIncompleteNodes();
         test.searchNodes();
@@ -62,12 +63,12 @@ public class DataSetMergerTest {
         test.referredPrimitiveNotInDataset();
         test.checkZeroNodesWays();
         String result = writer.toString();
-        if (result.length() > 0)
-            throw new RuntimeException(result);
+        if (!result.isEmpty())
+            fail(result);
     }
 
     @After
-    public void checkDatasets() throws Exception {
+    public void checkDatasets() {
         runConsistencyTests(my);
         runConsistencyTests(their);
     }
diff --git a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryRelationTest.java b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryRelationTest.java
index d91c3c3..6730f11 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryRelationTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryRelationTest.java
@@ -79,6 +79,7 @@ public class HistoryRelationTest {
         rel2.addMember(new RelationMemberData(null, OsmPrimitiveType.NODE, 1));
         rel2.addMember(new RelationMemberData(null, OsmPrimitiveType.NODE, 2));
 
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         assertEquals("relation (1, 0 members)", rel0.getDisplayName(hnf));
         assertEquals("relation (1, 1 member)",  rel1.getDisplayName(hnf));
         assertEquals("relation (1, 2 members)", rel2.getDisplayName(hnf));
@@ -93,5 +94,6 @@ public class HistoryRelationTest {
         assertEquals("relation (\"RelName\", 0 members)", rel0.getDisplayName(hnf));
         assertEquals("relation (\"RelName\", 1 member)",  rel1.getDisplayName(hnf));
         assertEquals("relation (\"RelName\", 2 members)", rel2.getDisplayName(hnf));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
index bfacbd4..65cdce7 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/history/HistoryWayTest.java
@@ -121,6 +121,7 @@ public class HistoryWayTest {
         way2.addNode(1);
         way2.addNode(2);
 
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         assertEquals("1 (0 nodes)", way0.getDisplayName(hnf));
         assertEquals("1 (1 node)",  way1.getDisplayName(hnf));
         assertEquals("1 (2 nodes)", way2.getDisplayName(hnf));
@@ -135,5 +136,6 @@ public class HistoryWayTest {
         assertEquals("WayName (0 nodes)", way0.getDisplayName(hnf));
         assertEquals("WayName (1 node)",  way1.getDisplayName(hnf));
         assertEquals("WayName (2 nodes)", way2.getDisplayName(hnf));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java b/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
index 187a5dd..8b2097a 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
@@ -168,7 +168,7 @@ public class MergeSourceBuildingVisitorTest {
         n20.setCoor(LatLon.ZERO);
         r1.addMember(new RelationMember("node-20", n20));
         Way w30 = new Way(30, 1);
-        Node n21  = new Node(21);
+        Node n21 = new Node(21);
         w30.addNode(n21);
         Node n22 = new Node(22);
         w30.addNode(n22);
diff --git a/test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java b/test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java
index 6d1585f..b0555c9 100644
--- a/test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java
+++ b/test/unit/org/openstreetmap/josm/data/projection/SwissGridTest.java
@@ -24,17 +24,19 @@ public class SwissGridTest {
     }
 
     // CHECKSTYLE.OFF: LineLength
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
 
     /**
      * source: http://www.swisstopo.admin.ch/internet/swisstopo/en/home/topics/survey/sys/refsys/switzerland.parsysrelated1.37696.downloadList.97912.DownloadFile.tmp/swissprojectionen.pdf
      */
     ProjData[] data = {
-            new ProjData("Zimmerwald",      d(7, 27, 54.983506), d(46, 52, 37.540562), 947.149, 602030.680, 191775.030, 897.915),
-            new ProjData("Chrischona",      d(7, 40, 6.983077), d(47, 34, 1.385301), 504.935,  617306.300, 268507.300, 456.064),
-            new ProjData("Pfaender",        d(9, 47, 3.697723), d(47, 30, 55.172797), 1089.372, 776668.105, 265372.681, 1042.624),
-            new ProjData("La Givrine",      d(6, 6, 7.326361), d(46, 27, 14.690021), 1258.274,  497313.292, 145625.438, 1207.434),
-            new ProjData("Monte Generoso",  d(9, 1, 16.389053), d(45, 55, 45.438020), 1685.027, 722758.810, 87649.670, 1636.600) };
+            new ProjData("Zimmerwald",     d(7, 27, 54.983506), d(46, 52, 37.540562), 947.149, 602030.680, 191775.030, 897.915),
+            new ProjData("Chrischona",     d(7, 40, 6.983077), d(47, 34, 1.385301), 504.935,  617306.300, 268507.300, 456.064),
+            new ProjData("Pfaender",       d(9, 47, 3.697723), d(47, 30, 55.172797), 1089.372, 776668.105, 265372.681, 1042.624),
+            new ProjData("La Givrine",     d(6, 6, 7.326361), d(46, 27, 14.690021), 1258.274,  497313.292, 145625.438, 1207.434),
+            new ProjData("Monte Generoso", d(9, 1, 16.389053), d(45, 55, 45.438020), 1685.027, 722758.810, 87649.670, 1636.600) };
 
+    // CHECKSTYLE.ON: SingleSpaceSeparator
     // CHECKSTYLE.ON: LineLength
 
     private double d(double deg, double min, double sec) {
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTest.java b/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTest.java
index 53ab7cd..f0efdec 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTest.java
@@ -35,7 +35,7 @@ import org.openstreetmap.josm.data.validation.routines.DomainValidator.ArrayType
 /**
  * Tests for the DomainValidator.
  *
- * @version $Revision: 1723861 $
+ * @version $Revision: 1741724 $
  */
 public class DomainValidatorTest {
 
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java b/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java
index 3f13f39..e710c39 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
  * Performs Validation Test for e-mail validations.
  *
  *
- * @version $Revision: 1723573 $
+ * @version $Revision: 1741724 $
  */
 public class EmailValidatorTest {
 
@@ -57,7 +57,7 @@ public class EmailValidatorTest {
      * Tests the e-mail validation.
      */
     @Test
-    public void testEmail()  {
+    public void testEmail() {
         assertTrue(validator.isValid("jsmith at apache.org"));
         assertFalse(validator.isValid(null));
     }
@@ -66,7 +66,7 @@ public class EmailValidatorTest {
      * Tests the email validation with numeric domains.
      */
     @Test
-    public void testEmailWithNumericAddress()  {
+    public void testEmailWithNumericAddress() {
         assertTrue(validator.isValid("someone@[216.109.118.76]"));
         assertTrue(validator.isValid("someone at yahoo.com"));
     }
@@ -75,7 +75,7 @@ public class EmailValidatorTest {
      * Tests the e-mail validation.
      */
     @Test
-    public void testEmailExtension()  {
+    public void testEmailExtension() {
         assertTrue(validator.isValid("jsmith at apache.org"));
 
         assertTrue(validator.isValid("jsmith at apache.com"));
@@ -98,7 +98,7 @@ public class EmailValidatorTest {
      * the address.
      */
     @Test
-    public void testEmailWithDash()  {
+    public void testEmailWithDash() {
         assertTrue(validator.isValid("andy.noble at data-workshop.com"));
 
         assertFalse(validator.isValid("andy-noble at data-workshop.-com"));
@@ -113,7 +113,7 @@ public class EmailValidatorTest {
      * the address.
      */
     @Test
-    public void testEmailWithDotEnd()  {
+    public void testEmailWithDotEnd() {
         assertFalse(validator.isValid("andy.noble at data-workshop.com."));
     }
 
@@ -122,7 +122,7 @@ public class EmailValidatorTest {
      * the address.
      */
     @Test
-    public void testEmailWithBogusCharacter()  {
+    public void testEmailWithBogusCharacter() {
 
         assertFalse(validator.isValid("andy.noble@\u008fdata-workshop.com"));
 
@@ -183,7 +183,7 @@ public class EmailValidatorTest {
      * Tests the email validation with commas.
      */
     @Test
-    public void testEmailWithCommas()  {
+    public void testEmailWithCommas() {
         assertFalse(validator.isValid("joeblow at apa,che.org"));
 
         assertFalse(validator.isValid("joeblow at apache.o,rg"));
@@ -195,7 +195,7 @@ public class EmailValidatorTest {
      * Tests the email validation with spaces.
      */
     @Test
-    public void testEmailWithSpaces()  {
+    public void testEmailWithSpaces() {
         assertFalse(validator.isValid("joeblow @apache.org")); // TODO - this should be valid?
 
         assertFalse(validator.isValid("joeblow@ apache.org"));
@@ -214,7 +214,7 @@ public class EmailValidatorTest {
      * (i.e. Ascii chars 0 - 31 and 127)
      */
     @Test
-    public void testEmailWithControlChars()  {
+    public void testEmailWithControlChars() {
         for (char c = 0; c < 32; c++) {
             assertFalse("Test control char " + ((int) c), validator.isValid("foo" + c + "bar at domain.com"));
         }
@@ -277,7 +277,7 @@ public class EmailValidatorTest {
      * that is being tested.
      */
     @Test
-    public void testEmailUserName()  {
+    public void testEmailUserName() {
 
         assertTrue(validator.isValid("joe1blow at apache.org"));
 
@@ -491,7 +491,7 @@ public class EmailValidatorTest {
      */
     @Ignore("This test fails so disable it for 1.1.4 release. The real solution is to fix the email parsing")
     @Test
-    public void testEmailFromPerl()  {
+    public void testEmailFromPerl() {
         for (int index = 0; index < testEmailFromPerl.length; index++) {
             String item = testEmailFromPerl[index].item;
             if (testEmailFromPerl[index].valid) {
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/InetAddressValidatorTest.java b/test/unit/org/openstreetmap/josm/data/validation/routines/InetAddressValidatorTest.java
index b76d4b6..dd12c3f 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/InetAddressValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/InetAddressValidatorTest.java
@@ -27,7 +27,7 @@ import org.junit.Test;
 /**
  * Test cases for InetAddressValidator.
  *
- * @version $Revision: 1649163 $
+ * @version $Revision: 1741724 $
  */
 public class InetAddressValidatorTest {
 
@@ -46,10 +46,12 @@ public class InetAddressValidatorTest {
      */
     @Test
     public void testInetAddressesFromTheWild() {
-        assertTrue("www.apache.org IP should be valid",       validator.isValid("140.211.11.130"));
-        assertTrue("www.l.google.com IP should be valid",     validator.isValid("72.14.253.103"));
-        assertTrue("fsf.org IP should be valid",              validator.isValid("199.232.41.5"));
-        assertTrue("appscs.ign.com IP should be valid",       validator.isValid("216.35.123.87"));
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        assertTrue("www.apache.org IP should be valid",   validator.isValid("140.211.11.130"));
+        assertTrue("www.l.google.com IP should be valid", validator.isValid("72.14.253.103"));
+        assertTrue("fsf.org IP should be valid",          validator.isValid("199.232.41.5"));
+        assertTrue("appscs.ign.com IP should be valid",   validator.isValid("216.35.123.87"));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 
     /**
@@ -66,20 +68,22 @@ public class InetAddressValidatorTest {
      */
     @Test
     public void testInetAddressesByClass() {
-        assertTrue("class A IP should be valid",              validator.isValid("24.25.231.12"));
-        assertFalse("illegal class A IP should be invalid",   validator.isValid("2.41.32.324"));
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
+        assertTrue("class A IP should be valid",            validator.isValid("24.25.231.12"));
+        assertFalse("illegal class A IP should be invalid", validator.isValid("2.41.32.324"));
 
-        assertTrue("class B IP should be valid",              validator.isValid("135.14.44.12"));
-        assertFalse("illegal class B IP should be invalid",   validator.isValid("154.123.441.123"));
+        assertTrue("class B IP should be valid",            validator.isValid("135.14.44.12"));
+        assertFalse("illegal class B IP should be invalid", validator.isValid("154.123.441.123"));
 
-        assertTrue("class C IP should be valid",              validator.isValid("213.25.224.32"));
-        assertFalse("illegal class C IP should be invalid",   validator.isValid("201.543.23.11"));
+        assertTrue("class C IP should be valid",            validator.isValid("213.25.224.32"));
+        assertFalse("illegal class C IP should be invalid", validator.isValid("201.543.23.11"));
 
-        assertTrue("class D IP should be valid",              validator.isValid("229.35.159.6"));
-        assertFalse("illegal class D IP should be invalid",   validator.isValid("231.54.11.987"));
+        assertTrue("class D IP should be valid",            validator.isValid("229.35.159.6"));
+        assertFalse("illegal class D IP should be invalid", validator.isValid("231.54.11.987"));
 
-        assertTrue("class E IP should be valid",              validator.isValid("248.85.24.92"));
-        assertFalse("illegal class E IP should be invalid",   validator.isValid("250.21.323.48"));
+        assertTrue("class E IP should be valid",            validator.isValid("248.85.24.92"));
+        assertFalse("illegal class E IP should be invalid", validator.isValid("250.21.323.48"));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 
     /**
@@ -87,8 +91,8 @@ public class InetAddressValidatorTest {
      */
     @Test
     public void testReservedInetAddresses() {
-        assertTrue("localhost IP should be valid",            validator.isValid("127.0.0.1"));
-        assertTrue("broadcast IP should be valid",            validator.isValid("255.255.255.255"));
+        assertTrue("localhost IP should be valid", validator.isValid("127.0.0.1"));
+        assertTrue("broadcast IP should be valid", validator.isValid("255.255.255.255"));
     }
 
     /**
@@ -96,10 +100,12 @@ public class InetAddressValidatorTest {
      */
     @Test
     public void testBrokenInetAddresses() {
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         assertFalse("IP with characters should be invalid",     validator.isValid("124.14.32.abc"));
         assertFalse("IP with leading zeroes should be invalid", validator.isValid("124.14.32.01"));
         assertFalse("IP with three groups should be invalid",   validator.isValid("23.64.12"));
         assertFalse("IP with five groups should be invalid",    validator.isValid("26.34.23.77.234"));
+        // CHECKSTYLE.ON: SingleSpaceSeparator
     }
 
     // CHECKSTYLE.OFF: LineLength
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/RegexValidatorTest.java b/test/unit/org/openstreetmap/josm/data/validation/routines/RegexValidatorTest.java
index f288446..8a0fe73 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/RegexValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/RegexValidatorTest.java
@@ -31,23 +31,25 @@ import org.openstreetmap.josm.Main;
 /**
  * Test Case for RegexValidatorTest.
  *
- * @version $Revision: 1649191 $
+ * @version $Revision: 1741724 $
  * @since Validator 1.4
  */
 public class RegexValidatorTest {
 
-    private static final String REGEX         = "^([abc]*)(?:\\-)([DEF]*)(?:\\-)([123]*)$";
+    private static final String REGEX = "^([abc]*)(?:\\-)([DEF]*)(?:\\-)([123]*)$";
 
     private static final String COMPONENT_1 = "([abc]{3})";
     private static final String COMPONENT_2 = "([DEF]{3})";
     private static final String COMPONENT_3 = "([123]{3})";
-    private static final String SEPARATOR_1  = "(?:\\-)";
-    private static final String SEPARATOR_2  = "(?:\\s)";
+    private static final String SEPARATOR_1 = "(?:\\-)";
+    private static final String SEPARATOR_2 = "(?:\\s)";
     private static final String REGEX_1 = "^" + COMPONENT_1 + SEPARATOR_1 + COMPONENT_2 + SEPARATOR_1 + COMPONENT_3 + "$";
     private static final String REGEX_2 = "^" + COMPONENT_1 + SEPARATOR_2 + COMPONENT_2 + SEPARATOR_2 + COMPONENT_3 + "$";
     private static final String REGEX_3 = "^" + COMPONENT_1 + COMPONENT_2 + COMPONENT_3 + "$";
     private static final String[] MULTIPLE_REGEX = new String[] {REGEX_1, REGEX_2, REGEX_3};
 
+    // CHECKSTYLE.OFF: SingleSpaceSeparator
+
     /**
      * Test instance methods with single regular expression.
      */
@@ -84,10 +86,10 @@ public class RegexValidatorTest {
     public void testMultipleSensitive() {
 
         // ------------ Set up Sensitive Validators
-        RegexValidator multiple   = new RegexValidator(MULTIPLE_REGEX);
-        RegexValidator single1   = new RegexValidator(REGEX_1);
-        RegexValidator single2   = new RegexValidator(REGEX_2);
-        RegexValidator single3   = new RegexValidator(REGEX_3);
+        RegexValidator multiple = new RegexValidator(MULTIPLE_REGEX);
+        RegexValidator single1  = new RegexValidator(REGEX_1);
+        RegexValidator single2  = new RegexValidator(REGEX_2);
+        RegexValidator single3  = new RegexValidator(REGEX_3);
 
         // ------------ Set up test values
         String value = "aac FDE 321";
@@ -127,9 +129,9 @@ public class RegexValidatorTest {
 
         // ------------ Set up In-sensitive Validators
         RegexValidator multiple = new RegexValidator(MULTIPLE_REGEX, false);
-        RegexValidator single1   = new RegexValidator(REGEX_1, false);
-        RegexValidator single2   = new RegexValidator(REGEX_2, false);
-        RegexValidator single3   = new RegexValidator(REGEX_3, false);
+        RegexValidator single1  = new RegexValidator(REGEX_1, false);
+        RegexValidator single2  = new RegexValidator(REGEX_2, false);
+        RegexValidator single3  = new RegexValidator(REGEX_3, false);
 
         // ------------ Set up test values
         String value = "AAC FDE 321";
@@ -172,6 +174,8 @@ public class RegexValidatorTest {
         assertNull("Instance match()",    validator.match(null));
     }
 
+    // CHECKSTYLE.ON: SingleSpaceSeparator
+
     /**
      * Test exceptions
      */
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java b/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java
index 552766f..5573456 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java
@@ -26,7 +26,7 @@ import org.junit.Test;
 /**
  * Performs Validation Test for url validations.
  *
- * @version $Revision: 1715076 $
+ * @version $Revision: 1741724 $
  */
 public class UrlValidatorTest {
 
@@ -98,7 +98,7 @@ public class UrlValidatorTest {
       assertTrue(urlVal.isValid("http://www.google.com/"));
       int statusPerLine = 60;
       int printed = 0;
-      if (printIndex)  {
+      if (printIndex) {
          statusPerLine = 6;
       }
       do {
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
index 0ccfab7..1b97917 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
@@ -16,21 +16,31 @@ import java.util.List;
 import java.util.Set;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * JUnit Test of "Opening hours" validation test.
+ * @see OpeningHourTest
  */
 public class OpeningHourTestTest {
+    /**
+     * We need prefs for this. We check strings so we need i18n.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
 
-    private static final OpeningHourTest OPENING_HOUR_TEST = new OpeningHourTest();
+    private OpeningHourTest openingHourTest;
 
     /**
      * Setup test.
@@ -38,8 +48,8 @@ public class OpeningHourTestTest {
      */
     @Before
     public void setUp() throws Exception {
-        JOSMFixture.createUnitTestFixture().init();
-        OPENING_HOUR_TEST.initialize();
+        openingHourTest = new OpeningHourTest();
+        openingHourTest.initialize();
     }
 
     /**
@@ -49,23 +59,23 @@ public class OpeningHourTestTest {
     public void testCheckOpeningHourSyntax1() {
         final String key = "opening_hours";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/opening_hours#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "24/7"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 08:30-20:00"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr sunrise-sunset"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "09:00-21:00"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise"), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise"), hasSize(1));
-        assertEquals(Severity.OTHER, OPENING_HOUR_TEST.checkOpeningHourSyntax(
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "24/7"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 08:30-20:00"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr sunrise-sunset"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "09:00-21:00"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise"), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise"), hasSize(1));
+        assertEquals(Severity.OTHER, openingHourTest.checkOpeningHourSyntax(
                 key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise").get(0).getSeverity());
-        assertEquals("Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise", OPENING_HOUR_TEST.checkOpeningHourSyntax(
+        assertEquals("Su-Th sunset-24:00,04:00-sunrise; Fr-Sa sunset-sunrise", openingHourTest.checkOpeningHourSyntax(
                 key, "Su-Th sunset-24:00, 04:00-sunrise; Fr-Sa sunset-sunrise").get(0).getPrettifiedValue());
     }
 
     @Test
     public void testI18n() {
-        assertTrue(OPENING_HOUR_TEST.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "de")
+        assertTrue(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "de")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
-        assertFalse(OPENING_HOUR_TEST.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "en")
+        assertFalse(openingHourTest.checkOpeningHourSyntax("opening_hours", ".", OpeningHourTest.CheckMode.POINTS_IN_TIME, false, "en")
                 .get(0).toString().contains("Unerwartetes Zeichen"));
     }
 
@@ -75,7 +85,7 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntax2() {
         final String key = "opening_hours";
-        final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Tue");
+        final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(key, "Mo-Tue");
         assertThat(errors, hasSize(2));
         assertEquals(key + " - Mo-Tue <--- (Please use the abbreviation \"Tu\" for \"tue\".)", errors.get(0).getMessage());
         assertEquals(Severity.WARNING, errors.get(0).getSeverity());
@@ -91,7 +101,7 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntax3() {
         final String key = "opening_hours";
-        final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
+        final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(key, "Sa-Su 10.00-20.00");
         assertThat(errors, hasSize(2));
         assertEquals(key + " - Sa-Su 10. <--- (Please use \":\" as hour/minute-separator)", errors.get(0).getMessage());
         assertEquals(Severity.WARNING, errors.get(0).getSeverity());
@@ -105,9 +115,9 @@ public class OpeningHourTestTest {
      */
     @Test
     public void testCheckOpeningHourSyntax4() {
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, null), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, ""), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(null, " "), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, null), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, ""), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(null, " "), isEmpty());
     }
 
     /**
@@ -116,13 +126,13 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntax5() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "badtext"), hasSize(1));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "badtext"), hasSize(1));
         assertEquals(key + " - ba <--- (Unexpected token: \"b\" Invalid/unsupported syntax.)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "badtext").get(0).getMessage());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
+                openingHourTest.checkOpeningHourSyntax(key, "badtext").get(0).getMessage());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m"), hasSize(1));
         assertEquals(key + " - 5.00 p <--- (hyphen (-) or open end (+) in time range expected. "
                 + "For working with points in time, the mode for opening_hours.js has to be altered. Maybe wrong tag?)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getMessage());
+                openingHourTest.checkOpeningHourSyntax(key, "5.00 p.m-11.00 p.m").get(0).getMessage());
     }
 
     /**
@@ -131,7 +141,7 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntax6() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "PH open \"always open on public holidays\""), isEmpty());
     }
 
     /**
@@ -140,9 +150,9 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntax7() {
         final String key = "opening_hours";
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
-        assertEquals(Severity.OTHER, OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
-        assertEquals("09:00-18:00", OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getPrettifiedValue());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00"), hasSize(1));
+        assertEquals(Severity.OTHER, openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getSeverity());
+        assertEquals("09:00-18:00", openingHourTest.checkOpeningHourSyntax(key, "9:00-18:00").get(0).getPrettifiedValue());
     }
 
     /**
@@ -151,11 +161,11 @@ public class OpeningHourTestTest {
     @Test
     public void testCheckOpeningHourSyntaxTicket9367() {
         final String key = "opening_hours";
-        assertEquals(Severity.WARNING, OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
+        assertEquals(Severity.WARNING, openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getSeverity());
         assertEquals(key + " - Mo,Tu 04-17 <--- (Time range without minutes specified. "
                 + "Not very explicit! Please use this syntax instead \"04:00-17:00\".)",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getMessage());
-        assertEquals("Mo,Tu 04:00-17:00", OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getPrettifiedValue());
+                openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getMessage());
+        assertEquals("Mo,Tu 04:00-17:00", openingHourTest.checkOpeningHourSyntax(key, "Mo,Tu 04-17").get(0).getPrettifiedValue());
     }
 
     /**
@@ -165,19 +175,19 @@ public class OpeningHourTestTest {
     public void testCheckServiceTimeSyntax1() {
         final String key = "service_times";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/service_times#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su 10:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "automatic", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Su 09:30; We 19:30", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su 10:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "automatic", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Sa 09:00-18:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Su 09:30; We 19:30", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
                 OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH), hasSize(1));
         assertEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
         assertEquals("Mo-Fr 00:00-00:30,04:00-00:30; Sa,Su,PH 00:00-24:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 0:00-0:30,4:00-00:30; Sa,Su,PH 0:00-24:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
     }
 
@@ -188,18 +198,18 @@ public class OpeningHourTestTest {
     public void testCheckCollectionTimeSyntax1() {
         final String key = "collection_times";
         // frequently used tags according to https://taginfo.openstreetmap.org/keys/collection_times#values
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Sa 09:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "fixme", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "daily", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Sa 09:00", OpeningHourTest.CheckMode.BOTH), isEmpty());
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "fixme", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "daily", OpeningHourTest.CheckMode.BOTH), not(isEmpty()));
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH), isEmpty());
-        assertThat(OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+        assertThat(openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH), hasSize(1));
         assertEquals(Severity.OTHER,
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getSeverity());
         assertEquals("Mo-Fr 13:30,17:45,19:00; Sa 15:00; Su 11:00",
-                OPENING_HOUR_TEST.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
+                openingHourTest.checkOpeningHourSyntax(key, "Mo-Fr 13:30, 17:45, 19:00; Sa 15:00; Su 11:00",
                 OpeningHourTest.CheckMode.BOTH).get(0).getPrettifiedValue());
     }
 
@@ -221,7 +231,7 @@ public class OpeningHourTestTest {
             }
         }
         for (final Tag t : values) {
-            final List<OpeningHourTest.OpeningHoursTestError> errors = OPENING_HOUR_TEST.checkOpeningHourSyntax(t.getKey(), t.getValue());
+            final List<OpeningHourTest.OpeningHoursTestError> errors = openingHourTest.checkOpeningHourSyntax(t.getKey(), t.getValue());
             assertThat(t + " is valid", errors, isEmpty());
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
index 1393c36..d371eb7 100644
--- a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
@@ -69,6 +69,7 @@ public class DefaultNameFormatterTest {
             // route(lcn Sal  Salier-Radweg(412 members)
             System.out.println("p3: "+DefaultNameFormatter.getInstance().format(p3)+" - "+p3);
 
+            // CHECKSTYLE.OFF: SingleSpaceSeparator
             assertEquals(comparator.compare(p1, p2), -1); // p1 < p2
             assertEquals(comparator.compare(p2, p1),  1); // p2 > p1
 
@@ -76,6 +77,7 @@ public class DefaultNameFormatterTest {
             assertEquals(comparator.compare(p3, p1),  1); // p3 > p1
             assertEquals(comparator.compare(p2, p3),  1); // p2 > p3
             assertEquals(comparator.compare(p3, p2), -1); // p3 < p2
+            // CHECKSTYLE.ON: SingleSpaceSeparator
 
             Relation[] relations = new ArrayList<>(ds.getRelations()).toArray(new Relation[0]);
 
diff --git a/test/unit/org/openstreetmap/josm/gui/MapViewStateTest.java b/test/unit/org/openstreetmap/josm/gui/MapViewStateTest.java
new file mode 100644
index 0000000..5481d08
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/MapViewStateTest.java
@@ -0,0 +1,149 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.junit.Assert.assertEquals;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.util.Arrays;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+
+/**
+ * Test {@link MapViewState}
+ * @author Michael Zangl
+ */
+public class MapViewStateTest {
+
+    private static final int WIDTH = 300;
+    private static final int HEIGHT = 200;
+    private MapViewState state;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Create the default state.
+     */
+    @Before
+    public void setUp() {
+        state = MapViewState.createDefaultState(WIDTH, HEIGHT);
+    }
+
+    /**
+     * Test {@link MapViewState#getCenter()} returns map view center.
+     */
+    @Test
+    public void testGetCenter() {
+        MapViewPoint center = state.getCenter();
+        assertHasViewCoords(WIDTH / 2, HEIGHT / 2, center);
+
+        MapViewState newState = state.movedTo(center, new EastNorth(3, 4));
+
+        // state should not change, but new state should.
+        center = state.getCenter();
+        assertHasViewCoords(WIDTH / 2, HEIGHT / 2, center);
+
+        center = newState.getCenter();
+        assertEquals("east", 3, center.getEastNorth().east(), 0.01);
+        assertEquals("north", 4, center.getEastNorth().north(), 0.01);
+    }
+
+    private void assertHasViewCoords(double x, double y, MapViewPoint center) {
+        assertEquals("x", x, center.getInViewX(), 0.01);
+        assertEquals("y", y, center.getInViewY(), 0.01);
+        assertEquals("x", x, center.getInView().getX(), 0.01);
+        assertEquals("y", y, center.getInView().getY(), 0.01);
+    }
+
+    /**
+     * Test {@link MapViewState#getForView(double, double)}
+     */
+    @Test
+    public void testGetForView() {
+        MapViewPoint corner = state.getForView(0, 0);
+        assertHasViewCoords(0, 0, corner);
+
+        MapViewPoint middle = state.getForView(120, 130);
+        assertHasViewCoords(120, 130, middle);
+
+        MapViewPoint fraction = state.getForView(0.12, 0.7);
+        assertHasViewCoords(0.12, 0.7, fraction);
+
+        MapViewPoint negative = state.getForView(-17, -30);
+        assertHasViewCoords(-17, -30, negative);
+    }
+
+    /**
+     * Test {@link MapViewState#getViewWidth()} and {@link MapViewState#getViewHeight()}
+     */
+    @Test
+    public void testGetViewSize() {
+        assertEquals(WIDTH, state.getViewWidth(), 0.01);
+        assertEquals(HEIGHT, state.getViewHeight(), 0.01);
+    }
+
+    /**
+     * Tests that all coordinate conversions for the point work.
+     */
+    @Test
+    public void testPointConversions() {
+        MapViewPoint p = state.getForView(WIDTH / 2, HEIGHT / 2);
+        assertHasViewCoords(WIDTH / 2, HEIGHT / 2, p);
+
+        EastNorth eastnorth = p.getEastNorth();
+        LatLon shouldLatLon = Main.getProjection().getWorldBoundsLatLon().getCenter();
+        EastNorth shouldEastNorth = Main.getProjection().latlon2eastNorth(shouldLatLon);
+        assertEquals("east", shouldEastNorth.east(), eastnorth.east(), 0.01);
+        assertEquals("north", shouldEastNorth.north(), eastnorth.north(), 0.01);
+        MapViewPoint reversed = state.getPointFor(shouldEastNorth);
+        assertHasViewCoords(WIDTH / 2, HEIGHT / 2, reversed);
+
+        LatLon latlon = p.getLatLon();
+        assertEquals("lat", shouldLatLon.lat(), latlon.lat(), 0.01);
+        assertEquals("lon", shouldLatLon.lon(), latlon.lon(), 0.01);
+
+        MapViewPoint p2 = state.getPointFor(new EastNorth(2, 3));
+        assertEquals("east", 2, p2.getEastNorth().east(), 0.01);
+        assertEquals("north", 3, p2.getEastNorth().north(), 0.01);
+    }
+
+    /**
+     * Test {@link MapViewState#getAffineTransform()}
+     */
+    @Test
+    public void testGetAffineTransform() {
+        for (EastNorth en : Arrays.asList(new EastNorth(100, 100), new EastNorth(0, 0), new EastNorth(300, 200),
+                new EastNorth(-1, -2.5))) {
+            MapViewPoint should = state.getPointFor(en);
+            AffineTransform transform = state.getAffineTransform();
+            Point2D result = transform.transform(new Point2D.Double(en.getX(), en.getY()), null);
+
+            assertEquals("x", should.getInViewX(), result.getX(), 0.01);
+            assertEquals("y", should.getInViewY(), result.getY(), 0.01);
+        }
+    }
+
+    /**
+     * Test {@link MapViewState.MapViewViewPoint#toString()} and {@link MapViewState.MapViewEastNorthPoint#toString()}
+     */
+    @Test
+    public void testToString() {
+        assertEquals("MapViewViewPoint [x=1.0, y=2.0]",
+                state.getForView(1, 2).toString());
+        assertEquals("MapViewEastNorthPoint [eastNorth=EastNorth[e=0.0, n=0.0]]",
+                state.getPointFor(new EastNorth(0, 0)).toString());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/NavigatableComponentTest.java b/test/unit/org/openstreetmap/josm/gui/NavigatableComponentTest.java
index 2680d57..594f542 100644
--- a/test/unit/org/openstreetmap/josm/gui/NavigatableComponentTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/NavigatableComponentTest.java
@@ -4,20 +4,25 @@ package org.openstreetmap.josm.gui;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
+import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.geom.Point2D;
 
+import javax.swing.JPanel;
+
 import org.CustomMatchers;
 import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Some tests for the {@link NavigatableComponent} class.
@@ -26,24 +31,35 @@ import org.openstreetmap.josm.gui.util.GuiHelper;
  */
 public class NavigatableComponentTest {
 
+    private final class NavigatableComponentMock extends NavigatableComponent {
+        @Override
+        public Point getLocationOnScreen() {
+            return new Point(30, 40);
+        }
+
+        @Override
+        protected boolean isVisibleOnScreen() {
+            return true;
+        }
+    }
+
     private static final int HEIGHT = 200;
     private static final int WIDTH = 300;
     private NavigatableComponent component;
 
     /**
-     * Setup test.
+     * We need the projection for coordinate conversions.
      */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().platform().projection();
 
     /**
      * Create a new, fresh {@link NavigatableComponent}
      */
     @Before
     public void setUp() {
-        component = new NavigatableComponent();
+        component = new NavigatableComponentMock();
         component.setBounds(new Rectangle(WIDTH, HEIGHT));
         // wait for the event to be propagated.
         GuiHelper.runInEDTAndWait(new Runnable() {
@@ -51,6 +67,10 @@ public class NavigatableComponentTest {
             public void run() {
             }
         });
+        component.setVisible(true);
+        JPanel parent = new JPanel();
+        parent.add(component);
+        component.updateLocationState();
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java
index 7cdfcf3..ed6c0d3 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java
@@ -111,7 +111,7 @@ public class InspectPrimitiveDialogTest {
         // CHECKSTYLE.ON: LineLength
 
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals("", InspectPrimitiveDialog.buildMapPaintText());
             Node n = new Node(LatLon.ZERO);
             n.setUser(User.getAnonymous());
@@ -125,7 +125,7 @@ public class InspectPrimitiveDialogTest {
             assertEquals(baseText + baseText + "Warning: The 2 selected objects have equal, but not identical style caches.",
                     InspectPrimitiveDialog.buildMapPaintText().replaceAll("@(\\p{XDigit})+", ""));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
index f0eea8f..36ff653 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
@@ -5,27 +5,27 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModel;
 import org.openstreetmap.josm.gui.layer.TMSLayer;
 import org.openstreetmap.josm.gui.layer.TMSLayerTest;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link LayerVisibilityAction} class.
  */
 public class LayerVisibilityActionTest {
-
     /**
-     * Setup tests
+     * TMS layer needs prefs. Platform for LayerListDialog shortcuts.
      */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences().projection().platform();
 
     /**
      * Unit test of {@link LayerVisibilityAction} class.
@@ -33,60 +33,61 @@ public class LayerVisibilityActionTest {
     @Test
     public void testLayerVisibilityAction() {
         TMSLayer layer = TMSLayerTest.createTmsLayer();
-        try {
-            LayerListModel model = LayerListDialog.getInstance().getModel();
-            LayerVisibilityAction action = new LayerVisibilityAction(model);
-            action.updateEnabledState();
-            assertFalse(action.isEnabled());
-
-            Main.map.mapView.addLayer(layer);
-            action.updateEnabledState();
-            assertTrue(action.isEnabled());
-            assertTrue(action.supportLayers(model.getSelectedLayers()));
+        LayerListModel model = new LayerListDialog(Main.getLayerManager()) {
+            @Override
+            protected void registerInWindowMenu() {
+                // ignore
+            }
+        }.getModel();
+        LayerVisibilityAction action = new LayerVisibilityAction(model);
+        action.updateEnabledState();
+        assertFalse(action.isEnabled());
 
-            // now check values
-            action.updateValues();
-            assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
+        Main.getLayerManager().addLayer(layer);
+        model.setSelectedLayer(layer);
+        action.updateEnabledState();
+        assertTrue(action.isEnabled());
+        assertTrue(action.supportLayers(model.getSelectedLayers()));
 
-            action.opacitySlider.setRealValue(.5);
-            action.updateValues();
+        // now check values
+        action.updateValues();
+        assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
 
-            assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
+        action.opacitySlider.setRealValue(.5);
+        action.updateValues();
 
-            action.setVisibleFlag(false);
-            action.updateValues();
-            assertFalse(layer.isVisible());
+        assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
 
-            action.setVisibleFlag(true);
-            action.updateValues();
-            assertTrue(layer.isVisible());
+        action.setVisibleFlag(false);
+        action.updateValues();
+        assertFalse(layer.isVisible());
 
-            // layer stays visible during adjust
-            action.opacitySlider.setValueIsAdjusting(true);
-            action.opacitySlider.setRealValue(0);
-            assertEquals(0, layer.getOpacity(), 1e-15);
-            layer.setOpacity(.1); // to make layer.isVisible work
-            assertTrue(layer.isVisible());
-            layer.setOpacity(0);
+        action.setVisibleFlag(true);
+        action.updateValues();
+        assertTrue(layer.isVisible());
 
-            action.opacitySlider.setValueIsAdjusting(false);
-            action.opacitySlider.setRealValue(0);
-            assertEquals(0, layer.getOpacity(), 1e-15);
-            layer.setOpacity(.1); // to make layer.isVisible work
-            assertFalse(layer.isVisible());
-            layer.setOpacity(0);
-            action.updateValues();
+        // layer stays visible during adjust
+        action.opacitySlider.setValueIsAdjusting(true);
+        action.opacitySlider.setRealValue(0);
+        assertEquals(0, layer.getOpacity(), 1e-15);
+        layer.setOpacity(.1); // to make layer.isVisible work
+        assertTrue(layer.isVisible());
+        layer.setOpacity(0);
 
-            // Opacity reset when it was 0 and user set layer to visible.
-            action.setVisibleFlag(true);
-            action.updateValues();
-            assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
-            assertEquals(1.0, layer.getOpacity(), 1e-15);
+        action.opacitySlider.setValueIsAdjusting(false);
+        action.opacitySlider.setRealValue(0);
+        assertEquals(0, layer.getOpacity(), 1e-15);
+        layer.setOpacity(.1); // to make layer.isVisible work
+        assertFalse(layer.isVisible());
+        layer.setOpacity(0);
+        action.updateValues();
 
-        } finally {
-            Main.map.mapView.removeLayer(layer);
-        }
+        // Opacity reset when it was 0 and user set layer to visible.
+        action.setVisibleFlag(true);
+        action.updateValues();
+        assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+        assertEquals(1.0, layer.getOpacity(), 1e-15);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java
index a5eb61e..bbbf3da 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableTest.java
@@ -48,7 +48,7 @@ public class SelectionTableTest {
         // Add a new layer as active one
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             // Constructs models and table
             MemberTableModel memberTableModel = new MemberTableModel(r, layer, null);
             memberTableModel.populate(r);
@@ -83,7 +83,7 @@ public class SelectionTableTest {
                 memberTableModel.unregister();
             }
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
index 438e645..1d8acb0 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/GpxLayerTest.java
@@ -10,6 +10,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.TimeZone;
 
 import javax.swing.JScrollPane;
 
@@ -170,6 +171,9 @@ public class GpxLayerTest {
         assertEquals("", GpxLayer.getTimespanForTrack(
                 new ImmutableGpxTrack(new ArrayList<Collection<WayPoint>>(), new HashMap<String, Object>())));
 
+        assertEquals("1/3/16 11:59 AM - 12:00 PM (0:00)", GpxLayer.getTimespanForTrack(getMinimalGpxData().tracks.iterator().next()));
+
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         assertEquals("1/3/16 12:59 PM - 1:00 PM (0:00)", GpxLayer.getTimespanForTrack(getMinimalGpxData().tracks.iterator().next()));
     }
 
@@ -195,11 +199,11 @@ public class GpxLayerTest {
     public void testPaint() throws Exception {
         GpxLayer layer = getMinimalGpxLayer();
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertTrue(layer.getMenuEntries().length > 0);
             layer.paint(TestUtils.newGraphics(), Main.map.mapView, layer.data.getMetaBounds());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
index 36205de..5fe8dde 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.layer;
 
+import static org.hamcrest.CoreMatchers.any;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -9,7 +10,10 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.awt.Component;
+import java.awt.Graphics;
 import java.awt.Graphics2D;
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Arrays;
 
@@ -17,6 +21,7 @@ import javax.swing.Action;
 import javax.swing.Icon;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
@@ -26,7 +31,9 @@ import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.testutils.ExpectedRootException;
 import org.openstreetmap.josm.tools.Predicates;
+import org.openstreetmap.josm.tools.bugreport.ReportedException;
 
 /**
  * Test the {@link LayerManager} class.
@@ -35,8 +42,15 @@ import org.openstreetmap.josm.tools.Predicates;
  */
 public class LayerManagerTest {
 
-    protected static class AbstractTestLayer extends Layer {
-        protected AbstractTestLayer() {
+    /**
+     * This is a layer that can be used in tests. It does not do anything and provides a simple, fake implementation.
+     * @author Michael Zangl
+     */
+    public static class TestLayer extends Layer {
+        /**
+         * Create a new test layer.
+         */
+        public TestLayer() {
             super("Test Layer");
         }
 
@@ -64,7 +78,7 @@ public class LayerManagerTest {
 
         @Override
         public Action[] getMenuEntries() {
-            return null;
+            return new Action[0];
         }
 
         @Override
@@ -74,7 +88,22 @@ public class LayerManagerTest {
 
         @Override
         public Icon getIcon() {
-            return null;
+            return new Icon() {
+                @Override
+                public void paintIcon(Component c, Graphics g, int x, int y) {
+                    // nop
+                }
+
+                @Override
+                public int getIconWidth() {
+                    return 10;
+                }
+
+                @Override
+                public int getIconHeight() {
+                    return 10;
+                }
+            };
         }
 
         @Override
@@ -83,7 +112,7 @@ public class LayerManagerTest {
         }
     }
 
-    protected static class AbstractTestLayer2 extends AbstractTestLayer {}
+    protected static class TestLayer2 extends TestLayer {}
 
     /**
      * Intercepts the events for easier testing.
@@ -118,16 +147,21 @@ public class LayerManagerTest {
             assertSame(layerManager, e.getSource());
             layerOrderChanged = e;
         }
-
     }
 
     protected LayerManager layerManager;
 
     /**
+     * Rule used to expect exceptions.
+     */
+    @Rule
+    public ExpectedRootException thrown = ExpectedRootException.none();
+
+    /**
      * Set up test layer manager.
      */
     @Before
-    public void setUp()   {
+    public void setUp() {
         layerManager = new LayerManager();
     }
 
@@ -136,7 +170,7 @@ public class LayerManagerTest {
      */
     @Test
     public void testAddLayer() {
-        Layer layer1 = new AbstractTestLayer() {
+        Layer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.IN_FRONT;
@@ -147,13 +181,13 @@ public class LayerManagerTest {
                 return true;
             }
         };
-        Layer layer2 = new AbstractTestLayer() {
+        Layer layer2 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.IN_FRONT;
             }
         };
-        Layer layer3 = new AbstractTestLayer() {
+        Layer layer3 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return LayerPositionStrategy.BEFORE_FIRST_BACKGROUND_LAYER;
@@ -168,7 +202,7 @@ public class LayerManagerTest {
         assertEquals(layerManager.getLayers(), Arrays.asList(layer2, layer3, layer1));
 
         // event
-        AbstractTestLayer layer4 = new AbstractTestLayer();
+        TestLayer layer4 = new TestLayer();
         CapturingLayerChangeListener l = new CapturingLayerChangeListener();
         layerManager.addLayerChangeListener(l);
         layerManager.addLayer(layer4);
@@ -181,9 +215,13 @@ public class LayerManagerTest {
     /**
      * {@link LayerManager#addLayer(Layer)}: duplicate layers
      */
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void testAddLayerFails() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        thrown.expect(ReportedException.class);
+        thrown.expectCause(any(InvocationTargetException.class));
+        thrown.expectRootCause(any(IllegalArgumentException.class));
+
+        TestLayer layer1 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer1);
     }
@@ -191,9 +229,13 @@ public class LayerManagerTest {
     /**
      * {@link LayerManager#addLayer(Layer)}: illegal default layer position
      */
-    @Test(expected = IndexOutOfBoundsException.class)
+    @Test
     public void testAddLayerIllegalPosition() {
-        AbstractTestLayer layer1 = new AbstractTestLayer() {
+        thrown.expect(ReportedException.class);
+        thrown.expectCause(any(InvocationTargetException.class));
+        thrown.expectRootCause(any(IndexOutOfBoundsException.class));
+
+        TestLayer layer1 = new TestLayer() {
             @Override
             public LayerPositionStrategy getDefaultLayerPosition() {
                 return new LayerPositionStrategy() {
@@ -212,8 +254,8 @@ public class LayerManagerTest {
      */
     @Test
     public void testRemoveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
@@ -233,8 +275,8 @@ public class LayerManagerTest {
      */
     @Test
     public void testMoveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
@@ -259,10 +301,14 @@ public class LayerManagerTest {
     /**
      * {@link LayerManager#moveLayer(Layer, int)} fails for wrong index
      */
-    @Test(expected = IndexOutOfBoundsException.class)
+    @Test
     public void testMoveLayerFailsRange() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        thrown.expect(ReportedException.class);
+        thrown.expectCause(any(InvocationTargetException.class));
+        thrown.expectRootCause(any(IndexOutOfBoundsException.class));
+
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         layerManager.moveLayer(layer2, 2);
@@ -271,10 +317,14 @@ public class LayerManagerTest {
     /**
      * {@link LayerManager#moveLayer(Layer, int)} fails for wrong layer
      */
-    @Test(expected = IllegalArgumentException.class)
+    @Test
     public void testMoveLayerFailsNotInList() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        thrown.expect(ReportedException.class);
+        thrown.expectCause(any(InvocationTargetException.class));
+        thrown.expectRootCause(any(IllegalArgumentException.class));
+
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.moveLayer(layer2, 0);
     }
@@ -285,8 +335,8 @@ public class LayerManagerTest {
     @Test(expected = UnsupportedOperationException.class)
     public void testGetLayers() {
         // list should be immutable
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         layerManager.getLayers().remove(0);
@@ -297,13 +347,13 @@ public class LayerManagerTest {
      */
     @Test
     public void testGetLayersOfType() {
-        AbstractTestLayer2 layer1 = new AbstractTestLayer2();
-        AbstractTestLayer2 layer2 = new AbstractTestLayer2();
+        TestLayer2 layer1 = new TestLayer2();
+        TestLayer2 layer2 = new TestLayer2();
         layerManager.addLayer(layer1);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         layerManager.addLayer(layer2);
 
-        assertEquals(layerManager.getLayersOfType(AbstractTestLayer2.class), Arrays.asList(layer1, layer2));
+        assertEquals(layerManager.getLayersOfType(TestLayer2.class), Arrays.asList(layer1, layer2));
     }
 
     /**
@@ -311,12 +361,12 @@ public class LayerManagerTest {
      */
     @Test
     public void testContainsLayer() {
-        AbstractTestLayer layer = new AbstractTestLayer();
+        TestLayer layer = new TestLayer();
         layerManager.addLayer(layer);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
 
         assertTrue(layerManager.containsLayer(layer));
-        assertFalse(layerManager.containsLayer(new AbstractTestLayer()));
+        assertFalse(layerManager.containsLayer(new TestLayer()));
     }
 
     /**
@@ -347,8 +397,8 @@ public class LayerManagerTest {
     @Test
     public void testAddLayerChangeListenerFire() {
         final ArrayList<Layer> fired = new ArrayList<>();
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         layerManager.addLayerChangeListener(new LayerChangeListener() {
@@ -378,9 +428,9 @@ public class LayerManagerTest {
     public void testRemoveLayerChangeListener() {
         CapturingLayerChangeListener l = new CapturingLayerChangeListener();
         layerManager.addLayerChangeListener(l);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         layerManager.removeLayerChangeListener(l);
-        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(new TestLayer());
         // threw exception when fired twice.
         assertNotNull(l.layerAdded);
         assertNull(l.layerRemoved);
@@ -402,8 +452,8 @@ public class LayerManagerTest {
     @Test
     public void testRemoveLayerChangeListenerFire() {
         final ArrayList<Layer> fired = new ArrayList<>();
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManager.addLayer(layer1);
         layerManager.addLayer(layer2);
         LayerChangeListener listener = new LayerChangeListener() {
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
index 297423d..c1ee42f 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
@@ -67,9 +67,9 @@ public class MainLayerManagerTest extends LayerManagerTest {
 
     @Test
     public void testAddLayerSetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         assertNull(layerManagerWithActive.getActiveLayer());
         assertNull(layerManagerWithActive.getEditLayer());
         layerManagerWithActive.addLayer(layer1);
@@ -85,9 +85,9 @@ public class MainLayerManagerTest extends LayerManagerTest {
 
     @Test
     public void testRemoveLayerUnsetsActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
@@ -109,19 +109,23 @@ public class MainLayerManagerTest extends LayerManagerTest {
         assertNull(layerManagerWithActive.getEditLayer());
     }
 
+    /**
+     * Test {@link MainLayerManager#addActiveLayerChangeListener(ActiveLayerChangeListener)} and
+     * {@link MainLayerManager#addAndFireActiveLayerChangeListener(ActiveLayerChangeListener)}
+     */
     @Test
     public void testAddActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
 
         CapturingActiveLayerChangeListener listener = new CapturingThreadCheckingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
         assertNull(listener.lastEvent);
 
         CapturingActiveLayerChangeListener listener2 = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener2, true);
+        layerManagerWithActive.addAndFireActiveLayerChangeListener(listener2);
         assertSame(listener2.lastEvent.getPreviousActiveLayer(), null);
         assertSame(listener2.lastEvent.getPreviousEditLayer(), null);
 
@@ -140,8 +144,8 @@ public class MainLayerManagerTest extends LayerManagerTest {
     @Test(expected = IllegalArgumentException.class)
     public void testAddActiveLayerChangeListenerTwice() {
         CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
     }
 
     /**
@@ -149,13 +153,13 @@ public class MainLayerManagerTest extends LayerManagerTest {
      */
     @Test
     public void testRemoveActiveLayerChangeListener() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
 
         CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
-        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener);
         layerManagerWithActive.removeActiveLayerChangeListener(listener);
 
         layerManagerWithActive.setActiveLayer(layer2);
@@ -177,8 +181,8 @@ public class MainLayerManagerTest extends LayerManagerTest {
      */
     @Test
     public void testSetGetActiveLayer() {
-        AbstractTestLayer layer1 = new AbstractTestLayer();
-        AbstractTestLayer layer2 = new AbstractTestLayer();
+        TestLayer layer1 = new TestLayer();
+        TestLayer layer2 = new TestLayer();
         layerManagerWithActive.addLayer(layer1);
         layerManagerWithActive.addLayer(layer2);
 
@@ -195,7 +199,7 @@ public class MainLayerManagerTest extends LayerManagerTest {
     @Test
     public void testGetEditDataSet() {
         assertNull(layerManagerWithActive.getEditDataSet());
-        AbstractTestLayer layer0 = new AbstractTestLayer();
+        TestLayer layer0 = new TestLayer();
         layerManagerWithActive.addLayer(layer0);
         assertNull(layerManagerWithActive.getEditDataSet());
 
@@ -218,10 +222,10 @@ public class MainLayerManagerTest extends LayerManagerTest {
     public void testGetVisibleLayersInZOrder() {
         AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
         AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer3 = new AbstractTestLayer();
+        TestLayer layer3 = new TestLayer();
         layer3.setVisible(false);
         AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
-        AbstractTestLayer layer5 = new AbstractTestLayer();
+        TestLayer layer5 = new TestLayer();
         AbstractTestOsmLayer layer6 = new AbstractTestOsmLayer();
         AbstractTestOsmLayer layer7 = new AbstractTestOsmLayer();
         layerManagerWithActive.addLayer(layer1);
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
index 97d2f8a..3311a9a 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
@@ -43,7 +43,7 @@ public class OsmDataLayerTest {
         DataSet ds = new DataSet();
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             int n = OsmDataLayer.PROPERTY_RECENT_RELATIONS_NUMBER.get();
             assertTrue(n > 0);
             for (int i = 0; i < 2*n; i++) {
@@ -59,7 +59,7 @@ public class OsmDataLayerTest {
             }
             assertTrue(layer.getRecentRelations().isEmpty());
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -133,11 +133,11 @@ public class OsmDataLayerTest {
         fillDataSet(ds);
         OsmDataLayer layer = new OsmDataLayer(ds, "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertTrue(layer.getMenuEntries().length > 0);
             layer.paint(TestUtils.newGraphics(), Main.map.mapView, new Bounds(LatLon.ZERO));
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/TMSLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/TMSLayerTest.java
index f5c7d3b..21d2004 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/TMSLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/TMSLayerTest.java
@@ -49,11 +49,11 @@ public class TMSLayerTest {
 
     private static void test(ImageryType expected, TMSLayer layer) {
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertEquals(expected, layer.getInfo().getImageryType());
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/ValidatorLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/ValidatorLayerTest.java
index c0237c6..9d9ff2f 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/ValidatorLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/ValidatorLayerTest.java
@@ -32,7 +32,7 @@ public class ValidatorLayerTest {
         ValidatorLayer layer = null;
         try {
             layer = new ValidatorLayer();
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             assertFalse(layer.isMergable(null));
             assertNotNull(layer.getIcon());
             assertEquals("<html>No validation errors</html>", layer.getToolTipText());
@@ -41,7 +41,7 @@ public class ValidatorLayerTest {
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
             if (layer != null) {
-                Main.main.removeLayer(layer);
+                Main.getLayerManager().removeLayer(layer);
             }
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/WMSLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/WMSLayerTest.java
index 0722429..5578934 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/WMSLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/WMSLayerTest.java
@@ -29,12 +29,12 @@ public class WMSLayerTest {
     @Test
     public void testWMSLayer() {
         WMSLayer wms = new WMSLayer(new ImageryInfo("test wms", "http://localhost"));
-        Main.main.addLayer(wms);
+        Main.getLayerManager().addLayer(wms);
         try {
             assertEquals(ImageryType.WMS, wms.getInfo().getImageryType());
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(wms);
+            Main.getLayerManager().removeLayer(wms);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImagesTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImagesTest.java
index cbe03de..6aaaa94 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImagesTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImagesTest.java
@@ -11,7 +11,7 @@ import java.util.TimeZone;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.CachedLatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.io.GpxReaderTest;
 import org.openstreetmap.josm.tools.Pair;
@@ -57,10 +57,10 @@ public class CorrelateGpxWithImagesTest {
         i3.createTmp();
 
         assertEquals(4, CorrelateGpxWithImages.matchGpxTrack(Arrays.asList(i0, i1, i2, i3), gpx, 0));
-        assertEquals(new LatLon(47.19286847859621, 8.79732714034617), i0.getPos()); // start of track
-        assertEquals(new LatLon(47.196979885920882, 8.79541271366179), i1.getPos()); // exact match
-        assertEquals(new LatLon(47.197319911792874, 8.792139580473304), i3.getPos()); // exact match
-        assertEquals(new LatLon((47.197131179273129 + 47.197186248376966) / 2, (8.792974585667253 + 8.792809881269932) / 2),
+        assertEquals(new CachedLatLon(47.19286847859621, 8.79732714034617), i0.getPos()); // start of track
+        assertEquals(new CachedLatLon(47.196979885920882, 8.79541271366179), i1.getPos()); // exact match
+        assertEquals(new CachedLatLon(47.197319911792874, 8.792139580473304), i3.getPos()); // exact match
+        assertEquals(new CachedLatLon((47.197131179273129 + 47.197186248376966) / 2, (8.792974585667253 + 8.792809881269932) / 2),
                 i2.getPos()); // interpolated
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
index dd20ea9..eb90cac 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
@@ -9,27 +9,28 @@ import java.io.InputStream;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer.Loader;
 import org.openstreetmap.josm.io.GpxReader;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link GeoImageLayer} class.
  */
 public class GeoImageLayerTest {
-
     /**
-     * Setup test.
+     * We need prefs for this.
      */
-    @BeforeClass
-    public static void setUpBeforeClass() {
-        JOSMFixture.createUnitTestFixture().init(true);
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
+
 
     /**
      * Unit test of {@link Loader} class.
@@ -41,28 +42,18 @@ public class GeoImageLayerTest {
             GpxReader reader = new GpxReader(in);
             assertTrue(reader.parse(true));
             GpxLayer gpxLayer = new GpxLayer(reader.getGpxData());
-            try {
-                Main.main.addLayer(gpxLayer);
-                assertEquals(1, Main.map.mapView.getNumLayers());
-                new Loader(
-                        Collections.singleton(new File(TestUtils.getRegressionDataFile(12255, "G0016941.JPG"))),
-                        gpxLayer).run();
-                assertEquals(2, Main.map.mapView.getNumLayers());
-                GeoImageLayer layer = Main.map.mapView.getLayersOfType(GeoImageLayer.class).iterator().next();
-                try {
-                    assertEquals(gpxLayer, layer.getGpxLayer());
-                    List<ImageEntry> images = layer.getImages();
-                    assertEquals(1, images.size());
-                    assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getInfoComponent());
-                    assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getToolTipText());
-                } finally {
-                    // Ensure we clean the place before leaving, even if test fails.
-                    Main.map.mapView.removeLayer(layer);
-                }
-            } finally {
-                // Ensure we clean the place before leaving, even if test fails.
-                Main.main.removeLayer(gpxLayer);
-            }
+            Main.getLayerManager().addLayer(gpxLayer);
+            assertEquals(1, Main.getLayerManager().getLayers().size());
+            new Loader(
+                    Collections.singleton(new File(TestUtils.getRegressionDataFile(12255, "G0016941.JPG"))),
+                    gpxLayer).run();
+            assertEquals(2, Main.getLayerManager().getLayers().size());
+            GeoImageLayer layer = Main.getLayerManager().getLayersOfType(GeoImageLayer.class).iterator().next();
+            assertEquals(gpxLayer, layer.getGpxLayer());
+            List<ImageEntry> images = layer.getImages();
+            assertEquals(1, images.size());
+            assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getInfoComponent());
+            assertEquals("<html>1 image loaded. 0 were found to be GPS tagged.</html>", layer.getToolTipText());
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
index d3ffaf7..71663c3 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
@@ -31,13 +31,13 @@ public class DownloadAlongTrackActionTest {
     private static PleaseWaitRunnable createTask(String file) throws Exception {
         final OsmDataLayer layer = new OsmDataLayer(new DataSet(), DownloadAlongTrackActionTest.class.getName(), null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             // Perform action
             final GpxData gpx = GpxReaderTest.parseGpxData(TestUtils.getTestDataRoot() + file);
             return new DownloadAlongTrackAction(gpx).createTask();
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java
index 034e619..3a54301 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java
@@ -46,7 +46,7 @@ public class DownloadWmsAlongTrackActionTest {
         // Create new TMS layer and clear cache
         TMSLayer layer = new TMSLayer(new ImageryInfo("OSM TMS", "https://a.tile.openstreetmap.org/{zoom}/{x}/{y}.png", "tms", null, null));
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             TMSLayer.getCache().clear();
             assertTrue(TMSLayer.getCache().getMatching(".*").isEmpty());
             // Perform action
@@ -57,7 +57,7 @@ public class DownloadWmsAlongTrackActionTest {
             assertFalse(TMSLayer.getCache().getMatching(".*").isEmpty());
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayerTest.java
index 30fd8f9..19dfbb0 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayerTest.java
@@ -36,7 +36,7 @@ public class MarkerLayerTest {
      * Unit test of {@link MarkerLayer#MarkerLayer}.
      */
     @Test
-    public void testMarkerLayer()  {
+    public void testMarkerLayer() {
         assertEquals(Color.magenta, MarkerLayer.getGenericColor());
         MarkerLayer layer = new MarkerLayer(new GpxData(), "foo", null, null);
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreferenceTest.java
index 1ad4e6e..9f25e9c 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreferenceTest.java
@@ -25,7 +25,7 @@ public class AdvancedPreferenceTest {
      * Unit test of {@link AdvancedPreference#AdvancedPreference}.
      */
     @Test
-    public void testAdvancedPreference()  {
+    public void testAdvancedPreference() {
         assertNotNull(new AdvancedPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileActionTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileActionTest.java
index b59a74c..776fae9 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileActionTest.java
@@ -23,7 +23,7 @@ public class ExportProfileActionTest {
      * Unit test of {@link ExportProfileAction#actionPerformed}.
      */
     @Test
-    public void testAction()  {
+    public void testAction() {
         new ExportProfileAction(Main.pref, "foo", "bar").actionPerformed(null);
         new ExportProfileAction(Main.pref, "expert", "expert").actionPerformed(null);
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ListEditorTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ListEditorTest.java
index 233b5f9..a4b324d 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ListEditorTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/ListEditorTest.java
@@ -29,7 +29,7 @@ public class ListEditorTest {
      * Unit test of {@link ListSettingTableModel} class.
      */
     @Test
-    public void testListSettingTableModel()  {
+    public void testListSettingTableModel() {
         ListSettingTableModel model = new ListSettingTableModel(null);
         assertNotNull(model.getData());
         model = new ListSettingTableModel(Arrays.asList("foo"));
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PrefEntryTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PrefEntryTest.java
index 79e9a46..66b9838 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PrefEntryTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PrefEntryTest.java
@@ -29,7 +29,7 @@ public class PrefEntryTest {
      * Unit test of {@link PrefEntry#PrefEntry}.
      */
     @Test
-    public void testPrefEntry()  {
+    public void testPrefEntry() {
         String key = "key";
         StringSetting val = new StringSetting("value");
         StringSetting def = new StringSetting("defaultValue");
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTableTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTableTest.java
index c658a9a..538c0cb 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTableTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTableTest.java
@@ -41,7 +41,7 @@ public class PreferencesTableTest {
      * Unit test of {@link PreferencesTable#PreferencesTable}.
      */
     @Test
-    public void testPreferencesTable()  {
+    public void testPreferencesTable() {
         PreferencesTable t = newTable();
         t.fireDataChanged();
         assertTrue(t.getSelectedItems().isEmpty());
@@ -54,7 +54,7 @@ public class PreferencesTableTest {
      * Unit test of {@link PreferencesTable.AllSettingsTableModel} class.
      */
     @Test
-    public void testAllSettingsTableModel()  {
+    public void testAllSettingsTableModel() {
         AllSettingsTableModel model = (AllSettingsTableModel) newTable().getModel();
         assertEquals(1, model.getRowCount());
         assertFalse(model.isCellEditable(0, 0));
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/audio/AudioPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/audio/AudioPreferenceTest.java
index b92f072..625e890 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/audio/AudioPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/audio/AudioPreferenceTest.java
@@ -26,7 +26,7 @@ public class AudioPreferenceTest {
      * Unit test of {@link AudioPreference#AudioPreference}.
      */
     @Test
-    public void testAudioPreference()  {
+    public void testAudioPreference() {
         assertNotNull(new AudioPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/display/ColorPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/display/ColorPreferenceTest.java
index 97a2dc6..b2f8aad 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/display/ColorPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/display/ColorPreferenceTest.java
@@ -25,7 +25,7 @@ public class ColorPreferenceTest {
      * Unit test of {@link ColorPreference#ColorPreference}.
      */
     @Test
-    public void testColorPreference()  {
+    public void testColorPreference() {
         assertNotNull(new ColorPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/display/DisplayPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/display/DisplayPreferenceTest.java
index fe5ebcb..79b1db7 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/display/DisplayPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/display/DisplayPreferenceTest.java
@@ -25,7 +25,7 @@ public class DisplayPreferenceTest {
      * Unit test of {@link DisplayPreference#DisplayPreference}.
      */
     @Test
-    public void testDisplayPreference()  {
+    public void testDisplayPreference() {
         assertNotNull(new DisplayPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/display/DrawingPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/display/DrawingPreferenceTest.java
index 568e533..da65a4f 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/display/DrawingPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/display/DrawingPreferenceTest.java
@@ -25,7 +25,7 @@ public class DrawingPreferenceTest {
      * Unit test of {@link DrawingPreference#DrawingPreference}.
      */
     @Test
-    public void testDrawingPreference()  {
+    public void testDrawingPreference() {
         assertNotNull(new DrawingPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/display/LafPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/display/LafPreferenceTest.java
index cd5590e..5193af6 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/display/LafPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/display/LafPreferenceTest.java
@@ -25,7 +25,7 @@ public class LafPreferenceTest {
      * Unit test of {@link LafPreference#LafPreference}.
      */
     @Test
-    public void testLafPreference()  {
+    public void testLafPreference() {
         assertNotNull(new LafPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/display/LanguagePreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/display/LanguagePreferenceTest.java
index 0b583ce..42a3da8 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/display/LanguagePreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/display/LanguagePreferenceTest.java
@@ -25,7 +25,7 @@ public class LanguagePreferenceTest {
      * Unit test of {@link LanguagePreference#LanguagePreference}.
      */
     @Test
-    public void testLanguagePreference()  {
+    public void testLanguagePreference() {
         assertNotNull(new LanguagePreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTest.java
index 32ba9e2..ad2ca85 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreferenceTest.java
@@ -25,7 +25,7 @@ public class ImageryPreferenceTest {
      * Unit test of {@link ImageryPreference#ImageryPreference}.
      */
     @Test
-    public void testImageryPreference()  {
+    public void testImageryPreference() {
         assertNotNull(new ImageryPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/BackupPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/BackupPreferenceTest.java
index 8adf9f4..8affe3a 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/BackupPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/BackupPreferenceTest.java
@@ -25,7 +25,7 @@ public class BackupPreferenceTest {
      * Unit test of {@link BackupPreference#BackupPreference}.
      */
     @Test
-    public void testBackupPreference()  {
+    public void testBackupPreference() {
         assertNotNull(new BackupPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTest.java
index fb32b50..5934760 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTest.java
@@ -25,7 +25,7 @@ public class MapPaintPreferenceTest {
      * Unit test of {@link MapPaintPreference#MapPaintPreference}.
      */
     @Test
-    public void testMapPaintPreference()  {
+    public void testMapPaintPreference() {
         assertNotNull(new MapPaintPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
index 6f05834..c8b7484 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
@@ -86,12 +86,12 @@ public class MapPaintPreferenceTestIT {
                     if (!errors.isEmpty()) {
                         allErrors.put(source.url, errors);
                     }
-                    if (!warnings.isEmpty()) {
+                    if (!warnings.isEmpty() && !source.url.contains("yopaseopor/traffic_signs")) {
+                        // ignore https://github.com/yopaseopor/traffic_signs_style_JOSM because of far too frequent missing icons errors
                         allWarnings.put(source.url, warnings);
                     }
-                } else if (!source.url.contains("www.freietonne.de") && !source.url.contains("yopaseopor/traffic_signs")) {
+                } else if (!source.url.contains("www.freietonne.de")) {
                     // ignore frequent network errors with www.freietonne.de causing too much Jenkins failures
-                    // also ignore https://github.com/yopaseopor/traffic_signs_style_JOSM because of far too frequent missing icons errors
                     allWarnings.put(source.url, Collections.singleton("MapPaintStyles.addStyle() returned null"));
                 }
             }
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPreferenceTest.java
index 2ddabd3..8b94d9a 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPreferenceTest.java
@@ -25,7 +25,7 @@ public class MapPreferenceTest {
      * Unit test of {@link MapPreference#MapPreference}.
      */
     @Test
-    public void testMapPreference()  {
+    public void testMapPreference() {
         assertNotNull(new MapPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTest.java
index 18d86d1..374909b 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTest.java
@@ -25,7 +25,7 @@ public class TaggingPresetPreferenceTest {
      * Unit test of {@link TaggingPresetPreference#TaggingPresetPreference}.
      */
     @Test
-    public void testTaggingPresetPreference()  {
+    public void testTaggingPresetPreference() {
         assertNotNull(new TaggingPresetPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java b/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
index a37ff93..76a1dc6 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
@@ -69,8 +69,7 @@ public class TaggingPresetPreferenceTestIT {
                 } catch (SAXException | IOException e1) {
                     e.printStackTrace();
                     // ignore frequent network errors with www.freietonne.de causing too much Jenkins failures
-                    // also ignore https://github.com/yopaseopor/traffic_signs_preset_JOSM because of far too frequent missing icons errors
-                    if (!source.url.contains("www.freietonne.de") && !source.url.contains("yopaseopor/traffic_signs")) {
+                    if (!source.url.contains("www.freietonne.de")) {
                         allErrors.add(e1);
                     }
                     System.out.println(" => KO");
@@ -93,7 +92,10 @@ public class TaggingPresetPreferenceTestIT {
         for (String message : errorsAndWarnings) {
             if (message.contains(TaggingPreset.PRESET_ICON_ERROR_MSG_PREFIX)) {
                 error = true;
-                allMessages.add(message);
+                // ignore https://github.com/yopaseopor/traffic_signs_preset_JOSM because of far too frequent missing icons errors
+                if (!source.url.contains("yopaseopor/traffic_signs")) {
+                    allMessages.add(message);
+                }
             }
         }
         System.out.println(error ? " => KO" : " => OK");
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java
index 6174441..a9ab6a4 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferenceTest.java
@@ -35,7 +35,7 @@ public class PluginPreferenceTest {
      * Unit test of {@link PluginPreference#PluginPreference}.
      */
     @Test
-    public void testPluginPreference()  {
+    public void testPluginPreference() {
         assertNotNull(new PluginPreference.Factory().createPreferenceSetting());
     }
 
@@ -44,7 +44,7 @@ public class PluginPreferenceTest {
      * @throws Exception if an error occurs
      */
     @Test
-    public void testBuildDownloadSummary() throws Exception  {
+    public void testBuildDownloadSummary() throws Exception {
         final PluginInformation dummy = new PluginInformation(
                 new File(TestUtils.getTestDataRoot() + "plugin/dummy_plugin.jar"), "dummy_plugin");
         assertEquals("", PluginPreference.buildDownloadSummary(
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreferenceTest.java
index e7e9098..01cd521 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreferenceTest.java
@@ -26,7 +26,7 @@ public class ProjectionPreferenceTest {
      * Unit test of {@link ProjectionPreference#ProjectionPreference}.
      */
     @Test
-    public void testProjectionPreference()  {
+    public void testProjectionPreference() {
         assertNotNull(new ProjectionPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreferenceTest.java
index 158824a..8202217 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/remotecontrol/RemoteControlPreferenceTest.java
@@ -25,7 +25,7 @@ public class RemoteControlPreferenceTest {
      * Unit test of {@link RemoteControlPreference#RemoteControlPreference}.
      */
     @Test
-    public void testRemoteControlPreference()  {
+    public void testRemoteControlPreference() {
         assertNotNull(new RemoteControlPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferenceTest.java
index 47a7a24..35c3dce 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferenceTest.java
@@ -25,7 +25,7 @@ public class AuthenticationPreferenceTest {
      * Unit test of {@link AuthenticationPreference#AuthenticationPreference}.
      */
     @Test
-    public void testAuthenticationPreference()  {
+    public void testAuthenticationPreference() {
         assertNotNull(new AuthenticationPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreferenceTest.java
index aacdd2e..45cd9b8 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreferenceTest.java
@@ -25,7 +25,7 @@ public class OverpassServerPreferenceTest {
      * Unit test of {@link OverpassServerPreference#OverpassServerPreference}.
      */
     @Test
-    public void testOverpassServerPreference()  {
+    public void testOverpassServerPreference() {
         assertNotNull(new OverpassServerPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
index 6ef9127..0a235d3 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
@@ -25,7 +25,7 @@ public class ProxyPreferenceTest {
      * Unit test of {@link ProxyPreference#ProxyPreference}.
      */
     @Test
-    public void testProxyPreference()  {
+    public void testProxyPreference() {
         assertNotNull(new ProxyPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
index ae7f180..759dcf6 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
@@ -25,7 +25,7 @@ public class ServerAccessPreferenceTest {
      * Unit test of {@link ServerAccessPreference#ServerAccessPreference}.
      */
     @Test
-    public void testServerAccessPreference()  {
+    public void testServerAccessPreference() {
         assertNotNull(new ServerAccessPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreferenceTest.java
index 68e7e2c..a15e87a 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/shortcut/ShortcutPreferenceTest.java
@@ -25,7 +25,7 @@ public class ShortcutPreferenceTest {
      * Unit test of {@link ShortcutPreference#ShortcutPreference}.
      */
     @Test
-    public void testShortcutPreference()  {
+    public void testShortcutPreference() {
         assertNotNull(new ShortcutPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreferenceTest.java
index 121ec3e..00ea83c 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorPreferenceTest.java
@@ -25,7 +25,7 @@ public class ValidatorPreferenceTest {
      * Unit test of {@link ValidatorPreference#ValidatorPreference}.
      */
     @Test
-    public void testValidatorPreference()  {
+    public void testValidatorPreference() {
         assertNotNull(new ValidatorPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreferenceTest.java
index 6c490be..882213d 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTestsPreferenceTest.java
@@ -25,7 +25,7 @@ public class ValidatorTestsPreferenceTest {
      * Unit test of {@link ValidatorTestsPreference#ValidatorTestsPreference}.
      */
     @Test
-    public void testValidatorTestsPreference()  {
+    public void testValidatorTestsPreference() {
         assertNotNull(new ValidatorTestsPreference.Factory().createPreferenceSetting());
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java b/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java
index 9831ffc..2162b62 100644
--- a/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java
@@ -57,7 +57,7 @@ public class TaggingPresetReaderTest {
     public void testNestedChunks() throws SAXException, IOException {
         final Collection<TaggingPreset> presets = TaggingPresetReader.readAll(TestUtils.getTestDataRoot() + "preset_chunk.xml", true);
         assertThat(presets, hasSize(1));
-        final TaggingPreset abc =  presets.iterator().next();
+        final TaggingPreset abc = presets.iterator().next();
         final List<String> keys = Utils.transform(abc.data, new Utils.Function<TaggingPresetItem, String>() {
             @Override
             public String apply(TaggingPresetItem x) {
diff --git a/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java b/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
index ed3f060..b3172ef 100644
--- a/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/NmeaReaderTest.java
@@ -7,19 +7,29 @@ import java.io.FileInputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.TimeZone;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.io.NmeaReader.NMEA_TYPE;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Unit tests of {@link NmeaReader} class.
  */
 public class NmeaReaderTest {
+    /**
+     * Set the timezone and timeout.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
 
     /**
      * Unit test of methods {@link NMEA_TYPE#equals} and {@link NMEA_TYPE#hashCode}.
@@ -35,19 +45,20 @@ public class NmeaReaderTest {
      */
     @Test
     public void testReader() throws Exception {
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         final NmeaReader in = new NmeaReader(new FileInputStream("data_nodist/btnmeatrack_2016-01-25.nmea"));
         assertEquals(30, in.getNumberOfCoordinates());
         assertEquals(0, in.getParserMalformed());
 
         final List<WayPoint> wayPoints = new ArrayList<>(in.data.tracks.iterator().next().getSegments().iterator().next().getWayPoints());
-        assertEquals("2016-01-25T04:05:09.200Z", wayPoints.get(0).get(GpxConstants.PT_TIME));
-        assertEquals("2016-01-25T04:05:09.400Z", wayPoints.get(1).get(GpxConstants.PT_TIME));
-        assertEquals("2016-01-25T04:05:09.600Z", wayPoints.get(2).get(GpxConstants.PT_TIME));
+        assertEquals("2016-01-25T05:05:09.200Z", wayPoints.get(0).get(GpxConstants.PT_TIME));
+        assertEquals("2016-01-25T05:05:09.400Z", wayPoints.get(1).get(GpxConstants.PT_TIME));
+        assertEquals("2016-01-25T05:05:09.600Z", wayPoints.get(2).get(GpxConstants.PT_TIME));
 
         final SimpleDateFormat iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
-        assertEquals("2016-01-25T05:05:09.200+01", iso8601.format(wayPoints.get(0).getTime()));
-        assertEquals("2016-01-25T05:05:09.400+01", iso8601.format(wayPoints.get(1).getTime()));
-        assertEquals("2016-01-25T05:05:09.600+01", iso8601.format(wayPoints.get(2).getTime()));
+        assertEquals("2016-01-25T06:05:09.200+01", iso8601.format(wayPoints.get(0).getTime()));
+        assertEquals("2016-01-25T06:05:09.400+01", iso8601.format(wayPoints.get(1).getTime()));
+        assertEquals("2016-01-25T06:05:09.600+01", iso8601.format(wayPoints.get(2).getTime()));
 
         assertEquals(new LatLon(46.98807, -1.400525), wayPoints.get(0).getCoor());
         assertEquals("38.9", wayPoints.get(0).get(GpxConstants.PT_ELE));
diff --git a/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java b/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java
index 012f095..90f0905 100644
--- a/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java
+++ b/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java
@@ -6,10 +6,11 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 
+import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 /**
  * Unit tests of {@link NoteImporter} class.
@@ -17,16 +18,17 @@ import org.openstreetmap.josm.gui.layer.Layer;
 public class NoteImporterTest {
 
     /**
+     * Use the test rules to remove any layers and reset state.
+     */
+    @Rule
+    public final JOSMTestRules rules = new JOSMTestRules();
+
+    /**
      * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12531">Bug #12531</a>.
      */
     @Test
     public void testTicket12531() {
-        if (Main.map != null) {
-            for (Layer l: Main.map.mapView.getAllLayers()) {
-                Main.map.mapView.removeLayer(l);
-            }
-            Main.main.setMapFrame(null);
-        }
+        Main.getLayerManager().resetState();
         assertNull(Main.map);
         assertTrue(new NoteImporter().importDataHandleExceptions(
                 new File(TestUtils.getRegressionDataFile(12531, "notes.osn")), null));
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
index 8375559..a84ab86 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
@@ -45,17 +45,24 @@ public class RemoteControlTest {
     public void setUp() {
         JOSMFixture.createUnitTestFixture().init();
         RemoteControl.PROP_REMOTECONTROL_HTTPS_ENABLED.put(true);
+        deleteKeystore();
+
+        RemoteControl.start();
+        disableCertificateValidation();
+        httpBase = "http://127.0.0.1:"+Main.pref.getInteger("remote.control.port", 8111);
+        httpsBase = "https://127.0.0.1:"+Main.pref.getInteger("remote.control.https.port", 8112);
+    }
+
+    /**
+     * Deletes JOSM keystore, if it exists.
+     */
+    public static void deleteKeystore() {
         try {
             Files.deleteIfExists(Paths.get(
                     RemoteControl.getRemoteControlDir()).resolve(RemoteControlHttpsServer.KEYSTORE_FILENAME));
         } catch (IOException e) {
             Main.error(e);
         }
-
-        RemoteControl.start();
-        disableCertificateValidation();
-        httpBase = "http://127.0.0.1:"+Main.pref.getInteger("remote.control.port", 8111);
-        httpsBase = "https://127.0.0.1:"+Main.pref.getInteger("remote.control.https.port", 8112);
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandlerTest.java
index c25d70a..89d9393 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddNodeHandlerTest.java
@@ -58,10 +58,10 @@ public class AddNodeHandlerTest {
         thrown.expectMessage("NumberFormatException (empty String)");
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             newHandler(null).handle();
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -95,10 +95,10 @@ public class AddNodeHandlerTest {
     public void testNominalRequest() throws Exception {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             newHandler("https://localhost?lat=0&lon=0").handle();
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
index fcc4ea6..e975cc5 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
@@ -58,10 +58,10 @@ public class AddWayHandlerTest {
         thrown.expectMessage("Invalid coordinates: []");
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             newHandler(null).handle();
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 
@@ -95,10 +95,10 @@ public class AddWayHandlerTest {
     public void testNominalRequest() throws Exception {
         OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
         try {
-            Main.main.addLayer(layer);
+            Main.getLayerManager().addLayer(layer);
             newHandler("https://localhost?way=0,0;1,1").handle();
         } finally {
-            Main.main.removeLayer(layer);
+            Main.getLayerManager().removeLayer(layer);
         }
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandlerTest.java
index 0345ca0..1bd392e 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandlerTest.java
@@ -94,8 +94,8 @@ public class ImportHandlerTest {
         try {
             newHandler("https://localhost?url=" + Utils.encodeUrl(url)).handle();
         } finally {
-            for (OsmDataLayer layer : Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
-                Main.main.removeLayer(layer);
+            for (OsmDataLayer layer : Main.getLayerManager().getLayersOfType(OsmDataLayer.class)) {
+                Main.getLayerManager().removeLayer(layer);
             }
         }
     }
diff --git a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
index ff23165..d2216ef 100644
--- a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
@@ -138,8 +138,8 @@ public class SessionReaderTest {
     @Test
     public void testReadNotes() throws IOException, IllegalDataException {
         if (Main.isDisplayingMapView()) {
-            for (NoteLayer nl : Main.map.mapView.getLayersOfType(NoteLayer.class)) {
-                Main.map.mapView.removeLayer(nl);
+            for (NoteLayer nl : Main.getLayerManager().getLayersOfType(NoteLayer.class)) {
+                Main.getLayerManager().removeLayer(nl);
             }
         }
         final List<Layer> layers = testRead("notes.joz");
diff --git a/test/unit/org/openstreetmap/josm/testutils/ExpectedRootException.java b/test/unit/org/openstreetmap/josm/testutils/ExpectedRootException.java
new file mode 100644
index 0000000..880193e
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/ExpectedRootException.java
@@ -0,0 +1,117 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils;
+
+import static org.openstreetmap.josm.testutils.ThrowableRootCauseMatcher.hasRootCause;
+
+import org.hamcrest.Matcher;
+import org.junit.rules.ExpectedException;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * The {@code ExpectedRootException} behaves exactly as JUnit's {@link ExpectedException} rule.
+ * This class is needed to add {@link #expectRootCause} method, which has been rejected by JUnit developers,
+ * and {@code ExpectedException} cannot be extended because it has a private constructor.
+ * @see <a href="https://github.com/junit-team/junit4/pull/778">Github pull request</a>
+ */
+public final class ExpectedRootException implements TestRule {
+
+    private final ExpectedException rule = ExpectedException.none();
+
+    /**
+     * Returns a {@linkplain TestRule rule} that expects no exception to be thrown (identical to behavior without this rule).
+     * @return {@code ExpectedRootException} instance
+     */
+    @SuppressFBWarnings("NM_CLASS_NOT_EXCEPTION")
+    public static ExpectedRootException none() {
+        return new ExpectedRootException();
+    }
+
+    private ExpectedRootException() {
+    }
+
+    /**
+     * Specifies the failure message for tests that are expected to throw an exception but do not throw any.
+     * You can use a {@code %s} placeholder for the description of the expected exception.
+     * E.g. "Test doesn't throw %s." will fail with the error message "Test doesn't throw an instance of foo.".
+     *
+     * @param message exception detail message
+     * @return the rule itself
+     */
+    public ExpectedRootException reportMissingExceptionWithMessage(String message) {
+        rule.reportMissingExceptionWithMessage(message);
+        return this;
+    }
+
+    @Override
+    public Statement apply(Statement base, Description description) {
+        return rule.apply(base, description);
+    }
+
+    /**
+     * Verify that your code throws an exception that is an instance of specific {@code type}.
+     * <pre> @Test
+     * public void throwsExceptionWithSpecificType() {
+     *     thrown.expect(NullPointerException.class);
+     *     throw new NullPointerException();
+     * }</pre>
+     * @param type Throwable type
+     * @return {@code this}
+     */
+    public ExpectedRootException expect(Class<? extends Throwable> type) {
+        rule.expect(type);
+        return this;
+    }
+
+    /**
+     * Verify that your code throws an exception whose message contains a specific text.
+     * <pre> @Test
+     * public void throwsExceptionWhoseMessageContainsSpecificText() {
+     *     thrown.expectMessage("happened");
+     *     throw new NullPointerException("What happened?");
+     * }</pre>
+     * @param substring substring to expect in error message
+     * @return {@code this}
+     */
+    public ExpectedRootException expectMessage(String substring) {
+        rule.expectMessage(substring);
+        return this;
+    }
+
+    /**
+     * Verify that your code throws an exception whose immediate cause is matched by the given Hamcrest matcher.
+     * <pre> @Test
+     * public void throwsExceptionWhoseCauseCompliesWithMatcher() {
+     *     NullPointerException rootCause = new NullPointerException();
+     *     IllegalStateException immediateCause = new IllegalStateException(rootCause);
+     *     thrown.expectCause(isA(NullPointerException.class));
+     *     throw new IllegalArgumentException(immediateCause);
+     * }</pre>
+     * @param expectedCause expected cause
+     * @return {@code this}
+     */
+    public ExpectedRootException expectCause(Matcher<? extends Throwable> expectedCause) {
+        rule.expectCause(expectedCause);
+        return this;
+    }
+
+    /**
+     * Verify that you code throws an exception whose root cause is matched by the given Hamcrest matcher.
+     * <pre> @Test
+     * public void throwsExceptionWhoseRootCauseCompliesWithMatcher() {
+     *     NullPointerException rootCause = new NullPointerException();
+     *     IllegalStateException immediateCause = new IllegalStateException(rootCause);
+     *     thrown.expectRootCause(isA(NullPointerException.class));
+     *     throw new IllegalArgumentException(immediateCause);
+     * }</pre>
+     * @param expectedRootCause expected root cause
+     * @return {@code this}
+     */
+    public ExpectedRootException expectRootCause(Matcher<? extends Throwable> expectedRootCause) {
+        rule.expect(hasRootCause(expectedRootCause));
+        return this;
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/FakeGraphics.java b/test/unit/org/openstreetmap/josm/testutils/FakeGraphics.java
new file mode 100644
index 0000000..b3edf43
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/FakeGraphics.java
@@ -0,0 +1,340 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils;
+
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.Image;
+import java.awt.Paint;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.RenderingHints.Key;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ImageObserver;
+import java.awt.image.RenderedImage;
+import java.awt.image.renderable.RenderableImage;
+import java.text.AttributedCharacterIterator;
+import java.util.Map;
+
+/**
+ * A fake Graphics to be used in headless mode.
+ */
+public final class FakeGraphics extends Graphics2D {
+    @Override
+    public void setXORMode(Color c1) {
+    }
+
+    @Override
+    public void setPaintMode() {
+    }
+
+    @Override
+    public void setFont(Font font) {
+    }
+
+    @Override
+    public void setColor(Color c) {
+    }
+
+    @Override
+    public void setClip(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void setClip(Shape clip) {
+    }
+
+    @Override
+    public FontMetrics getFontMetrics(Font f) {
+        return new Canvas().getFontMetrics(getFont());
+    }
+
+    @Override
+    public Font getFont() {
+        return new Font(null, 0, 0);
+    }
+
+    @Override
+    public Color getColor() {
+        return null;
+    }
+
+    @Override
+    public Rectangle getClipBounds() {
+        return null;
+    }
+
+    @Override
+    public Shape getClip() {
+        return null;
+    }
+
+    @Override
+    public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
+    }
+
+    @Override
+    public void fillRect(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+    }
+
+    @Override
+    public void fillOval(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
+    }
+
+    @Override
+    public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
+    }
+
+    @Override
+    public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
+    }
+
+    @Override
+    public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+    }
+
+    @Override
+    public void drawOval(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void drawLine(int x1, int y1, int x2, int y2) {
+    }
+
+    // CHECKSTYLE.OFF: ParameterNumber
+    @Override
+    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
+            Color bgcolor, ImageObserver observer) {
+        return false;
+    }
+    // CHECKSTYLE.ON: ParameterNumber
+
+    @Override
+    public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2,
+            ImageObserver observer) {
+        return false;
+    }
+
+    @Override
+    public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) {
+        return false;
+    }
+
+    @Override
+    public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
+        return false;
+    }
+
+    @Override
+    public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
+        return false;
+    }
+
+    @Override
+    public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
+        return false;
+    }
+
+    @Override
+    public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
+    }
+
+    @Override
+    public void dispose() {
+    }
+
+    @Override
+    public Graphics create() {
+        return this;
+    }
+
+    @Override
+    public void copyArea(int x, int y, int width, int height, int dx, int dy) {
+    }
+
+    @Override
+    public void clipRect(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void clearRect(int x, int y, int width, int height) {
+    }
+
+    @Override
+    public void translate(double tx, double ty) {
+    }
+
+    @Override
+    public void translate(int x, int y) {
+    }
+
+    @Override
+    public void transform(AffineTransform Tx) {
+    }
+
+    @Override
+    public void shear(double shx, double shy) {
+    }
+
+    @Override
+    public void setTransform(AffineTransform Tx) {
+    }
+
+    @Override
+    public void setStroke(Stroke s) {
+    }
+
+    @Override
+    public void setRenderingHints(Map<?, ?> hints) {
+    }
+
+    @Override
+    public void setRenderingHint(Key hintKey, Object hintValue) {
+    }
+
+    @Override
+    public void setPaint(Paint paint) {
+    }
+
+    @Override
+    public void setComposite(Composite comp) {
+    }
+
+    @Override
+    public void setBackground(Color color) {
+    }
+
+    @Override
+    public void scale(double sx, double sy) {
+    }
+
+    @Override
+    public void rotate(double theta, double x, double y) {
+    }
+
+    @Override
+    public void rotate(double theta) {
+    }
+
+    @Override
+    public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
+        return false;
+    }
+
+    @Override
+    public AffineTransform getTransform() {
+        return null;
+    }
+
+    @Override
+    public Stroke getStroke() {
+        return null;
+    }
+
+    @Override
+    public RenderingHints getRenderingHints() {
+        return null;
+    }
+
+    @Override
+    public Object getRenderingHint(Key hintKey) {
+        return null;
+    }
+
+    @Override
+    public Paint getPaint() {
+        return null;
+    }
+
+    @Override
+    public FontRenderContext getFontRenderContext() {
+        return new FontRenderContext(null, false, false);
+    }
+
+    @Override
+    public GraphicsConfiguration getDeviceConfiguration() {
+        return null;
+    }
+
+    @Override
+    public Composite getComposite() {
+        return null;
+    }
+
+    @Override
+    public Color getBackground() {
+        return null;
+    }
+
+    @Override
+    public void fill(Shape s) {
+    }
+
+    @Override
+    public void drawString(AttributedCharacterIterator iterator, float x, float y) {
+    }
+
+    @Override
+    public void drawString(AttributedCharacterIterator iterator, int x, int y) {
+    }
+
+    @Override
+    public void drawString(String str, float x, float y) {
+    }
+
+    @Override
+    public void drawString(String str, int x, int y) {
+    }
+
+    @Override
+    public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
+    }
+
+    @Override
+    public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
+    }
+
+    @Override
+    public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
+    }
+
+    @Override
+    public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
+        return false;
+    }
+
+    @Override
+    public void drawGlyphVector(GlyphVector g, float x, float y) {
+    }
+
+    @Override
+    public void draw(Shape s) {
+    }
+
+    @Override
+    public void clip(Shape s) {
+    }
+
+    @Override
+    public void addRenderingHints(Map<?, ?> hints) {
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/FakeOsmApi.java b/test/unit/org/openstreetmap/josm/testutils/FakeOsmApi.java
new file mode 100644
index 0000000..4c057f2
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/FakeOsmApi.java
@@ -0,0 +1,121 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils;
+
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.notes.Note;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.Capabilities;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmApiInitializationException;
+import org.openstreetmap.josm.io.OsmTransferCanceledException;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+/**
+ * A fake OSM API server. It is used to test again.
+ * <p>
+ * It provides only basic features.
+ * <p>
+ * These image servers are blacklisted:
+ * <ul>
+ * <li>.*blacklisted.*</li>
+ * <li>^(invalid|bad).*</li>
+ * </ul>
+ *
+ * @author Michael Zangl
+ */
+public class FakeOsmApi extends OsmApi {
+
+    private static FakeOsmApi instance;
+
+    private boolean initialized = false;
+
+    protected FakeOsmApi() {
+        super("http://fake.xxx/api");
+    }
+
+    @Override
+    public void initialize(ProgressMonitor monitor, boolean fastFail)
+            throws OsmTransferCanceledException, OsmApiInitializationException {
+        // we do not connect to any server so we do not need that.
+        initialized = true;
+    }
+
+    @Override
+    public synchronized Capabilities getCapabilities() {
+        if (!initialized) {
+            return null;
+        } else {
+            Capabilities capabilities = new Capabilities();
+            capabilities.put("blacklist", "regex", ".*blacklisted.*");
+            capabilities.put("blacklist", "regex", "^https?://(invalid|bad).*");
+            capabilities.put("version", "minimum", "0.6");
+            capabilities.put("version", "maximum", "0.6");
+            return capabilities;
+        }
+    }
+
+    @Override
+    public void createPrimitive(IPrimitive osm, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void modifyPrimitive(IPrimitive osm, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void deletePrimitive(OsmPrimitive osm, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void openChangeset(Changeset changeset, ProgressMonitor progressMonitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void updateChangeset(Changeset changeset, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public void closeChangeset(Changeset changeset, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Note createNote(LatLon latlon, String text, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Note addCommentToNote(Note note, String comment, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Note closeNote(Note note, String closeMessage, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    @Override
+    public Note reopenNote(Note note, String reactivateMessage, ProgressMonitor monitor) throws OsmTransferException {
+        throw new UnsupportedOperationException("Not implemented");
+    }
+
+    /**
+     * Gets and caches an instance of this API.
+     * @return The API intance. Always the same object.
+     */
+    public static synchronized FakeOsmApi getInstance() {
+        if (instance == null) {
+            instance = new FakeOsmApi();
+            cacheInstance(instance);
+        }
+        return instance;
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
new file mode 100644
index 0000000..9fba4cd
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
@@ -0,0 +1,258 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.TimeZone;
+
+import org.junit.rules.DisableOnDebug;
+import org.junit.rules.TemporaryFolder;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
+import org.junit.runner.Description;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmApiInitializationException;
+import org.openstreetmap.josm.io.OsmTransferCanceledException;
+import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.date.DateUtils;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * This class runs a test in an environment that resembles the one used by the JOSM main application.
+ * <p>
+ * The environment is reset before every test. You can specify the components to which you need access using the methods of this class.
+ * For example, invoking {@link #preferences()} gives you access to the (default) preferences.
+ *
+ * @author Michael Zangl
+ */
+public class JOSMTestRules implements TestRule {
+    private Timeout timeout = Timeout.seconds(10);
+    private TemporaryFolder josmHome;
+    private boolean usePreferences = false;
+    private APIType useAPI = APIType.NONE;
+    private String i18n = null;
+    private boolean platform;
+    private boolean useProjection;
+
+    /**
+     * Disable the default timeout for this test. Use with care.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules noTimeout() {
+        timeout = null;
+        return this;
+    }
+
+    /**
+     * Set a timeout for all tests in this class. Local method timeouts may only reduce this timeout.
+     * @param millis The timeout duration in milliseconds.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules timeout(int millis) {
+        timeout = Timeout.millis(millis);
+        return this;
+    }
+
+    /**
+     * Enable the use of default preferences.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules preferences() {
+        josmHome();
+        usePreferences = true;
+        return this;
+    }
+
+    /**
+     * Set JOSM home to a valid, empty directory.
+     * @return this instance, for easy chaining
+     */
+    private JOSMTestRules josmHome() {
+        josmHome = new TemporaryFolder();
+        return this;
+    }
+
+    /**
+     * Enables the i18n module for this test in english.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules i18n() {
+        return i18n("en");
+    }
+
+    /**
+     * Enables the i18n module for this test.
+     * @param language The language to use.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules i18n(String language) {
+        i18n = language;
+        return this;
+    }
+
+    /**
+     * Enable {@link Main#platform} global variable.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules platform() {
+        platform = true;
+        return this;
+    }
+
+    /**
+     * Enable the dev.openstreetmap.org API for this test.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules devAPI() {
+        preferences();
+        useAPI = APIType.DEV;
+        return this;
+    }
+
+    /**
+     * Use the {@link FakeOsmApi} for testing.
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules fakeAPI() {
+        useAPI = APIType.FAKE;
+        return this;
+    }
+
+    /**
+     * Set up default projection (Mercator)
+     * @return this instance, for easy chaining
+     */
+    public JOSMTestRules projection() {
+        useProjection = true;
+        return this;
+    }
+
+    @Override
+    public Statement apply(final Statement base, Description description) {
+        Statement statement = new Statement() {
+            @Override
+            public void evaluate() throws Throwable {
+                before();
+                try {
+                    base.evaluate();
+                } finally {
+                    after();
+                }
+            }
+        };
+        if (timeout != null) {
+            statement = new DisableOnDebug(timeout).apply(statement, description);
+        }
+        if (josmHome != null) {
+            statement = josmHome.apply(statement, description);
+        }
+        return statement;
+    }
+
+    /**
+     * Set up before running a test
+     * @throws InitializationError If an error occured while creating the required environment.
+     */
+    protected void before() throws InitializationError {
+        cleanUpFromJosmFixture();
+
+        // Tests are running headless by default.
+        System.setProperty("java.awt.headless", "true");
+        // All tests use the same timezone.
+        TimeZone.setDefault(DateUtils.UTC);
+        // Set log level to info
+        Main.logLevel = 3;
+
+        // Set up i18n
+        if (i18n != null) {
+            I18n.set(i18n);
+        }
+
+        // Add JOSM home
+        if (josmHome != null) {
+            try {
+                File home = josmHome.newFolder();
+                System.setProperty("josm.home", home.getAbsolutePath());
+            } catch (IOException e) {
+                throw new InitializationError(e);
+            }
+        }
+
+        // Add preferences
+        if (usePreferences) {
+            Main.initApplicationPreferences();
+            Main.pref.enableSaveOnPut(false);
+            // No pref init -> that would only create the preferences file.
+            // We force the use of a wrong API server, just in case anyone attempts an upload
+            Main.pref.put("osm-server.url", "http://invalid");
+        }
+
+        if (useProjection) {
+            Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+        }
+
+        // Set API
+        if (useAPI == APIType.DEV) {
+            Main.pref.put("osm-server.url", "http://api06.dev.openstreetmap.org/api");
+        } else if (useAPI == APIType.FAKE) {
+            FakeOsmApi api = FakeOsmApi.getInstance();
+            Main.pref.put("osm-server.url", api.getServerUrl());
+        }
+
+        // Initialize API
+        if (useAPI != APIType.NONE) {
+            try {
+                OsmApi.getOsmApi().initialize(null);
+            } catch (OsmTransferCanceledException | OsmApiInitializationException e) {
+                throw new InitializationError(e);
+            }
+        }
+
+        // Set Platform
+        if (platform) {
+            Main.determinePlatformHook();
+        }
+    }
+
+    /**
+     * Clean up what test not using these test rules may have broken.
+     */
+    @SuppressFBWarnings("DM_GC")
+    private void cleanUpFromJosmFixture() {
+        Main.getLayerManager().resetState();
+        Main.pref = null;
+        Main.platform = null;
+        System.gc();
+    }
+
+    /**
+     * Clean up after running a test
+     */
+    @SuppressFBWarnings("DM_GC")
+    protected void after() {
+        // Sync AWT Thread
+        GuiHelper.runInEDTAndWait(new Runnable() {
+            @Override
+            public void run() {
+            }
+        });
+        // Remove all layers
+        Main.getLayerManager().resetState();
+
+        // TODO: Remove global listeners and other global state.
+        Main.pref = null;
+        Main.platform = null;
+        // Parts of JOSM uses weak references - destroy them.
+        System.gc();
+    }
+
+    enum APIType {
+        NONE, FAKE, DEV
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/ThrowableRootCauseMatcher.java b/test/unit/org/openstreetmap/josm/testutils/ThrowableRootCauseMatcher.java
new file mode 100644
index 0000000..8962194
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/ThrowableRootCauseMatcher.java
@@ -0,0 +1,60 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils;
+
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+/**
+ * Matches the root cause of a {@code Throwable}.
+ * This has been rejected from JUnit developers (see https://github.com/junit-team/junit4/pull/778),
+ * But this is really useful, thanks to pimterry for implementing it.
+ *
+ * @param <T> Throwable type
+ * @see <a href="https://github.com/junit-team/junit4/pull/778">Github pull request</a>
+ */
+public class ThrowableRootCauseMatcher<T extends Throwable> extends TypeSafeMatcher<T> {
+
+    private final Matcher<T> fMatcher;
+
+    /**
+     * Constructs a new {@code ThrowableRootCauseMatcher}.
+     * @param matcher matcher
+     */
+    public ThrowableRootCauseMatcher(Matcher<T> matcher) {
+        fMatcher = matcher;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+        description.appendText("exception with cause ");
+        description.appendDescriptionOf(fMatcher);
+    }
+
+    @Override
+    protected boolean matchesSafely(T item) {
+        Throwable exception = item;
+        while (exception.getCause() != null) {
+            exception = exception.getCause();
+        }
+        return fMatcher.matches(exception);
+    }
+
+    @Override
+    protected void describeMismatchSafely(T item, Description description) {
+        description.appendText("cause ");
+        fMatcher.describeMismatch(item.getCause(), description);
+    }
+
+    /**
+     * Returns a new {@code ThrowableRootCauseMatcher} instance.
+     * @param <T> Throwable type
+     * @param matcher matcher
+     * @return new {@code ThrowableRootCauseMatcher} instance
+     */
+    @Factory
+    public static <T extends Throwable> Matcher<T> hasRootCause(final Matcher<T> matcher) {
+        return new ThrowableRootCauseMatcher<>(matcher);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/ExceptionUtilTest.java b/test/unit/org/openstreetmap/josm/tools/ExceptionUtilTest.java
index f75af6a..15c382c 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExceptionUtilTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExceptionUtilTest.java
@@ -8,6 +8,7 @@ import java.net.HttpURLConnection;
 import java.net.SocketException;
 import java.net.URL;
 import java.net.UnknownHostException;
+import java.util.TimeZone;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -21,6 +22,7 @@ import org.openstreetmap.josm.io.OsmApiException;
 import org.openstreetmap.josm.io.OsmApiInitializationException;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
 import org.openstreetmap.josm.tools.date.DateUtils;
+import org.openstreetmap.josm.tools.date.DateUtilsTest;
 
 /**
  * Unit tests of {@link ExceptionUtil} class.
@@ -123,6 +125,10 @@ public class ExceptionUtilTest {
                 ExceptionUtil.explainConflict(new OsmApiException(code, "header", "")));
         assertEquals("<html>Closing of changeset <strong>1</strong> failed <br>because it has already been closed.",
                 ExceptionUtil.explainConflict(new OsmApiException(code, "The changeset 1 was closed at xxx", "")));
+        assertEquals("<html>Closing of changeset <strong>1</strong> failed<br> because it has already been closed on 2016-01-01 12:34:56.",
+                ExceptionUtil.explainConflict(new OsmApiException(code, "The changeset 1 was closed at 2016-01-01 12:34:56 UTC", "")));
+        DateUtilsTest.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         assertEquals("<html>Closing of changeset <strong>1</strong> failed<br> because it has already been closed on 2016-01-01 13:34:56.",
                 ExceptionUtil.explainConflict(new OsmApiException(code, "The changeset 1 was closed at 2016-01-01 12:34:56 UTC", "")));
     }
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index ae18936..658ba4f 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -15,16 +15,26 @@ import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.tools.date.DateUtilsTest;
+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
  */
 public class ExifReaderTest {
+    /**
+     * Set the timezone and timeout.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().timeout(60000);
 
     private File orientationSampleFile, directionSampleFile;
 
@@ -35,7 +45,6 @@ public class ExifReaderTest {
     public void setUp() {
         directionSampleFile = new File("data_nodist/exif-example_direction.jpg");
         orientationSampleFile = new File("data_nodist/exif-example_orientation=6.jpg");
-        DateUtilsTest.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
     }
 
     /**
@@ -46,6 +55,11 @@ public class ExifReaderTest {
     public void testReadTime() throws ParseException {
         Date date = ExifReader.readTime(directionSampleFile);
         assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 17, 12, 05).getTime(), date);
+
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
+        date = ExifReader.readTime(directionSampleFile);
+        TimeZone.setDefault(DateUtils.UTC);
+        assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 15, 12, 05).getTime(), date);
     }
 
     /**
@@ -57,6 +71,12 @@ public class ExifReaderTest {
         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);
+
+        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);
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java b/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
index 5d626f3..fd69730 100644
--- a/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java
@@ -59,4 +59,15 @@ public class ImageProviderTest {
         // https://commons.wikimedia.org/wiki/File:OpenJDK_logo.svg
         assertNotNull(ImageProvider.get("wiki://OpenJDK_logo.svg"));
     }
+
+    /**
+     * Test fetching an image using {@code data:} URL.
+     */
+    @Test
+    public void testDataUrl() {
+        // Red dot image, taken from https://en.wikipedia.org/wiki/Data_URI_scheme#HTML
+        assertNotNull(ImageProvider.get("data:image/png;base64," +
+                "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4"+
+                "//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="));
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java b/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java
new file mode 100644
index 0000000..2747ba8
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/PlatformHookOsxTest.java
@@ -0,0 +1,145 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+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.io.File;
+import java.io.IOException;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+
+/**
+ * Unit tests of {@link PlatformHookOsx} class.
+ */
+public class PlatformHookOsxTest {
+
+    static PlatformHookOsx hook;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+        hook = new PlatformHookOsx();
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#startupHook}
+     */
+    @Test
+    public void testStartupHook() {
+        hook.startupHook();
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#setupHttpsCertificate}
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testSetupHttpsCertificate() throws Exception {
+        assertFalse(hook.setupHttpsCertificate(null, null));
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#afterPrefStartupHook}
+     */
+    @Test
+    public void testAfterPrefStartupHook() {
+        hook.afterPrefStartupHook();
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#openUrl}
+     * @throws IOException if an error occurs
+     */
+    @Test
+    public void testOpenUrl() throws IOException {
+        if (!Main.isPlatformWindows()) {
+            hook.openUrl(Main.getJOSMWebsite());
+        } else {
+            try {
+                hook.openUrl(Main.getJOSMWebsite());
+                fail("Expected IOException");
+            } catch (IOException e) {
+                Main.info(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getAdditionalFonts}
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testGetAdditionalFonts() {
+        hook.getAdditionalFonts();
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getDefaultCacheDirectory}
+     */
+    @Test
+    public void testGetDefaultCacheDirectory() {
+        File cache = hook.getDefaultCacheDirectory();
+        assertNotNull(cache);
+        if (Main.isPlatformOsx()) {
+            assertTrue(cache.toString().contains("/Library/"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getDefaultPrefDirectory}
+     */
+    @Test
+    public void testGetDefaultPrefDirectory() {
+        File cache = hook.getDefaultPrefDirectory();
+        assertNotNull(cache);
+        if (Main.isPlatformOsx()) {
+            assertTrue(cache.toString().contains("/Library/"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getDefaultStyle}
+     */
+    @Test
+    public void testGetDefaultStyle() {
+        assertEquals("com.apple.laf.AquaLookAndFeel", hook.getDefaultStyle());
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getInstalledFonts}
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testGetInstalledFonts() {
+        hook.getInstalledFonts();
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#getOSDescription}
+     */
+    @Test
+    public void testGetOSDescription() {
+        String os = hook.getOSDescription();
+        if (Main.isPlatformOsx()) {
+            assertTrue(os.contains("Mac"));
+        } else {
+            assertFalse(os.contains("Mac"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookOsx#initSystemShortcuts}
+     */
+    @Test
+    public void testInitSystemShortcuts() {
+        hook.initSystemShortcuts();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java b/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java
new file mode 100644
index 0000000..6813e96
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/PlatformHookWindowsTest.java
@@ -0,0 +1,205 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+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 static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStore.TrustedCertificateEntry;
+import java.security.KeyStoreException;
+import java.util.Collection;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.io.remotecontrol.RemoteControlHttpsServer;
+import org.openstreetmap.josm.io.remotecontrol.RemoteControlTest;
+
+/**
+ * Unit tests of {@link PlatformHookWindows} class.
+ */
+public class PlatformHookWindowsTest {
+
+    static PlatformHookWindows hook;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+        hook = new PlatformHookWindows();
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#startupHook}
+     */
+    @Test
+    public void testStartupHook() {
+        hook.startupHook();
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getRootKeystore}
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testGetRootKeystore() throws Exception {
+        if (Main.isPlatformWindows()) {
+            assertNotNull(PlatformHookWindows.getRootKeystore());
+        } else {
+            try {
+                PlatformHookWindows.getRootKeystore();
+                fail("Expected KeyStoreException");
+            } catch (KeyStoreException e) {
+                Main.info(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#removeInsecureCertificates}
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testRemoveInsecureCertificates() throws Exception {
+        if (Main.isPlatformWindows()) {
+            PlatformHookWindows.removeInsecureCertificates();
+        } else {
+            try {
+                PlatformHookWindows.removeInsecureCertificates();
+                fail("Expected KeyStoreException");
+            } catch (KeyStoreException e) {
+                Main.info(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#setupHttpsCertificate}
+     * @throws Exception if an error occurs
+     */
+    @Test
+    public void testSetupHttpsCertificate() throws Exception {
+        RemoteControlTest.deleteKeystore();
+        KeyStore ks = RemoteControlHttpsServer.loadJosmKeystore();
+        TrustedCertificateEntry trustedCert = new KeyStore.TrustedCertificateEntry(ks.getCertificate(ks.aliases().nextElement()));
+        if (Main.isPlatformWindows()) {
+            hook.setupHttpsCertificate(RemoteControlHttpsServer.ENTRY_ALIAS, trustedCert);
+        } else {
+            try {
+                hook.setupHttpsCertificate(RemoteControlHttpsServer.ENTRY_ALIAS, trustedCert);
+                fail("Expected KeyStoreException");
+            } catch (KeyStoreException e) {
+                Main.info(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#afterPrefStartupHook}
+     */
+    @Test
+    public void testAfterPrefStartupHook() {
+        hook.afterPrefStartupHook();
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#openUrl}
+     * @throws IOException if an error occurs
+     */
+    @Test
+    public void testOpenUrl() throws IOException {
+        if (Main.isPlatformWindows()) {
+            hook.openUrl(Main.getJOSMWebsite());
+        } else {
+            try {
+                hook.openUrl(Main.getJOSMWebsite());
+                fail("Expected IOException");
+            } catch (IOException e) {
+                Main.info(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getAdditionalFonts}
+     */
+    @Test
+    public void testGetAdditionalFonts() {
+        assertFalse(hook.getAdditionalFonts().isEmpty());
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getDefaultCacheDirectory}
+     */
+    @Test
+    public void testGetDefaultCacheDirectory() {
+        File cache = hook.getDefaultCacheDirectory();
+        assertNotNull(cache);
+        if (Main.isPlatformWindows()) {
+            assertTrue(cache.toString().contains(":"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getDefaultPrefDirectory}
+     */
+    @Test
+    public void testGetDefaultPrefDirectory() {
+        File cache = hook.getDefaultPrefDirectory();
+        assertNotNull(cache);
+        if (Main.isPlatformWindows()) {
+            assertTrue(cache.toString().contains(":"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getDefaultStyle}
+     */
+    @Test
+    public void testGetDefaultStyle() {
+        assertEquals("com.sun.java.swing.plaf.windows.WindowsLookAndFeel", hook.getDefaultStyle());
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getInstalledFonts}
+     */
+    @Test
+    public void testGetInstalledFonts() {
+        Collection<String> fonts = hook.getInstalledFonts();
+        if (Main.isPlatformWindows()) {
+            assertFalse(fonts.isEmpty());
+        } else {
+            assertNull(fonts);
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#getOSDescription}
+     */
+    @Test
+    public void testGetOSDescription() {
+        String os = hook.getOSDescription();
+        if (Main.isPlatformWindows()) {
+            assertTrue(os.contains("Windows"));
+        } else {
+            assertFalse(os.contains("Windows"));
+        }
+    }
+
+    /**
+     * Test method for {@code PlatformHookWindows#initSystemShortcuts}
+     */
+    @Test
+    public void testInitSystemShortcuts() {
+        hook.initSystemShortcuts();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java b/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java
index bf47ff5..dded4b1 100644
--- a/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java
@@ -20,7 +20,6 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
  * This test tests the {@link Predicate}s created by the {@link Predicates} class.
  *
  * @author Michael Zangl
- * @since xxx
  */
 public class PredicatesTest {
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java b/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
index 35b0cc0..3eae839 100644
--- a/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
@@ -29,16 +29,20 @@ public class TextTagParserTest {
     @Test
     public void testUnescape() {
         String s, s1;
-        s = "\"2 3 4\"";       s1 = "2 3 4";
+        s = "\"2 3 4\"";
+        s1 = "2 3 4";
         Assert.assertEquals(s1, TextTagParser.unescape(s));
 
-        s = "\"2 \\\"3\\\" 4\"";       s1 = "2 \"3\" 4";
+        s = "\"2 \\\"3\\\" 4\"";
+        s1 = "2 \"3\" 4";
         Assert.assertEquals(s1, TextTagParser.unescape(s));
 
-        s = "\"2 3 ===4===\"";       s1 = "2 3 ===4===";
+        s = "\"2 3 ===4===\"";
+        s1 = "2 3 ===4===";
         Assert.assertEquals(s1, TextTagParser.unescape(s));
 
-        s = "\"2 3 \\\\\\\\===4===\"";       s1 = "2 3 \\\\===4===";
+        s = "\"2 3 \\\\\\\\===4===\"";
+        s1 = "2 3 \\\\===4===";
         Assert.assertEquals(s1, TextTagParser.unescape(s));
     }
 
diff --git a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
index 5efcd1f..cbe2b8b 100644
--- a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
@@ -12,17 +12,23 @@ import java.util.Locale;
 import org.junit.Assert;
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 /**
  * Unit tests of {@link Utils} class.
  */
 public class UtilsTest {
+    /**
+     * Use default, basic test rules.
+     */
+    public JOSMTestRules rules = new JOSMTestRules();
 
     /**
      * Test of {@link Utils#strip} method.
      */
     @Test
     public void testStrip() {
+        // CHECKSTYLE.OFF: SingleSpaceSeparator
         final String someWhite =
             "\u00A0"+ // SPACE_SEPARATOR
             "\u2007"+ // LINE_SEPARATOR
@@ -41,6 +47,7 @@ public class UtilsTest {
             "\u200B"+ // ZERO WIDTH SPACE
             "\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(" "));
diff --git a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
index 43f6fff..06803a7 100644
--- a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
@@ -9,9 +9,9 @@ import java.text.DateFormat;
 import java.util.Date;
 import java.util.TimeZone;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.UncheckedParseException;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -22,19 +22,18 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 public class DateUtilsTest {
 
     /**
-     * Setup test.
+     * Set the timezone and timeout.
      */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().i18n().preferences();
 
     /**
      * Allows to override the timezone used in {@link DateUtils} for unit tests.
      * @param zone the timezone to use
      */
     public static void setTimeZone(TimeZone zone) {
-        DateUtils.setTimeZone(zone);
+        TimeZone.setDefault(zone);
     }
 
     /**
@@ -116,8 +115,14 @@ public class DateUtilsTest {
      */
     @Test
     public void testFormatTime() {
-        assertEquals("1:00 AM", DateUtils.formatTime(new Date(123), DateFormat.SHORT));
-        assertEquals("1:00:00 AM CET", DateUtils.formatTime(new Date(123), DateFormat.LONG));
+        assertEquals("12:00 AM", DateUtils.formatTime(new Date(0), DateFormat.SHORT));
+        assertEquals("1:00 AM", DateUtils.formatTime(new Date(60 * 60 * 1000), DateFormat.SHORT));
+        assertEquals("12:00 AM", DateUtils.formatTime(new Date(999), DateFormat.SHORT));
+        // ignore seconds
+        assertEquals("12:00 AM", DateUtils.formatTime(new Date(5999), DateFormat.SHORT));
+
+        setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
+        assertEquals("1:00:00 AM CET", DateUtils.formatTime(new Date(0), DateFormat.LONG));
     }
 
     /**
@@ -150,6 +155,7 @@ public class DateUtilsTest {
         assertEquals(1459695600000L, DateUtils.tsFromString("2016-04-03T15:00:00.000-00:00"));
 
         // Local time
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
         assertEquals(1459688400000L, DateUtils.tsFromString("03-APR-16 15:00:00"));
     }
 
diff --git a/tools/checkstyle/josm_checks.xml b/tools/checkstyle/josm_checks.xml
index 5157427..e4fdf70 100644
--- a/tools/checkstyle/josm_checks.xml
+++ b/tools/checkstyle/josm_checks.xml
@@ -11,6 +11,7 @@ JOSM Checkstyle rules
 -->
 <module name="Checker">
   <property name="severity" value="warning"/>
+  <property name="charset" value="UTF-8"/>
   <module name="TreeWalker">
     <module name="FileContentsHolder"/>
     <module name="MissingDeprecated"/>
@@ -55,6 +56,7 @@ JOSM Checkstyle rules
     <module name="EmptyForIteratorPad"/>
     <module name="NoWhitespaceAfter"/>
     <module name="NoWhitespaceBefore"/>
+    <module name="SingleSpaceSeparator"/>
     <module name="MethodParamPad"/>
     <module name="ParenPad"/>
     <module name="TypecastParenPad">
@@ -113,5 +115,6 @@ JOSM Checkstyle rules
   </module>
   <module name="SuppressionFilter">
     <property name="file" value="${basedir}/tools/checkstyle/josm_filters.xml" default="tools/checkstyle/josm_filters.xml"/>
+    <property name="optional" value="true"/>
   </module>
 </module>

-- 
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