[josm] 01/05: Imported Upstream version 0.0.svn10301+dfsg

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Tue May 31 20:07:22 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 508c6f905b896211e9d42b4cfc031beab22a0dbe
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Mon May 30 23:33:57 2016 +0200

    Imported Upstream version 0.0.svn10301+dfsg
---
 .classpath                                         |   2 +-
 .settings/edu.umd.cs.findbugs.core.prefs           |  18 +-
 .settings/org.eclipse.jdt.core.prefs               |   2 +-
 .settings/org.sonarlint.eclipse.core.prefs         |   5 +
 REVISION                                           |  10 +-
 build.xml                                          |  10 +-
 data/defaultpresets.xml                            |   5 +
 data/validator/combinations.mapcss                 |   4 +-
 data/validator/deprecated.mapcss                   |  18 +-
 data/validator/geometry.mapcss                     |   9 +-
 data/validator/ignoretags.cfg                      |   2 +
 i18n/README.TXT                                    |   2 +-
 i18n/po/af.po                                      | 170 +++--
 i18n/po/am.po                                      | 170 +++--
 i18n/po/ar.po                                      | 172 +++--
 i18n/po/ast.po                                     | 178 +++--
 i18n/po/az.po                                      | 170 +++--
 i18n/po/be.po                                      | 190 ++++--
 i18n/po/bg.po                                      | 178 +++--
 i18n/po/bn.po                                      | 170 +++--
 i18n/po/br.po                                      | 170 +++--
 i18n/po/bs.po                                      | 170 +++--
 i18n/po/ca.po                                      | 182 +++--
 i18n/po/ca at valencia.po                             | 176 +++--
 i18n/po/cs.po                                      | 194 ++++--
 i18n/po/cy.po                                      | 170 +++--
 i18n/po/da.po                                      | 184 +++--
 i18n/po/de.po                                      | 202 +++---
 i18n/po/de_DE.po                                   | 170 +++--
 i18n/po/el.po                                      | 176 +++--
 i18n/po/en_AU.po                                   | 176 +++--
 i18n/po/en_CA.po                                   | 170 +++--
 i18n/po/en_GB.po                                   | 184 +++--
 i18n/po/eo.po                                      | 170 +++--
 i18n/po/es.po                                      | 369 +++++-----
 i18n/po/et.po                                      | 174 +++--
 i18n/po/eu.po                                      | 170 +++--
 i18n/po/fa.po                                      | 170 +++--
 i18n/po/fi.po                                      | 172 +++--
 i18n/po/fil.po                                     | 170 +++--
 i18n/po/fo.po                                      | 170 +++--
 i18n/po/fr.po                                      | 206 +++---
 i18n/po/ga.po                                      | 170 +++--
 i18n/po/gl.po                                      | 174 +++--
 i18n/po/he.po                                      | 172 +++--
 i18n/po/hi.po                                      | 170 +++--
 i18n/po/hr.po                                      | 170 +++--
 i18n/po/ht.po                                      | 170 +++--
 i18n/po/hu.po                                      | 415 +++++++-----
 i18n/po/hy.po                                      | 170 +++--
 i18n/po/ia.po                                      | 170 +++--
 i18n/po/id.po                                      | 170 +++--
 i18n/po/is.po                                      | 172 +++--
 i18n/po/it.po                                      | 280 ++++----
 i18n/po/ja.po                                      | 182 +++--
 i18n/po/ka.po                                      | 170 +++--
 i18n/po/km.po                                      | 174 +++--
 i18n/po/ko.po                                      | 170 +++--
 i18n/po/ky.po                                      | 170 +++--
 i18n/po/lb.po                                      | 170 +++--
 i18n/po/lo.po                                      | 170 +++--
 i18n/po/lt.po                                      | 182 +++--
 i18n/po/lv.po                                      | 170 +++--
 i18n/po/mk.po                                      | 170 +++--
 i18n/po/mr.po                                      | 170 +++--
 i18n/po/ms.po                                      | 170 +++--
 i18n/po/nb.po                                      | 172 +++--
 i18n/po/nds.po                                     | 170 +++--
 i18n/po/nl.po                                      | 202 +++---
 i18n/po/nn.po                                      | 170 +++--
 i18n/po/oc.po                                      | 170 +++--
 i18n/po/pa.po                                      | 170 +++--
 i18n/po/pl.po                                      | 198 +++---
 i18n/po/pt.po                                      | 269 +++++---
 i18n/po/pt_BR.po                                   | 214 +++---
 i18n/po/rm.po                                      | 170 +++--
 i18n/po/ro.po                                      | 172 +++--
 i18n/po/ru.po                                      | 205 +++---
 i18n/po/sk.po                                      | 185 +++--
 i18n/po/sl.po                                      | 172 +++--
 i18n/po/sq.po                                      | 170 +++--
 i18n/po/sr.po                                      | 170 +++--
 i18n/po/sv.po                                      | 174 +++--
 i18n/po/ta.po                                      | 170 +++--
 i18n/po/te.po                                      | 170 +++--
 i18n/po/th.po                                      | 170 +++--
 i18n/po/tr.po                                      | 172 +++--
 i18n/po/ug.po                                      | 170 +++--
 i18n/po/uk.po                                      | 192 ++++--
 i18n/po/ur.po                                      | 170 +++--
 i18n/po/vi.po                                      | 172 +++--
 i18n/po/wae.po                                     | 170 +++--
 i18n/po/zh_CN.po                                   | 172 +++--
 i18n/po/zh_TW.po                                   | 223 +++---
 images/cursor/modifier/parallel.png                | Bin 102 -> 135 bytes
 images/cursor/modifier/parallel_add.png            | Bin 0 -> 141 bytes
 images/cursor/modifier/parallel_remove.png         | Bin 0 -> 132 bytes
 netbeans/nbproject/project.properties              |   4 +-
 scripts/SyncEditorImageryIndex.groovy              |   3 +
 src/gnu/getopt/Getopt.java                         | 204 +++---
 src/gnu/getopt/LongOpt.java                        |  20 +-
 .../jcs/auxiliary/disk/block/BlockDiskCache.java   |  10 +-
 .../commons/jcs/engine/control/CompositeCache.java |  11 +-
 src/org/openstreetmap/josm/Main.java               | 105 +--
 .../openstreetmap/josm/actions/AboutAction.java    |   7 +-
 .../josm/actions/AddImageryLayerAction.java        |  32 +-
 .../josm/actions/AutoScaleAction.java              | 160 +++--
 .../josm/actions/CloseChangesetAction.java         |   2 +-
 .../josm/actions/CombineWayAction.java             |   8 +-
 .../josm/actions/ExtensionFileFilter.java          |  10 +-
 .../josm/actions/ImageryAdjustAction.java          |   8 +-
 .../josm/actions/JoinAreasAction.java              |  15 +-
 src/org/openstreetmap/josm/actions/JosmAction.java |   4 +-
 .../openstreetmap/josm/actions/JumpToAction.java   |   2 +-
 .../openstreetmap/josm/actions/OpenFileAction.java |  36 +-
 .../josm/actions/OpenLocationAction.java           |   4 +-
 .../josm/actions/OrthogonalizeAction.java          |  10 +-
 .../openstreetmap/josm/actions/PasteAction.java    |  14 +-
 .../openstreetmap/josm/actions/RestartAction.java  |  57 +-
 .../josm/actions/SearchNotesDownloadAction.java    |  12 +-
 .../josm/actions/SessionLoadAction.java            |  66 +-
 .../josm/actions/ShowStatusReportAction.java       |  14 +-
 .../openstreetmap/josm/actions/SplitWayAction.java |  11 +-
 .../openstreetmap/josm/actions/UnGlueAction.java   |   6 +-
 .../josm/actions/UpdateSelectionAction.java        |   3 +-
 .../josm/actions/UploadSelectionAction.java        |   3 +-
 .../AbstractChangesetDownloadTask.java             |   8 +-
 .../downloadtasks/AbstractDownloadTask.java        |   2 +-
 .../ChangesetContentDownloadTask.java              |   8 +-
 .../downloadtasks/ChangesetHeaderDownloadTask.java |   5 +-
 .../actions/downloadtasks/ChangesetQueryTask.java  |   5 +-
 .../actions/downloadtasks/DownloadGpsTask.java     |   8 +-
 .../actions/downloadtasks/DownloadNotesTask.java   |  24 +-
 .../actions/downloadtasks/DownloadOsmTask.java     |   6 +-
 .../downloadtasks/DownloadReferrersTask.java       |   5 +-
 .../actions/downloadtasks/DownloadTaskList.java    |  12 +-
 .../actions/downloadtasks/PostDownloadHandler.java |   4 +-
 .../josm/actions/mapmode/DrawAction.java           |  34 +-
 .../actions/mapmode/ImproveWayAccuracyAction.java  |   2 +-
 .../josm/actions/mapmode/ParallelWayAction.java    |  44 +-
 .../josm/actions/mapmode/ParallelWays.java         |   1 -
 .../josm/actions/mapmode/SelectAction.java         |  12 +-
 .../josm/actions/mapmode/ZoomAction.java           |   3 +-
 .../josm/actions/search/SearchCompiler.java        |  79 ++-
 .../josm/actions/upload/UploadNotesTask.java       |   2 +-
 .../josm/actions/upload/ValidateUploadHook.java    |   1 -
 .../openstreetmap/josm/command/ChangeCommand.java  |   3 +-
 .../josm/command/ChangePropertyCommand.java        |   2 +
 .../command/ChangeRelationMemberRoleCommand.java   |   4 +-
 src/org/openstreetmap/josm/command/Command.java    |  13 +-
 .../openstreetmap/josm/command/DeleteCommand.java  |  18 +-
 .../openstreetmap/josm/command/MoveCommand.java    |   2 +-
 .../josm/command/TransformNodesCommand.java        |   2 +-
 .../conflict/ModifiedConflictResolveCommand.java   |   6 +-
 .../conflict/VersionConflictResolveCommand.java    |   6 +-
 src/org/openstreetmap/josm/data/AutosaveTask.java  |  59 +-
 .../josm/data/CustomConfigurator.java              |  42 +-
 src/org/openstreetmap/josm/data/Preferences.java   |  67 +-
 .../openstreetmap/josm/data/ProjectionBounds.java  |   2 +-
 .../josm/data/SystemOfMeasurement.java             |  47 +-
 src/org/openstreetmap/josm/data/Version.java       |   2 +-
 .../josm/data/cache/BufferedImageCacheEntry.java   |   4 -
 .../josm/data/cache/JCSCacheManager.java           |  15 +-
 .../josm/data/cache/JCSCachedTileLoaderJob.java    |  15 +-
 src/org/openstreetmap/josm/data/coor/LatLon.java   |   2 +-
 .../openstreetmap/josm/data/coor/QuadTiling.java   |   6 +-
 .../openstreetmap/josm/data/gpx/GpxConstants.java  |  11 +-
 src/org/openstreetmap/josm/data/gpx/WayPoint.java  |   3 +-
 .../josm/data/imagery/CachedTileLoaderFactory.java |  12 +-
 .../josm/data/imagery/ImageryInfo.java             |  16 +-
 .../josm/data/imagery/TMSCachedTileLoaderJob.java  |   2 +-
 .../josm/data/imagery/TemplatedWMSTileSource.java  |   2 +-
 .../josm/data/imagery/WMTSTileSource.java          |  10 +-
 src/org/openstreetmap/josm/data/notes/Note.java    |   2 +-
 .../josm/data/oauth/OAuthParameters.java           |  17 +-
 .../josm/data/oauth/SignpostAdapters.java          |  26 +-
 .../josm/data/osm/DatasetConsistencyTest.java      |   2 +-
 src/org/openstreetmap/josm/data/osm/Relation.java  |   2 +-
 .../josm/data/osm/RelationMemberData.java          |  32 +
 .../josm/data/osm/SimplePrimitiveId.java           |   2 +-
 .../osm/visitor/paint/AbstractMapRenderer.java     |   8 +-
 .../josm/data/osm/visitor/paint/LineClip.java      |  14 +-
 .../data/osm/visitor/paint/StyledMapRenderer.java  |  22 +-
 .../osm/visitor/paint/WireframeMapRenderer.java    |   4 +-
 .../osm/visitor/paint/relations/Multipolygon.java  |   2 +
 .../visitor/paint/relations/MultipolygonCache.java |  11 +-
 .../josm/data/preferences/ListListSetting.java     |   4 +-
 .../josm/data/preferences/ListSetting.java         |   2 +-
 .../josm/data/preferences/MapListSetting.java      |   6 +-
 .../josm/data/preferences/PreferencesReader.java   |  24 +-
 .../josm/data/projection/CustomProjection.java     |   6 +-
 .../josm/data/projection/Projections.java          |   2 +-
 .../data/projection/datum/NTV2GridShiftFile.java   |  24 +-
 .../projection/datum/NTV2GridShiftFileWrapper.java |   3 +-
 .../josm/data/projection/datum/NTV2SubGrid.java    |   2 +-
 .../josm/data/projection/proj/AbstractProj.java    |   7 +-
 .../josm/data/projection/proj/AlbersEqualArea.java |   4 +-
 .../data/projection/proj/ClassProjFactory.java     |   8 +-
 .../data/projection/proj/DoubleStereographic.java  |   2 +-
 .../josm/data/projection/proj/LonLat.java          |   3 +
 .../data/projection/proj/PolarStereographic.java   |   2 +-
 .../data/projection/proj/TransverseMercator.java   |   3 +
 .../josm/data/validation/OsmValidator.java         |  71 +-
 .../josm/data/validation/PaintVisitor.java         |   9 +-
 .../data/validation/routines/DomainValidator.java  |  33 +-
 .../data/validation/routines/EmailValidator.java   |  13 +-
 .../data/validation/routines/RegexValidator.java   |   2 +-
 .../josm/data/validation/tests/Addresses.java      |  34 +-
 .../data/validation/tests/ConditionalKeys.java     |   6 +-
 .../josm/data/validation/tests/CrossingWays.java   |  18 +-
 .../josm/data/validation/tests/Highways.java       |  14 +-
 .../data/validation/tests/MapCSSTagChecker.java    |   2 +-
 .../data/validation/tests/OpeningHourTest.java     |   4 +-
 .../josm/data/validation/tests/PowerLines.java     |   8 +-
 .../josm/data/validation/tests/TagChecker.java     |   5 +
 .../josm/data/validation/util/Entities.java        |  18 +-
 .../josm/gui/DefaultNameFormatter.java             |   4 +-
 src/org/openstreetmap/josm/gui/FileDrop.java       |   9 +-
 src/org/openstreetmap/josm/gui/ImageryMenu.java    |   3 +
 .../josm/gui/JosmUserIdentityManager.java          |  12 +-
 .../openstreetmap/josm/gui/MainApplication.java    |  19 +-
 src/org/openstreetmap/josm/gui/MainMenu.java       |  21 +-
 src/org/openstreetmap/josm/gui/MapFrame.java       |  84 ++-
 src/org/openstreetmap/josm/gui/MapMover.java       |   1 +
 src/org/openstreetmap/josm/gui/MapStatus.java      |  40 +-
 src/org/openstreetmap/josm/gui/MapView.java        | 750 +++++++++++----------
 .../josm/gui/NavigatableComponent.java             |  14 +-
 .../josm/gui/NotificationManager.java              |  27 +-
 .../openstreetmap/josm/gui/PleaseWaitDialog.java   |  17 +-
 .../openstreetmap/josm/gui/PleaseWaitRunnable.java |   8 +-
 src/org/openstreetmap/josm/gui/ScrollViewport.java |   9 +-
 .../openstreetmap/josm/gui/SelectionManager.java   |  20 +-
 src/org/openstreetmap/josm/gui/SideButton.java     |  29 +-
 src/org/openstreetmap/josm/gui/SplashScreen.java   |   3 +-
 .../josm/gui/bbox/SlippyMapBBoxChooser.java        |  22 +-
 .../josm/gui/bbox/SlippyMapControler.java          |   4 +
 .../josm/gui/bbox/TileSelectionBBoxChooser.java    |  73 +-
 .../josm/gui/conflict/pair/ListMergeModel.java     |  12 +-
 .../josm/gui/conflict/pair/ListMerger.java         |  22 +-
 .../pair/properties/PropertiesMergeModel.java      |  15 +-
 .../conflict/pair/properties/PropertiesMerger.java |  90 +--
 .../tags/CombinePrimitiveResolverDialog.java       |   3 +-
 .../tags/PasteTagsConflictResolverDialog.java      |  50 +-
 .../tags/RelationMemberConflictResolver.java       |  21 +-
 .../tags/RelationMemberConflictResolverModel.java  |   1 +
 .../gui/conflict/tags/TagConflictResolver.java     |  27 +-
 .../conflict/tags/TagConflictResolverModel.java    |   1 +
 .../josm/gui/dialogs/ChangesetDialog.java          |   8 +-
 .../DeleteFromRelationConfirmationDialog.java      |  10 +-
 .../josm/gui/dialogs/DialogsPanel.java             |  12 +-
 .../josm/gui/dialogs/FilterDialog.java             |   2 +-
 .../josm/gui/dialogs/FilterTableModel.java         |   9 +
 .../josm/gui/dialogs/InspectPrimitiveDataText.java | 239 +++++++
 .../josm/gui/dialogs/InspectPrimitiveDialog.java   | 238 +------
 .../josm/gui/dialogs/LatLonDialog.java             |   2 +-
 .../josm/gui/dialogs/LayerListDialog.java          | 200 ++++--
 .../josm/gui/dialogs/MapPaintDialog.java           |  16 +-
 .../josm/gui/dialogs/OsmIdSelectionDialog.java     |  24 +-
 .../josm/gui/dialogs/SelectionListDialog.java      |   1 +
 .../josm/gui/dialogs/ToggleDialog.java             |  11 +-
 .../changeset/ChangesetCacheTableCellRenderer.java |   1 +
 .../dialogs/changeset/ChangesetContentPanel.java   |   2 +-
 .../ChangesetDiscussionTableCellRenderer.java      |   2 +
 .../changeset/SingleChangesetDownloadPanel.java    |  23 +-
 .../query/AdvancedChangesetQueryPanel.java         | 196 +++---
 .../changeset/query/BasicChangesetQueryPanel.java  |   3 +-
 .../changeset/query/ChangesetQueryDialog.java      |  29 +-
 .../changeset/query/UrlBasedQueryPanel.java        |  34 +-
 .../gui/dialogs/layer/LayerVisibilityAction.java   |   4 +-
 .../gui/dialogs/properties/PropertiesDialog.java   |   7 +-
 .../josm/gui/dialogs/properties/TagEditHelper.java |  17 +-
 .../gui/dialogs/relation/ChildRelationBrowser.java |   4 +-
 .../relation/DownloadRelationMemberTask.java       |   2 +-
 .../gui/dialogs/relation/DownloadRelationTask.java |   3 +-
 .../dialogs/relation/GenericRelationEditor.java    |   1 +
 .../relation/MemberTableLinkedCellRenderer.java    |   6 +-
 .../dialogs/relation/MemberTransferHandler.java    |   2 +-
 .../relation/ParentRelationLoadingTask.java        |   2 +-
 .../relation/ReferringRelationsBrowser.java        |  27 +-
 .../josm/gui/dialogs/relation/RelationEditor.java  |   2 +-
 .../josm/gui/dialogs/relation/RelationTree.java    |   2 +-
 .../gui/dialogs/relation/sort/RelationSorter.java  |   3 +-
 .../dialogs/relation/sort/WayConnectionType.java   |   7 +-
 .../relation/sort/WayConnectionTypeCalculator.java |   5 +-
 .../josm/gui/download/BookmarkList.java            |   2 +-
 .../josm/gui/download/BookmarkSelection.java       |  11 +-
 .../josm/gui/download/DownloadDialog.java          |  16 +-
 .../josm/gui/download/PlaceSelection.java          |   4 +-
 .../openstreetmap/josm/gui/help/HelpBrowser.java   |  23 +-
 .../josm/gui/help/HelpBrowserHistory.java          |  17 +-
 .../josm/gui/history/CoordinateInfoViewer.java     |  68 +-
 .../josm/gui/history/HistoryBrowser.java           |  47 +-
 .../gui/history/HistoryBrowserDialogManager.java   |  10 +-
 .../josm/gui/history/HistoryBrowserModel.java      |  81 ++-
 .../josm/gui/history/HistoryViewerPanel.java       |  16 +-
 .../josm/gui/history/NodeListViewer.java           |  16 +-
 .../RelationMemberListTableCellRenderer.java       |  13 +-
 .../josm/gui/history/TagTableCellRenderer.java     |   1 +
 .../josm/gui/history/VersionInfoPanel.java         |  10 +-
 .../josm/gui/history/VersionTable.java             |  10 +-
 .../josm/gui/io/AbstractPrimitiveTask.java         |   2 +-
 .../josm/gui/io/AbstractUploadTask.java            |  23 +-
 .../josm/gui/io/BasicUploadSettingsPanel.java      |  32 +-
 .../josm/gui/io/ChangesetCellRenderer.java         |   2 +-
 .../josm/gui/io/ChangesetCommentModel.java         |   8 +-
 .../josm/gui/io/ChangesetManagementPanel.java      |  46 +-
 .../josm/gui/io/CloseChangesetDialog.java          |  10 +-
 .../josm/gui/io/CloseChangesetTask.java            |   2 +-
 .../josm/gui/io/CredentialDialog.java              |  37 +-
 .../josm/gui/io/DownloadFileTask.java              |   9 +-
 .../josm/gui/io/DownloadOpenChangesetsTask.java    |   2 +-
 .../josm/gui/io/RecentlyOpenedFilesMenu.java       |   5 +
 .../openstreetmap/josm/gui/io/SaveLayerTask.java   |   2 +-
 .../josm/gui/io/SaveLayersDialog.java              |  84 +--
 .../openstreetmap/josm/gui/io/SaveLayersModel.java |   1 +
 .../josm/gui/io/TagSettingsPanel.java              |  20 +-
 .../openstreetmap/josm/gui/io/UploadLayerTask.java |   2 +-
 .../josm/gui/io/UploadSelectionDialog.java         |  24 +-
 .../josm/gui/io/UploadStrategySelectionPanel.java  |  47 +-
 .../josm/gui/layer/AbstractTileSourceLayer.java    |   6 +-
 src/org/openstreetmap/josm/gui/layer/GpxLayer.java |   6 +
 .../openstreetmap/josm/gui/layer/ImageryLayer.java |  23 +-
 src/org/openstreetmap/josm/gui/layer/Layer.java    |   2 +-
 .../openstreetmap/josm/gui/layer/LayerManager.java | 348 ++++++++++
 .../josm/gui/layer/LayerPositionStrategy.java      |  13 +-
 .../josm/gui/layer/MainLayerManager.java           | 282 ++++++++
 .../josm/gui/layer/MapViewPaintable.java           |   3 +-
 .../josm/gui/layer/NativeScaleLayer.java           |   2 +-
 .../openstreetmap/josm/gui/layer/OsmDataLayer.java |  16 +-
 src/org/openstreetmap/josm/gui/layer/TMSLayer.java |   8 +-
 .../josm/gui/layer/ValidatorLayer.java             |   4 +
 .../gui/layer/geoimage/CorrelateGpxWithImages.java |  69 +-
 .../josm/gui/layer/geoimage/GeoImageLayer.java     |   1 +
 .../josm/gui/layer/geoimage/ImageDisplay.java      |   3 +
 .../josm/gui/layer/geoimage/ImageEntry.java        |   6 +-
 .../josm/gui/layer/geoimage/ThumbsLoader.java      |   2 +-
 .../gui/layer/gpx/DownloadAlongTrackAction.java    |   1 +
 .../gui/layer/gpx/DownloadWmsAlongTrackAction.java |  10 +-
 .../josm/gui/layer/gpx/GpxDrawHelper.java          |  26 +-
 .../josm/gui/layer/markerlayer/ButtonMarker.java   |   2 +-
 .../josm/gui/layer/markerlayer/Marker.java         |   1 +
 .../josm/gui/layer/markerlayer/MarkerLayer.java    |  19 +-
 .../josm/gui/layer/markerlayer/PlayHeadMarker.java |   7 +-
 .../josm/gui/layer/markerlayer/WebMarker.java      |   2 +-
 .../openstreetmap/josm/gui/mappaint/Cascade.java   |  20 +-
 .../josm/gui/mappaint/DividedScale.java            |  14 +-
 .../josm/gui/mappaint/MapPaintMenu.java            |   3 +-
 .../josm/gui/mappaint/mapcss/Condition.java        |   8 +-
 .../gui/mappaint/mapcss/LiteralExpression.java     |   7 +-
 .../gui/mappaint/mapcss/MapCSSStyleSource.java     |   4 +-
 .../josm/gui/mappaint/mapcss/Selector.java         |   2 +-
 .../gui/mappaint/styleelement/BoxTextElement.java  |  24 +-
 .../styleelement/LabelCompositionStrategy.java     |   2 +-
 .../gui/mappaint/styleelement/NodeElement.java     |  11 +-
 .../mappaint/styleelement/RepeatImageElement.java  |   3 +
 .../gui/mappaint/styleelement/StyleElement.java    |   3 -
 .../josm/gui/oauth/AbstractAuthorizationUI.java    |  14 +-
 .../josm/gui/oauth/AccessTokenInfoPanel.java       |  25 +-
 .../gui/oauth/AdvancedOAuthPropertiesPanel.java    |  52 +-
 .../gui/oauth/FullyAutomaticAuthorizationUI.java   |  16 +-
 .../gui/oauth/FullyAutomaticPropertiesPanel.java   |  46 +-
 .../josm/gui/oauth/ManualAuthorizationUI.java      |  43 +-
 .../josm/gui/oauth/OAuthAuthorizationWizard.java   |  18 +-
 .../gui/oauth/OsmOAuthAuthorizationClient.java     |   5 +-
 .../josm/gui/oauth/OsmPrivilegesPanel.java         |  38 +-
 .../gui/oauth/SemiAutomaticAuthorizationUI.java    |   8 +-
 .../josm/gui/oauth/TestAccessTokenTask.java        |   4 +-
 .../josm/gui/preferences/PreferenceDialog.java     |  38 +-
 .../josm/gui/preferences/PreferenceTabbedPane.java |   4 +-
 .../josm/gui/preferences/SourceEditor.java         |  26 +-
 .../josm/gui/preferences/ToolbarPreferences.java   |  40 +-
 .../gui/preferences/display/GPXSettingsPanel.java  |   4 +-
 .../gui/preferences/display/LafPreference.java     |   2 +-
 .../gui/preferences/imagery/AddWMSLayerPanel.java  |   3 +-
 .../gui/preferences/imagery/ImageryPreference.java |  12 +-
 .../gui/preferences/plugin/PluginCheckBox.java     | 101 +++
 .../gui/preferences/plugin/PluginListPanel.java    | 107 +--
 .../preferences/plugin/PluginPreferencesModel.java |  10 +-
 .../plugin/PluginUpdatePolicyPanel.java            |  32 +-
 .../projection/CodeProjectionChoice.java           |  13 +-
 .../projection/CustomProjectionChoice.java         |   2 +-
 .../projection/ProjectionPreference.java           |  81 ++-
 .../projection/SingleProjectionChoice.java         |   1 +
 .../gui/preferences/server/ApiUrlTestTask.java     |   4 +-
 .../server/AuthenticationPreferencesPanel.java     |  38 +-
 .../BasicAuthenticationPreferencesPanel.java       |  27 +-
 .../OAuthAuthenticationPreferencesPanel.java       |  43 +-
 .../preferences/server/OsmApiUrlInputPanel.java    |  34 +-
 .../server/OverpassServerPreference.java           |   4 +-
 .../preferences/server/ProxyPreferencesPanel.java  |  30 +-
 .../josm/gui/progress/ChildProgress.java           |   1 +
 .../josm/gui/progress/NullProgressMonitor.java     |  24 +-
 .../progress/SwingRenderingProgressMonitor.java    |   1 +
 .../josm/gui/tagging/TagEditorModel.java           |  16 +-
 .../josm/gui/tagging/TagEditorPanel.java           |  21 +-
 .../openstreetmap/josm/gui/tagging/TagTable.java   |  19 +-
 .../gui/tagging/ac/AutoCompletingComboBox.java     |   4 +-
 .../gui/tagging/ac/AutoCompletionItemPriority.java |   6 +-
 .../josm/gui/tagging/presets/TaggingPreset.java    |   4 +-
 .../gui/tagging/presets/TaggingPresetItem.java     |   2 +-
 .../gui/tagging/presets/TaggingPresetReader.java   |   2 +-
 .../gui/tagging/presets/TaggingPresetSelector.java |   2 +-
 .../tagging/presets/items/ComboMultiSelect.java    |   2 +-
 .../josm/gui/util/AdjustmentSynchronizer.java      |  17 +-
 .../josm/gui/util/ChangeNotifier.java              |  57 ++
 src/org/openstreetmap/josm/gui/util/GuiHelper.java |  58 +-
 .../openstreetmap/josm/gui/util/RotationAngle.java |   4 +-
 .../josm/gui/widgets/AbstractIdTextField.java      |   2 +-
 .../josm/gui/widgets/HistoryComboBox.java          |   3 +-
 .../openstreetmap/josm/gui/widgets/ImageLabel.java |  30 +-
 .../josm/gui/widgets/JosmImageView.java            |  10 +-
 .../josm/gui/widgets/MultiSplitLayout.java         | 163 +----
 .../josm/gui/widgets/MultiSplitPane.java           |   8 +-
 .../josm/gui/widgets/PopupMenuLauncher.java        |   7 +-
 .../josm/gui/widgets/QuadStateCheckBox.java        |  16 +-
 .../gui/widgets/SearchTextResultListPanel.java     |   4 +
 .../openstreetmap/josm/gui/widgets/UrlLabel.java   |   2 +-
 .../openstreetmap/josm/io/AllFormatsImporter.java  |   2 +-
 .../josm/io/BoundingBoxDownloader.java             |  10 +-
 src/org/openstreetmap/josm/io/CachedFile.java      |  10 +-
 .../josm/io/CertificateAmendment.java              |  87 +--
 src/org/openstreetmap/josm/io/ChangesetQuery.java  |  46 +-
 src/org/openstreetmap/josm/io/Compression.java     |  18 +-
 src/org/openstreetmap/josm/io/FileImporter.java    |   4 +-
 src/org/openstreetmap/josm/io/GeoJSONWriter.java   |   4 +-
 src/org/openstreetmap/josm/io/GpxReader.java       | 135 ++--
 src/org/openstreetmap/josm/io/MessageNotifier.java |   2 +-
 .../josm/io/MultiFetchOverpassObjectReader.java    |   8 +-
 .../josm/io/MultiFetchServerObjectReader.java      |  11 +-
 src/org/openstreetmap/josm/io/NoteReader.java      |   1 +
 src/org/openstreetmap/josm/io/OsmApi.java          |   2 +-
 src/org/openstreetmap/josm/io/OsmApiException.java |   4 +-
 .../josm/io/OsmApiPrimitiveGoneException.java      |  29 +-
 .../openstreetmap/josm/io/OsmChangeBuilder.java    |  48 +-
 .../openstreetmap/josm/io/OsmChangesetParser.java  |   3 +-
 src/org/openstreetmap/josm/io/OsmConnection.java   |   8 +-
 src/org/openstreetmap/josm/io/OsmReader.java       |  43 +-
 .../josm/io/OsmServerBackreferenceReader.java      |   3 +-
 .../josm/io/OsmServerChangesetReader.java          |   6 +-
 .../josm/io/OsmServerHistoryReader.java            |   4 +-
 .../josm/io/OsmServerLocationReader.java           |   2 +-
 .../josm/io/OsmServerObjectReader.java             |   3 +-
 src/org/openstreetmap/josm/io/OsmServerReader.java |   6 +-
 .../josm/io/OsmServerUserInfoReader.java           |   5 +-
 src/org/openstreetmap/josm/io/OsmServerWriter.java |  36 +-
 .../josm/io/UTFInputStreamReader.java              |  20 +-
 .../josm/io/XmlStreamParsingException.java         |  52 ++
 .../josm/io/imagery/ImageryReader.java             |  25 +-
 .../openstreetmap/josm/io/imagery/WMSImagery.java  |  23 +-
 .../josm/io/remotecontrol/AddTagsDialog.java       |   2 +-
 .../io/remotecontrol/RemoteControlHttpServer.java  |   4 +-
 .../io/remotecontrol/RemoteControlHttpsServer.java |   4 +-
 .../josm/io/remotecontrol/RequestProcessor.java    |  18 +-
 .../io/remotecontrol/handler/ImportHandler.java    |   2 +-
 .../remotecontrol/handler/LoadAndZoomHandler.java  |   2 +-
 .../io/remotecontrol/handler/VersionHandler.java   |   2 +-
 .../josm/io/session/GeoImageSessionImporter.java   | 102 +--
 .../josm/io/session/SessionReader.java             |   4 +-
 .../josm/io/session/SessionWriter.java             |   6 +-
 .../openstreetmap/josm/plugins/PluginHandler.java  |  42 +-
 .../josm/plugins/PluginInformation.java            |  13 +-
 .../openstreetmap/josm/plugins/PluginProxy.java    |   7 +-
 .../plugins/ReadLocalPluginInformationTask.java    |   4 +-
 .../plugins/ReadRemotePluginInformationTask.java   |   4 +-
 src/org/openstreetmap/josm/tools/AudioPlayer.java  |  11 +-
 src/org/openstreetmap/josm/tools/Diff.java         |  90 +--
 src/org/openstreetmap/josm/tools/ExifReader.java   |   2 +-
 src/org/openstreetmap/josm/tools/HttpClient.java   |   4 +-
 .../openstreetmap/josm/tools/ImageProvider.java    |  17 +-
 src/org/openstreetmap/josm/tools/OpenBrowser.java  |   5 +-
 .../josm/tools/OverpassTurboQueryWizard.java       |   2 +-
 src/org/openstreetmap/josm/tools/Pair.java         |   4 +-
 .../openstreetmap/josm/tools/PlatformHookOsx.java  |  68 +-
 .../josm/tools/PlatformHookUnixoid.java            |   1 +
 src/org/openstreetmap/josm/tools/Predicates.java   |  23 +-
 src/org/openstreetmap/josm/tools/Utils.java        | 116 +++-
 .../openstreetmap/josm/tools/WindowGeometry.java   | 234 ++++---
 .../openstreetmap/josm/tools/XmlObjectParser.java  |   7 +-
 .../josm/tools/bugreport/BugReport.java            |  77 +++
 .../tools/bugreport/BugReportExceptionHandler.java |  13 +-
 .../josm/tools/bugreport/ReportedException.java    | 284 ++++++++
 .../openstreetmap/josm/tools/date/DateUtils.java   |   2 +-
 styles/standard/elemstyles.mapcss                  |   3 +-
 .../josm/io/MultiFetchServerObjectReaderTest.java  |   3 +-
 .../josm/io/OsmServerBackreferenceReaderTest.java  |   8 +-
 .../josm/io/UploadStrategySelectionPanelTest.java  |   5 +-
 .../josm/data/osm/KeyValuePerformanceTest.java     |   7 +-
 .../josm/data/osm/RoundingPerformanceTest.java     |   3 +
 ... AbstractMapRendererPerformanceTestParent.java} |  40 +-
 .../paint/StyledMapRendererPerformanceTest.java    | 120 +---
 .../paint/WireframeMapRendererPerformanceTest.java |  20 +
 .../gui/mappaint/MapRendererPerformanceTest.java   |   9 +-
 .../mapcss/MapCSSStyleSourceFilterTest.java        |   5 +-
 .../josm/io/OsmReaderPerformanceTest.java          |   3 +
 test/unit/org/openstreetmap/josm/JOSMFixture.java  |   6 +-
 test/unit/org/openstreetmap/josm/MainTest.java     |  26 +
 test/unit/org/openstreetmap/josm/TestUtils.java    |   3 +
 .../josm/actions/AddImageryLayerActionTest.java    |   2 +-
 .../josm/actions/CreateCircleActionTest.java       |  15 +-
 .../josm/actions/ExtensionFileFilterTest.java      |  28 +-
 .../josm/actions/SimplifyWayActionTest.java        |  99 +++
 .../josm/actions/SplitWayActionTest.java           |   2 -
 .../josm/actions/UnGlueActionTest.java             | 133 ++++
 .../josm/actions/UnJoinNodeWayActionTest.java      |   2 +-
 .../downloadtasks/PostDownloadHandlerTest.java     |   2 +-
 .../josm/actions/mapmode/DrawActionTest.java       |   3 +-
 .../josm/actions/mapmode/MapViewMock.java          |   7 +-
 .../josm/actions/mapmode/SelectActionTest.java     |  18 +-
 .../josm/actions/search/SearchCompilerTest.java    |   4 +
 .../openstreetmap/josm/data/AutosaveTaskTest.java  | 119 ++++
 .../josm/data/ProjectionBoundsTest.java            |  20 +
 .../org/openstreetmap/josm/data/VersionTest.java   |  35 +
 .../data/cache/JCSCachedTileLoaderJobTest.java     |  25 +-
 .../openstreetmap/josm/data/coor/LatLonTest.java   |   3 +
 .../josm/data/imagery/ImageryInfoTest.java         |   2 +-
 .../data/imagery/TemplatedWMSTileSourceTest.java   |  26 +-
 .../josm/data/imagery/WMTSTileSourceTest.java      |   8 +-
 .../josm/data/oauth/OAuthParametersTest.java       |  23 +-
 .../josm/data/oauth/OAuthTokenTest.java            |   6 +-
 .../josm/data/oauth/SignpostAdaptersTest.java      |  99 +++
 .../josm/data/osm/ChangesetCacheTest.groovy        |  12 +-
 .../openstreetmap/josm/data/osm/FilterTest.java    |   1 +
 .../josm/data/osm/MultipolygonBuilderTest.java     |   3 +
 .../josm/data/osm/OsmPrimitiveKeyHandlingTest.java |   3 +
 .../openstreetmap/josm/data/osm/RelationTest.java  |   2 +-
 .../visitor/MergeSourceBuildingVisitorTest.java    |   9 +
 .../josm/data/projection/ProjectionRefTest.java    |  13 +-
 .../validation/routines/DomainValidatorTestIT.java | 216 +++---
 .../validation/routines/EmailValidatorTest.java    |   5 +-
 .../data/validation/routines/UrlValidatorTest.java |   4 +-
 .../validation/tests/MultipolygonTestTest.java     |   4 -
 .../data/validation/tests/NameMismatchTest.java    |  15 +-
 .../josm/gui/DefaultNameFormatterTest.java         |  16 +-
 .../josm/gui/TableCellRendererTest.java            |   3 +-
 .../pair/properties/PropertiesMergeModelTest.java  |  22 +-
 .../gui/dialogs/InspectPrimitiveDialogTest.java    | 131 ++++
 .../dialogs/layer/LayerVisibilityActionTest.java   |   2 +
 .../josm/gui/history/HistoryBrowserModelTest.java  |  85 +++
 .../josm/gui/layer/ImageryLayerTest.java           |  35 +
 .../josm/gui/layer/LayerManagerTest.java           | 431 ++++++++++++
 .../josm/gui/layer/MainLayerManagerTest.java       | 260 +++++++
 .../josm/gui/layer/MapViewPaintableTest.java       |  31 +
 .../josm/gui/layer/OsmDataLayerTest.java           | 262 +++++++
 .../layer/gpx/DownloadWmsAlongTrackActionTest.java |   2 +-
 .../gui/mappaint/mapcss/MapCSSParserTest.groovy    |   6 +-
 .../preferences/map/MapPaintPreferenceTestIT.java  |  10 +-
 .../map/TaggingPresetPreferenceTestIT.java         |   6 +-
 .../ValidatorTagCheckerRulesPreferenceTestIT.java  |   6 +-
 .../tagging/presets/TaggingPresetReaderTest.java   |   2 +-
 .../josm/io/ChangesetQueryUrlParserTest.groovy     |  22 +-
 .../josm/io/DiffResultProcessorTest.groovy         |   6 +-
 .../openstreetmap/josm/io/GeoJSONWriterTest.java   |  17 +-
 .../josm/io/remotecontrol/RemoteControlTest.java   |   7 +-
 .../josm/io/session/SessionReaderTest.java         |  11 +-
 .../josm/plugins/PluginHandlerTestIT.java          |   3 +
 .../openstreetmap/josm/tools/ExifReaderTest.java   |   3 +-
 .../openstreetmap/josm/tools/PredicatesTest.java   | 208 ++++++
 .../josm/tools/WindowGeometryTest.java             | 151 +++++
 .../josm/tools/bugreport/BugReportTest.java        |  27 +
 .../tools/bugreport/ReportedExceptionTest.java     | 112 +++
 .../josm/tools/date/DateUtilsTest.java             |   3 +
 561 files changed, 17766 insertions(+), 9939 deletions(-)

diff --git a/.classpath b/.classpath
index 28a5cbd..ab09759 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.0.2.jar"/>
+	<classpathentry kind="lib" path="test/lib/equalsverifier-2.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/.settings/edu.umd.cs.findbugs.core.prefs b/.settings/edu.umd.cs.findbugs.core.prefs
index c2a7f80..6e1b365 100644
--- a/.settings/edu.umd.cs.findbugs.core.prefs
+++ b/.settings/edu.umd.cs.findbugs.core.prefs
@@ -1,5 +1,5 @@
 #FindBugs User Preferences
-#Sat Aug 01 23:18:50 CEST 2015
+#Mon May 16 03:41:36 CEST 2016
 cloud_id=edu.umd.cs.findbugs.cloud.doNothingCloud
 detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
 detectorAtomicityProblem=AtomicityProblem|true
@@ -9,7 +9,7 @@ detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
 detectorBadUseOfReturnValue=BadUseOfReturnValue|true
 detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
 detectorBooleanReturnNull=BooleanReturnNull|true
-detectorCallToUnsupportedMethod=CallToUnsupportedMethod|false
+detectorCallToUnsupportedMethod=CallToUnsupportedMethod|true
 detectorCheckExpectedWarnings=CheckExpectedWarnings|false
 detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
 detectorCheckRelaxingNullnessAnnotation=CheckRelaxingNullnessAnnotation|true
@@ -18,7 +18,7 @@ detectorCloneIdiom=CloneIdiom|true
 detectorComparatorIdiom=ComparatorIdiom|true
 detectorConfusedInheritance=ConfusedInheritance|true
 detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
-detectorCovariantArrayAssignment=CovariantArrayAssignment|false
+detectorCovariantArrayAssignment=CovariantArrayAssignment|true
 detectorCrossSiteScripting=CrossSiteScripting|true
 detectorDefaultEncodingDetector=DefaultEncodingDetector|true
 detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
@@ -80,8 +80,8 @@ detectorHugeSharedStringConstants=HugeSharedStringConstants|true
 detectorIDivResultCastToDouble=IDivResultCastToDouble|true
 detectorIncompatMask=IncompatMask|true
 detectorInconsistentAnnotations=InconsistentAnnotations|true
-detectorInefficientIndexOf=InefficientIndexOf|false
-detectorInefficientInitializationInsideLoop=InefficientInitializationInsideLoop|false
+detectorInefficientIndexOf=InefficientIndexOf|true
+detectorInefficientInitializationInsideLoop=InefficientInitializationInsideLoop|true
 detectorInefficientMemberAccess=InefficientMemberAccess|false
 detectorInefficientToArray=InefficientToArray|true
 detectorInfiniteLoop=InfiniteLoop|true
@@ -107,7 +107,7 @@ detectorNumberConstructor=NumberConstructor|true
 detectorOptionalReturnNull=OptionalReturnNull|true
 detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
 detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
-detectorPublicSemaphores=PublicSemaphores|false
+detectorPublicSemaphores=PublicSemaphores|true
 detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
 detectorReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass=ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass|true
 detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
@@ -130,15 +130,15 @@ detectorURLProblems=URLProblems|true
 detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
 detectorUnnecessaryMath=UnnecessaryMath|true
 detectorUnreadFields=UnreadFields|true
-detectorUselessSubclassMethod=UselessSubclassMethod|false
+detectorUselessSubclassMethod=UselessSubclassMethod|true
 detectorVarArgsProblems=VarArgsProblems|true
 detectorVolatileUsage=VolatileUsage|true
 detectorWaitInLoop=WaitInLoop|true
 detectorWrongMapIterator=WrongMapIterator|true
 detectorXMLFactoryBypass=XMLFactoryBypass|true
-detector_threshold=2
+detector_threshold=3
 effort=max
 excludefilter0=tools/findbugs/josm-filter.xml|true
-filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,I18N,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false|16
+filter_settings=Low|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,I18N,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false|20
 filter_settings_neg=NOISE|
 run_at_full_build=true
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 155bf4e..f83d090 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -393,7 +393,7 @@ org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
 org.eclipse.jdt.core.formatter.tabulation.char=space
 org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
diff --git a/.settings/org.sonarlint.eclipse.core.prefs b/.settings/org.sonarlint.eclipse.core.prefs
new file mode 100644
index 0000000..de4f442
--- /dev/null
+++ b/.settings/org.sonarlint.eclipse.core.prefs
@@ -0,0 +1,5 @@
+autoEnabled=true
+eclipse.preferences.version=1
+extraProperties=
+moduleKey=josm
+serverId=josm
diff --git a/REVISION b/REVISION
index 2d2b950..d4f11e3 100644
--- a/REVISION
+++ b/REVISION
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <info>
 <entry
-   revision="10168"
    kind="dir"
-   path="trunk">
+   path="trunk"
+   revision="10301">
 <url>https://josm.openstreetmap.de/svn/trunk</url>
 <relative-url>^/trunk</relative-url>
 <repository>
@@ -11,9 +11,9 @@
 <uuid>0c6e7542-c601-0410-84e7-c038aed88b3b</uuid>
 </repository>
 <commit
-   revision="10168">
-<author>wiktorn</author>
-<date>2016-05-02T08:23:17.436251Z</date>
+   revision="10301">
+<author>Don-vip</author>
+<date>2016-05-30T00:06:54.804264Z</date>
 </commit>
 </entry>
 </info>
diff --git a/build.xml b/build.xml
index f4069ab..50471e8 100644
--- a/build.xml
+++ b/build.xml
@@ -387,7 +387,10 @@ Build-Date: ${build.tstamp}
             <jacoco:coverage destfile="${test.dir}/jacoco@{testITsuffix}.exec">
                 <junit printsummary="yes" fork="true" forkmode="once">
                     <jvmarg value="-Dfile.encoding=UTF-8"/>
-                    <jvmarg value="-XaddExports:java.base/sun.security.util=ALL-UNNAMED,java.base/sun.security.x509=ALL-UNNAMED" if:set="isJava9" />
+                    <jvmarg line="-addmods java.xml.bind" if:set="isJava9" />
+                    <jvmarg value="-XaddExports:java.base/sun.security.util=ALL-UNNAMED" if:set="isJava9" />
+                    <jvmarg value="-XaddExports:java.base/sun.security.x509=ALL-UNNAMED" if:set="isJava9" />
+                    <jvmarg value="-XaddExports:java.xml.bind/javax.xml.bind=ALL-UNNAMED" if:set="isJava9" />
                     <sysproperty key="josm.home" value="${test.dir}/config/@{testfamily}-josm.home"/>
                     <sysproperty key="josm.test.data" value="${test.dir}/data"/>
                     <sysproperty key="java.awt.headless" value="true"/>
@@ -652,7 +655,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.17-all.jar"/>
+             classpath="tools/checkstyle/checkstyle-6.19-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"/>
@@ -675,6 +678,7 @@ Build-Date: ${build.tstamp}
                 pluginList=""
                 excludeFilter="tools/findbugs/josm-filter.xml"
                 effort="max"
+                reportLevel="low"
                 >
             <sourcePath path="${base.dir}/src" />
             <class location="${dist.dir}/josm-custom.jar" />
@@ -705,7 +709,7 @@ Build-Date: ${build.tstamp}
     -->
     <target name="epsg" depends="epsg-compile">
         <touch file="${epsg.output}"/>
-        <java classname="BuildProjectionDefinitions" failonerror="true">
+        <java classname="BuildProjectionDefinitions" failonerror="true" fork="true">
             <sysproperty key="java.awt.headless" value="true"/>
             <classpath>
                 <pathelement path="${base.dir}"/>
diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index cbce922..345454f 100644
--- a/data/defaultpresets.xml
+++ b/data/defaultpresets.xml
@@ -1304,6 +1304,7 @@
             <combo key="crossing" text="Pedestrian crossing type" values="uncontrolled,traffic_signals,island,unmarked,no" />
             <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" />
             <check key="bicycle" text="Cross by bicycle" />
             <check key="horse" text="Cross on horseback" />
             <label text="In case of traffic signals:" />
@@ -1748,6 +1749,7 @@
             <key key="barrier" value="kerb" />
             <reference ref="optional_height" />
             <reference ref="wheelchair" />
+            <combo key="tactile_paving" text="Tactile paving" values="yes,no,incorrect" />
         </item> <!-- Kerb -->
         <separator/> <!-- *** Access *** -->
         <item name="Entrance (Barrier Opening)" icon="styles/standard/vehicle/entrance.png" type="node" preset_name_label="true">
@@ -3173,6 +3175,7 @@
                 <text key="uic_name" text="UIC name" />
                 <text key="operator" text="Operator" />
                 <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)" />
@@ -3199,6 +3202,7 @@
             <check key="bin" text="Waste Basket/Trash Can" />
             <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" />
@@ -3381,6 +3385,7 @@
             <text key="ref" text="Reference (track number)" />
             <text key="width" text="Width (meters)" />
             <check key="area" text="Area" />
+            <combo key="tactile_paving" text="Tactile Paving" values="yes,no,incorrect" />
         </item> <!-- Bus Platform -->
     </group> <!-- Public Transport -->
     <item name="Taxi" icon="presets/taxi.png" type="node,closedway,multipolygon" preset_name_label="true">
diff --git a/data/validator/combinations.mapcss b/data/validator/combinations.mapcss
index 9666d85..c9a0939 100644
--- a/data/validator/combinations.mapcss
+++ b/data/validator/combinations.mapcss
@@ -230,7 +230,7 @@ way[waterway][bridge=yes] {
   throwWarning: tr("incomplete object: only {0} and {1}", "{0.key}", "{1.key}");
 }
 
-/* see #9811, #11491 */
+/* see #9811, #11491, #12865 */
 *[place][place!=farm][/^addr:/],
 *[boundary][/^addr:/],
 *[highway][/^addr:/][highway!=services][highway!=rest_area][!"addr:postcode"] {
@@ -249,7 +249,7 @@ way[highway][postal_code]["addr:postcode"][postal_code=*"addr:postcode"] {
 way[highway][postal_code]["addr:postcode"][postal_code!=*"addr:postcode"] {
   throwWarning: tr("{0} together with {1} and conflicting values", "{1.key}", "{2.key}");
 }
-way[highway][!postal_code]["addr:postcode"] {
+way[highway][highway!=services][highway!=rest_area][!postal_code]["addr:postcode"] {
   throwWarning: tr("{0} together with {1}", "{0.key}", "{2.key}");
   suggestAlternative: "postal_code";
   fixChangeKey: "addr:postcode=>postal_code";
diff --git a/data/validator/deprecated.mapcss b/data/validator/deprecated.mapcss
index 8151e61..19350bb 100644
--- a/data/validator/deprecated.mapcss
+++ b/data/validator/deprecated.mapcss
@@ -375,14 +375,16 @@
   fixAdd: "park_ride=yes";
 }
 
-/* see #10661, #10837, #11737 */
+/* see #10661, #10837, #11737, #12771 */
 *[traffic_calming=yes],
 *[access=restricted],
 *[barrier=yes],
 *[aerialway=yes][!public_transport],
 *[amenity=yes],
+*[leisure=yes],
 *[shop="*"],
 *[craft=yes],
+*[service=yes],
 *[place=yes] {
   throwWarning: tr("{0}={1} is unspecific. Please replace ''{1}'' by a specific value.", "{0.key}", "{0.value}");
 }
@@ -832,4 +834,18 @@ way[barrier=wall][type=noise_barrier][wall][wall!=noise_barrier] {
   throwWarning: tr("{0} is deprecated", "{0.tag}");
   suggestAlternative: "vending=newspapers";
   fixAdd: "vending=newspapers";
+}
+
+/* #12771 */
+*[service=drive_through] {
+  throwWarning: tr("{0} is deprecated", "{0.tag}");
+  suggestAlternative: "service=drive-through";
+  fixAdd: "service=drive-through";
+}
+
+/* #12771 */
+way[highway=service][service][service !~ /^(alley|drive-through|drive_through|driveway|emergency_access|parking_aisle|rest_area|yes)$/], /* drive_through and yes have special warnings */
+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}");
 }
\ No newline at end of file
diff --git a/data/validator/geometry.mapcss b/data/validator/geometry.mapcss
index 8dd7678..937d1e7 100644
--- a/data/validator/geometry.mapcss
+++ b/data/validator/geometry.mapcss
@@ -226,9 +226,9 @@ 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)$/],
+way[highway] > node[amenity][!entrance][amenity!~/^(parking|parking_space|parking_entrance|motorcycle_parking|bicycle_parking|bus_station|car_wash)$/],
 way[highway] > node[building][!entrance],
-way[highway] > node[leisure][!entrance],
+way[highway] > node[leisure][!entrance][leisure!=slipway],
 way[highway] > node[office][!entrance],
 way[highway] > node[shop][!entrance],
 way[highway] > node[tourism][!entrance][tourism!=viewpoint]!.guidepost {
@@ -267,3 +267,8 @@ way[power=cable] > node {
 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 { 
+  throwWarning: tr("Waterway ends without a connection to another waterway or the direction of the waterway is wrong.");
+}
\ No newline at end of file
diff --git a/data/validator/ignoretags.cfg b/data/validator/ignoretags.cfg
index c927f97..ecbf706 100644
--- a/data/validator/ignoretags.cfg
+++ b/data/validator/ignoretags.cfg
@@ -152,6 +152,7 @@ K:living_street=yes
 K:priority_road=designated
 K:priority_road=yes_unposted
 K:priority_road=end
+K:hazmat=designated
 K:hazmat=no
 K:hazmat:water=no
 K:hazmat:water=permissive
@@ -252,6 +253,7 @@ K:denomination=masonic
 ;
 K:shop=organic
 K:shop=ice_cream
+K:shop=vacant
 ;
 ; Sports Tags
 ;
diff --git a/i18n/README.TXT b/i18n/README.TXT
index d747632..63a6246 100644
--- a/i18n/README.TXT
+++ b/i18n/README.TXT
@@ -1,7 +1,7 @@
 How to use:
 
 Prerequisites:
-a) You must have installed ant, perl, libwww-perl, libterm-readkey-perl, gettext, bzr
+a) You must have installed ant, perl, libwww-perl, libterm-readkey-perl, gettext, bzr, libxml2-utils
 b) You must register your SSH key with Launchpad. See https://launchpad.net/people/+me
 c) You must inform bzr of your Launchpad ID. See "bzr help launchpad-login".
 
diff --git a/i18n/po/af.po b/i18n/po/af.po
index 39de52d..77ed79f 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:31+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:31+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: af\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/am.po b/i18n/po/am.po
index bb19d45..e7e5cb5 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:32+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:32+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: am\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ar.po b/i18n/po/ar.po
index ba7ffb2..512ba06 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:32+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:32+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ar\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3551,9 +3551,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5063,9 +5060,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "الطبقة ليست في اللائحة."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5784,15 +5778,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "طبّق ؟"
 
@@ -6090,15 +6084,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6188,6 +6173,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6906,13 +6900,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8911,6 +8905,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8928,12 +8928,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9675,10 +9669,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9687,6 +9678,9 @@ msgstr ""
 msgid "Direction"
 msgstr "الإتجاه"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "نقطة gps"
 
@@ -9831,13 +9825,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11403,6 +11397,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11411,11 +11410,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11500,6 +11494,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11514,9 +11511,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11630,12 +11624,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "منهج الإسقاط"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "منهج الإسقاط"
+
 msgid "Display coordinates as"
 msgstr "أعرض الإحداثيات كــ"
 
@@ -11860,6 +11854,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11869,9 +11866,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12997,9 +12991,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "حضّر المعطيات أو.أس.أم ..."
 
@@ -13110,6 +13101,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14849,6 +14843,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15924,6 +15921,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17909,6 +17909,12 @@ msgstr "إتجاه عقارب الساعة"
 msgid "Pedestrian Crossing"
 msgstr "تقاطع مشاة"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18097,6 +18103,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19080,12 +19089,6 @@ msgstr "محطة حافلة نقل جماعي (باص)"
 msgid "Bus Stop"
 msgstr "موقف محطة حافلة نقل جماعي"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23935,6 +23938,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24000,6 +24006,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26112,16 +26123,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27786,6 +27797,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30291,6 +30305,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30306,12 +30329,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30321,6 +30359,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30332,6 +30373,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ast.po b/i18n/po/ast.po
index 15c9961..c120bf2 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:33+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:33+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ast\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3848,9 +3848,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (a la llínea {0}, columna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "La proyeición UTM (''+proj=utm'') rique’l parámetru ''+zone=...''."
 
@@ -5454,9 +5451,6 @@ msgstr "El sistema de midida camudó a {0}"
 msgid "Layer not in list."
 msgstr "la capa no ta na llista"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "La capa ''{0}'' tien de tar na llista de capes"
-
 msgid "Default (open, closed, new)"
 msgstr "Predeterminao (abierta, zarrada, nueva)"
 
@@ -6255,17 +6249,17 @@ msgstr "Vía orixinal"
 msgid "Decision"
 msgstr "Decisión"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Por favor, escueya los valores a caltener pa les siguientes "
-"etiquetes.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Amosar namá etiquetes con conflictos"
 
 msgid "Show tags with multiple values only"
 msgstr "Amosar namá los atributos con valores múltiples"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Por favor, escueya los valores a caltener pa les siguientes "
+"etiquetes.</html>"
+
 msgid "Apply?"
 msgstr "¿Aplicar?"
 
@@ -6580,15 +6574,6 @@ msgstr[1] "<b>{0}</b> oxetos desactivaos"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Pieslle''l diálogu de peñeráu pa ver tolos oxetos.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Información ampliada sobre l''oxetu"
-
-msgid "map style"
-msgstr "estilu de mapa"
-
-msgid "edit counts"
-msgstr "cuenta de ediciones"
-
 msgid "not in data set"
 msgstr "non nel conxuntu de datos"
 
@@ -6678,6 +6663,15 @@ msgstr "Parte de: "
 msgid "In conflict with: "
 msgstr "En conflictu con: "
 
+msgid "Advanced object info"
+msgstr "Información ampliada sobre l''oxetu"
+
+msgid "map style"
+msgstr "estilu de mapa"
+
+msgid "edit counts"
+msgstr "cuenta de ediciones"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Caché d´estilos pa \"{0}\":"
 
@@ -7441,15 +7435,15 @@ msgstr "Consultar namá nos cambeos zarraos"
 msgid "Query both open and closed changesets"
 msgstr "Consultar nos cambeos abiertos y zarraos"
 
+msgid "Only changesets owned by myself"
+msgstr "Namá cambeos realizaos por mi"
+
 msgid "User ID:"
 msgstr "ID Usuariu:"
 
 msgid "User name:"
 msgstr "Nome d''usuariu:"
 
-msgid "Only changesets owned by myself"
-msgstr "Namá cambeos realizaos por mi"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Namá cambeos realizaos pol usuariu col siguiente ID"
 
@@ -9722,6 +9716,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Valor ensin esperar pa la clave ''{0}'' nes preferencies, tien ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Enllenar un conxuntu de cambeos y volver al diálogu de xubida"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Abrir y usar tantos conxuntos de cambeos nuevos como sía necesariu"
+
 msgid "Please select the upload strategy:"
 msgstr "Por favor, escueye la estratexa de xubida:"
 
@@ -9741,12 +9741,6 @@ msgstr ""
 "<html>Ríquense <strong>dellos conxuntos de cambeos</strong> pa xubir {0} "
 "oxetos. ¿Qué estratexa va emplegar?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Enllenar un conxuntu de cambeos y volver al diálogu de xubida"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Abrir y usar tantos conxuntos de cambeos nuevos como sía necesariu"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Nun ye posible xubir datos d''una sola vegada (hai demasiaos oxetos por "
@@ -10536,11 +10530,8 @@ msgstr "Nun hai capes d''imaxes disponibles."
 msgid "No imagery layers"
 msgstr "Nun hai capes d''imaxes"
 
-msgid "Velocity, km/h"
-msgstr "Velocidá, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Tiempu"
@@ -10548,6 +10539,9 @@ msgstr "Tiempu"
 msgid "Direction"
 msgstr "Direición"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "Puntu GPS"
 
@@ -10712,15 +10706,15 @@ msgstr "Erru al analizar los estilos Mappaint dende ''{0}''. L´erru foi: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Non pudo alcontrase la imaxe ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Almacenar llave d''accesu en preferencies"
+
 msgid "Access Token Key:"
 msgstr "Llave d''accesu:"
 
 msgid "Access Token Secret:"
 msgstr "Llave secreta d''accesu:"
 
-msgid "Save Access Token in preferences"
-msgstr "Almacenar llave d''accesu en preferencies"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12499,6 +12493,11 @@ msgstr "Axuste predetermináu internu"
 msgid "The default preset for JOSM"
 msgstr "L''axuste predetermináu de JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "El complementu {0} inda ye riquíu por esti complementu:"
+msgstr[1] "El complementu {0} inda ye riquíu por estos complementos {1}:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Complementu incluyíu en JOSM"
 
@@ -12509,11 +12508,6 @@ msgstr ""
 "Por favor, prima en <strong>Descargar llista</strong> pa descargar y amosar "
 "una llista de complementos disponibles."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "El complementu {0} inda ye riquíu por esti complementu:"
-msgstr[1] "El complementu {0} inda ye riquíu por estos complementos {1}:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versión {1} (local: {2})"
 
@@ -12605,6 +12599,9 @@ msgstr "Editar la URL de la descripción del complementu de JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "URL de descripción del complementu de JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Intervalu d''actualización (en díes):"
+
 msgid "Ask before updating"
 msgstr "Preguntar enantes d''actualizar"
 
@@ -12621,9 +12618,6 @@ msgstr ""
 "Por favor, decida si JOSM va actualizar automáticamente los componentes "
 "activos al empecipiase dempués d''una actualización de sigo mesmu."
 
-msgid "Update interval (in days):"
-msgstr "Intervalu d''actualización (en díes):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12739,12 +12733,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suecia)"
 
-msgid "Projection method"
-msgstr "Métodu de proyección"
-
 msgid "Projection code"
 msgstr "Códigu de proyección"
 
+msgid "Projection method"
+msgstr "Métodu de proyección"
+
 msgid "Display coordinates as"
 msgstr "Visualizar les coordenaes como"
 
@@ -12998,6 +12992,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Erru almacenando''l Token d''Accesu OAuth nel alministrador de credenciales"
 
+msgid "Save to preferences"
+msgstr "Guardar preferencies"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13010,9 +13007,6 @@ msgid ""
 msgstr ""
 "Usté yá tien una llave d''Accesu p''aportar al servidor OSM usando OAuth"
 
-msgid "Save to preferences"
-msgstr "Guardar preferencies"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Escueya pa siguir los pasos del procesu d''autorización OAuth"
 
@@ -14268,9 +14262,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Hai un valor illegal númberu(llargor) pal atributu ''{0}''. Llogróse ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Preparando datos OSM..."
 
@@ -14384,6 +14375,9 @@ msgstr "Arquivos WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versión d´arquivu WMS non soportada; atopada {0}, esperada {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16391,6 +16385,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17529,6 +17526,9 @@ msgstr ""
 "sitiu web de MapDust. Puede crear, pesllar, invalidar, reabrir y comentar "
 "los informes d''erros esistentes por aciu l''usu d''esti componente."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19588,6 +19588,12 @@ msgstr "aguyes del reló"
 msgid "Pedestrian Crossing"
 msgstr "Pasu de peatones"
 
+msgid "Tactile Paving"
+msgstr "Pavimentu táctil"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19776,6 +19782,9 @@ msgstr "Cabiana"
 msgid "Kerb"
 msgstr "Bordiellu"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrada (apertura de barrera)"
 
@@ -20768,12 +20777,6 @@ msgstr "Estación d''autobús"
 msgid "Bus Stop"
 msgstr "Parada d''autobús"
 
-msgid "Tactile Paving"
-msgstr "Pavimentu táctil"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Andén d''autobús"
 
@@ -25655,6 +25658,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25720,6 +25726,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome de cai embrivíu"
 
@@ -28065,16 +28076,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29836,6 +29847,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -32490,6 +32504,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -32505,12 +32528,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32520,6 +32558,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32531,6 +32572,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Nun pué asitiase un nudu fora''l mundu."
 
diff --git a/i18n/po/az.po b/i18n/po/az.po
index 828b50c..c101944 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:34+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:34+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/be.po b/i18n/po/be.po
index 2f8e4ca..a8d831f 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-25 16:08+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-20 17:19+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-05-04 04:35+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:35+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: be\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3892,9 +3892,6 @@ msgstr "Чакаўся элемент ''{0}'', а атрыманы ''{1}''"
 msgid "value expected"
 msgstr "чакалася значэнне"
 
-msgid " (at line {0}, column {1})"
-msgstr " (у радку {0}, слупок {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Праекцыя UTM (''+proj=utm'') патрабуе параметр ''+zone=...''."
 
@@ -5488,9 +5485,6 @@ msgstr "Сістэма вымярэнняў зменена на {0}"
 msgid "Layer not in list."
 msgstr "Пласт не ў спісе."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Пласт ''{0}'' павінен быць у спісе пластоў"
-
 msgid "Default (open, closed, new)"
 msgstr "Па змаўчанні (адкрытыя, зачыненыя, новыя)"
 
@@ -6300,16 +6294,16 @@ msgstr "Арыг. Лін."
 msgid "Decision"
 msgstr "Рашэнне"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Калі ласка, абярыце, якія значэнні захаваць для новых тэгаў.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Паказаць толькі тэгі з канфліктамі"
 
 msgid "Show tags with multiple values only"
 msgstr "Паказаць толькі тэгі з некалькімі значэннямі"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Калі ласка, абярыце, якія значэнні захаваць для новых тэгаў.</html>"
+
 msgid "Apply?"
 msgstr "Ужыць?"
 
@@ -6628,15 +6622,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Зачыніце дыялог фільтра, калі жадаеце ўбачыць усе аб’екты.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Падрабязная інфармацыя"
-
-msgid "map style"
-msgstr "стыль карты"
-
-msgid "edit counts"
-msgstr "колькасць правак"
-
 msgid "not in data set"
 msgstr "адсутнічае ў наборы дадзеных"
 
@@ -6727,6 +6712,15 @@ msgstr "Уваходзіць у: "
 msgid "In conflict with: "
 msgstr "Канфліктуе з: "
 
+msgid "Advanced object info"
+msgstr "Падрабязная інфармацыя"
+
+msgid "map style"
+msgstr "стыль карты"
+
+msgid "edit counts"
+msgstr "колькасць правак"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Кэш стыляў для \"{0}\":"
 
@@ -7502,15 +7496,15 @@ msgstr "Запытаць толькі зачыненыя пакеты права
 msgid "Query both open and closed changesets"
 msgstr "Запытаць адкрытыя і зачыненыя пакеты правак"
 
+msgid "Only changesets owned by myself"
+msgstr "Толькі мае пакеты правак"
+
 msgid "User ID:"
 msgstr "ID карыстальніка:"
 
 msgid "User name:"
 msgstr "Імя карыстальніка:"
 
-msgid "Only changesets owned by myself"
-msgstr "Толькі мае пакеты правак"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Толькі пакеты правак карыстальніка з ідэнтыфікатарам"
 
@@ -9813,6 +9807,13 @@ msgstr "Адмяніць перадачу на сервер"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Неспадзяванае значэнне для ключа ''{0}'' у наладах, атрымана ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+"Запоўніць адзін пакет правак і вярнуцца да Дыялогу перадачы на сервер"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Адкрыць і выкарыстоўваць гэтулькі пакетаў правак, колькі неабходна"
+
 msgid "Please select the upload strategy:"
 msgstr "Калі ласка, абярыце стратэгію перадачы на сервер:"
 
@@ -9832,13 +9833,6 @@ msgstr ""
 "<html>Запатрабуецца <strong>некалькі пакетаў правак</strong>, каб перадаць "
 "{0} аб’ектаў. Якую стратэгію вы жадаеце ўжыць?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-"Запоўніць адзін пакет правак і вярнуцца да Дыялогу перадачы на сервер"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Адкрыць і выкарыстоўваць гэтулькі пакетаў правак, колькі неабходна"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Перадача на сервер за адзін запыт немагчымая (занадта шмат аб’ектаў)"
 
@@ -10641,11 +10635,8 @@ msgstr "Тут няма пластоў здымкаў."
 msgid "No imagery layers"
 msgstr "Няма пластоў здымкаў"
 
-msgid "Velocity, km/h"
-msgstr "Хуткасць, км/г"
-
-msgid "HDOP, m"
-msgstr "HDOP, м"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Час"
@@ -10653,6 +10644,9 @@ msgstr "Час"
 msgid "Direction"
 msgstr "Кірунак"
 
+msgid "Velocity, {0}"
+msgstr "Хуткасць, {0}"
+
 msgid "gps point"
 msgstr "пункт GPS"
 
@@ -10823,15 +10817,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Збой пошуку выявы ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Захаваць маркер доступу ў наладах"
+
 msgid "Access Token Key:"
 msgstr "Ключ маркера доступу:"
 
 msgid "Access Token Secret:"
 msgstr "Крыпта-ключ маркера доступу:"
 
-msgid "Save Access Token in preferences"
-msgstr "Захаваць маркер доступу ў наладах"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12572,6 +12566,12 @@ msgstr "Убудаваная нарыхтоўка"
 msgid "The default preset for JOSM"
 msgstr "Нарыхтоўка па змаўчанні для JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Модуль  {0} выкарыстоўваецца гэтым {1} модулем:"
+msgstr[1] "Модуль  {0} выкарыстоўваецца гэтымі {1}-мя модулямі:"
+msgstr[2] "Модуль  {0} выкарыстоўваецца гэтымі {1}-ю модулямі:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Модуль з пастаўкі JOSM"
 
@@ -12582,12 +12582,6 @@ msgstr ""
 "Націсніце на кнопку <strong>Запампаваць спіс</strong>, каб запампаваць і "
 "паглядзець спіс даступных модуляў."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Модуль  {0} выкарыстоўваецца гэтым {1} модулем:"
-msgstr[1] "Модуль  {0} выкарыстоўваецца гэтымі {1}-мя модулямі:"
-msgstr[2] "Модуль  {0} выкарыстоўваецца гэтымі {1}-ю модулямі:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Версія {1} (усталявана: {2})"
 
@@ -12682,6 +12676,9 @@ msgstr "Рэдагаваць спасылку на апісанне модуля
 msgid "JOSM Plugin description URL"
 msgstr "Спасылка на апісанне модуля JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Інтэрвал абнаўлення (у днях):"
+
 msgid "Ask before updating"
 msgstr "Пытаць перад абнаўленнем"
 
@@ -12698,9 +12695,6 @@ msgstr ""
 "Калі ласка, вырашыце, ці трэба аўтаматычна абнаўляць усталяваныя модулі, "
 "пасля загрузкі новай версіі JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Інтэрвал абнаўлення (у днях):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12816,12 +12810,12 @@ msgstr "Rijksdriehoekscoordinaten (Нідэрланды)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Швецыя)"
 
-msgid "Projection method"
-msgstr "Тып праекцыі"
-
 msgid "Projection code"
 msgstr "Код праекцыі"
 
+msgid "Projection method"
+msgstr "Тып праекцыі"
+
 msgid "Display coordinates as"
 msgstr "Адлюстроўваць каардынаты як"
 
@@ -13079,6 +13073,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Не атрымалася захаваць токен доступу OAuth у мэнэджару ўліковых дадзеных"
 
+msgid "Save to preferences"
+msgstr "Захаваць у наладах"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13091,9 +13088,6 @@ msgid ""
 msgstr ""
 "У Вас ужо ёсць маркер доступу для доступу да сервера OSM з дапамогай OAuth."
 
-msgid "Save to preferences"
-msgstr "Захаваць у наладах"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Націсніце, каб прайсці пакрокавы працэс аўтарызацыі OAuth"
 
@@ -14336,9 +14330,6 @@ msgstr "Адсутнічае патрэбны атрыбут ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Няслушная даўжыня значэння атрыбуту ''{0}''. Атрымана ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} байт прачытана"
-
 msgid "Prepare OSM data..."
 msgstr "Падрыхтоўка дадзеных..."
 
@@ -14456,6 +14447,9 @@ msgstr "Файлы WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Непадтрымоўваны фармат версіі WMS файла; выяўлена {0}, чакалася {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} байт прачытана"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16510,6 +16504,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Карфаген"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Бардо - 2012"
 
@@ -16769,7 +16766,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Літва)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Люксембург Inspire Чыгунка"
@@ -17656,6 +17653,9 @@ msgstr ""
 "З дапамогай гэтага модуля вы можаце ствараць, зачыняць, зноў адкрываць і "
 "каментаваць паведамленні аб памылках."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19726,6 +19726,12 @@ msgstr "па гадзіннікавай стрэлцы"
 msgid "Pedestrian Crossing"
 msgstr "Пешаходны пераход"
 
+msgid "Tactile Paving"
+msgstr "Тактыльнае брукаванне"
+
+msgid "incorrect"
+msgstr "няправільнае"
+
 msgid "In case of traffic signals:"
 msgstr "Пры наяўнасці святлафора:"
 
@@ -19916,6 +19922,9 @@ msgstr "Канава"
 msgid "Kerb"
 msgstr "Бардзюр"
 
+msgid "Tactile paving"
+msgstr "Тактыльнае брукаванне"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Праход ці праезд (праём у перашкодзе)"
 
@@ -20904,12 +20913,6 @@ msgstr "Аўтобусная станцыя"
 msgid "Bus Stop"
 msgstr "Аўтобусны прыпынак"
 
-msgid "Tactile Paving"
-msgstr "Тактыльнае брукаванне"
-
-msgid "incorrect"
-msgstr "няправільнае"
-
 msgid "Bus Platform"
 msgstr "Аўтобусная платформа"
 
@@ -25799,6 +25802,9 @@ msgstr "{0} ужываць не рэкамендуецца. Выкарыстоў
 msgid "questionable key (ending with a number): {0}"
 msgstr "сумнеўны ключ (сканчаецца лікам): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Ключ {0} мае незвычайнае значэнне."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} на кропцы. Павінен выкарыстоўвацца на лініі."
 
@@ -25866,6 +25872,13 @@ msgstr ""
 "Пункт злучае лінію электраперадачы ці кабель з аб''ектам, які не адносіцца "
 "да энергетычнай інфраструктуры."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Водны шлях сканчаецца без злучэння з іншым водным шляхам ці ў яго памылковы "
+"кірунак."
+
 msgid "abbreviated street name"
 msgstr "скарочанае пазначэнне вуліцы"
 
@@ -28207,18 +28220,18 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr "Уключыць/адключыць сталую спампоўку"
 
-msgid "Download Settings"
-msgstr "Параметры загрузкі"
-
-msgid "Settings for the continuous download."
-msgstr "Налады сталай запампоўкі."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Актываваць пастаянную запампоўку пры запуску."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Не паказваць стандартны мадальны індыкатар прагрэсу пры запампоўцы."
 
+msgid "Download Settings"
+msgstr "Параметры загрузкі"
+
+msgid "Settings for the continuous download."
+msgstr "Налады сталай запампоўкі."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29980,6 +29993,9 @@ msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 "Перамяшчацца да месцазнаходжання выявы пры націсканні кнопкак наперад/назад"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Рэжым спампоўкі"
 
@@ -32612,6 +32628,15 @@ msgstr "Адкрыць акно to-fix."
 msgid "Tool:To-fix"
 msgstr "Інструмент: To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Прапусціць"
 
@@ -32627,12 +32652,27 @@ msgstr "Памылка выпраўлена"
 msgid "Not an error"
 msgstr "Не памылка"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Задайце вобласць запампоўкі (м²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "tofix:Прапусціць элемент"
 
@@ -32642,6 +32682,9 @@ msgstr "tofix:Выпраўлены элемент"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Не памылковы элемент"
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Сервер на абслугоўванні"
 
@@ -32655,6 +32698,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Нешта пайшло не так, паспрабуйце яшчэ раз"
 
+msgid "No change to upload!"
+msgstr "Няма зменаў для адсылкі!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Не атрымоўваецца змясціць пункт за межамі свету"
 
diff --git a/i18n/po/bg.po b/i18n/po/bg.po
index 1fc2706..13966ed 100644
--- a/i18n/po/bg.po
+++ b/i18n/po/bg.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-01-16 14:51+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+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"
 "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-05-04 04:37+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:37+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: bg\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3661,9 +3661,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (на ред {0}, колона {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5186,9 +5183,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "слоя не е в списъка."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Слоя ''{0}'' трябва да бъде в списъка от слоеве"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5820,8 +5814,8 @@ msgstr[1] "{0} етикета"
 
 msgid "{0} way"
 msgid_plural "{0} ways"
-msgstr[0] "{0} път"
-msgstr[1] "{0} пътя"
+msgstr[0] "{0} линия"
+msgstr[1] "{0} линии"
 
 msgid "{0} relation"
 msgid_plural "{0} relations"
@@ -5904,15 +5898,15 @@ msgstr "оригинален път"
 msgid "Decision"
 msgstr "Решение"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Прилагане?"
 
@@ -6211,15 +6205,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6309,6 +6294,15 @@ msgstr "Част от: "
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -7029,15 +7023,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr ""
+
 msgid "User ID:"
 msgstr "ID на потребител:"
 
 msgid "User name:"
 msgstr "Име на потребител:"
 
-msgid "Only changesets owned by myself"
-msgstr ""
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -9066,6 +9060,12 @@ msgstr "Прекратяване на качването"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -9083,12 +9083,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9847,18 +9841,18 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
+msgid "HDOP"
 msgstr ""
 
-msgid "HDOP, m"
-msgstr "HDOP, m"
-
 msgid "Time"
 msgstr "Време"
 
 msgid "Direction"
 msgstr "Посока"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "GPS точка"
 
@@ -10012,13 +10006,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11613,6 +11607,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Разширения доставяни с JOSM"
 
@@ -11621,11 +11620,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11710,6 +11704,9 @@ msgstr "Редактиране на URL за разширение на JOSM."
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11724,9 +11721,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11840,12 +11834,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Метод на проекция"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Метод на проекция"
+
 msgid "Display coordinates as"
 msgstr "Показвай координатите като"
 
@@ -12071,6 +12065,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12080,9 +12077,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13212,9 +13206,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Подготовка на OSM данните..."
 
@@ -13326,6 +13317,9 @@ msgstr "файлове WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Неподдъжана WMS файлова версия; намерена {0}, очаквана {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15081,6 +15075,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -16164,6 +16161,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18158,6 +18158,12 @@ msgstr "по часовниковата стрелка"
 msgid "Pedestrian Crossing"
 msgstr "Пешеходна пътека"
 
+msgid "Tactile Paving"
+msgstr "Настилка за слепи хора"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18346,6 +18352,9 @@ msgstr "Канавка"
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Място за преминаване през ограда"
 
@@ -19329,12 +19338,6 @@ msgstr "Автогара"
 msgid "Bus Stop"
 msgstr "Автобусна спирка"
 
-msgid "Tactile Paving"
-msgstr "Настилка за слепи хора"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Автобусна платформа"
 
@@ -24186,6 +24189,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} за точка. Трябва да се ползва за път."
 
@@ -24251,6 +24257,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "съкратено име на улица"
 
@@ -26386,16 +26397,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28079,6 +28090,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30597,6 +30611,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30612,12 +30635,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30627,6 +30665,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30638,6 +30679,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/bn.po b/i18n/po/bn.po
index f01c0f2..326f84b 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:35+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:35+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: bn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3523,9 +3523,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5031,9 +5028,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5748,15 +5742,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6054,15 +6048,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6152,6 +6137,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6870,13 +6864,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8874,6 +8868,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8891,12 +8891,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9638,10 +9632,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9650,6 +9641,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9790,13 +9784,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11360,6 +11354,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11368,11 +11367,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11457,6 +11451,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11471,9 +11468,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11587,10 +11581,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11817,6 +11811,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11826,9 +11823,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12948,9 +12942,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13061,6 +13052,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14800,6 +14794,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15875,6 +15872,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17860,6 +17860,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18048,6 +18054,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19031,12 +19040,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23886,6 +23889,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23951,6 +23957,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26063,16 +26074,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27737,6 +27748,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30242,6 +30256,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30257,12 +30280,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30272,6 +30310,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30283,6 +30324,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/br.po b/i18n/po/br.po
index 5ed01e3..6529e4b 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:36+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:36+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: br\n"
 
 msgid "License"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/bs.po b/i18n/po/bs.po
index aa7fc17..58b2fdb 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:36+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:36+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: bs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3523,9 +3523,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5031,9 +5028,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5748,15 +5742,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6054,15 +6048,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6152,6 +6137,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6870,13 +6864,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8874,6 +8868,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8891,12 +8891,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9638,10 +9632,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9650,6 +9641,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9790,13 +9784,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11360,6 +11354,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11368,11 +11367,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11457,6 +11451,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11471,9 +11468,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11587,10 +11581,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11817,6 +11811,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11826,9 +11823,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12948,9 +12942,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13061,6 +13052,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14800,6 +14794,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15875,6 +15872,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17860,6 +17860,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18048,6 +18054,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19031,12 +19040,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23886,6 +23889,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23951,6 +23957,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26063,16 +26074,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27737,6 +27748,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30242,6 +30256,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30257,12 +30280,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30272,6 +30310,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30283,6 +30324,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ca.po b/i18n/po/ca.po
index d6f837b..0b090f8 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:37+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:37+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ca\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3873,9 +3873,6 @@ msgstr "S''esperava l''element ''{0}'', però s''ha obtingut ''{1}''"
 msgid "value expected"
 msgstr "valor esperat"
 
-msgid " (at line {0}, column {1})"
-msgstr " (a la línia {0}, columna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 "La projecció UTM (''+proj=utm'') requereix el paràmetre ''+zone=...''."
@@ -5492,9 +5489,6 @@ msgstr "El sistema de mesurament ha canviat a {0}"
 msgid "Layer not in list."
 msgstr "La capa no és a la llista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "La capa ''{0}'' ha de ser a la llista de capes"
-
 msgid "Default (open, closed, new)"
 msgstr "Predefinit (obre, tanca, nou)"
 
@@ -6300,17 +6294,17 @@ msgstr "Via original"
 msgid "Decision"
 msgstr "Decisió"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Si us plau, seleccioneu els valors a conservar per a les següents "
-"etiquetes.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Mostra només els conflictes d''etiquetes"
 
 msgid "Show tags with multiple values only"
 msgstr "Mostra només les etiquetes amb varis valors"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Si us plau, seleccioneu els valors a conservar per a les següents "
+"etiquetes.</html>"
+
 msgid "Apply?"
 msgstr "Aplicar?"
 
@@ -6628,15 +6622,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Tancar la finestra de filtre per veure tots els objectes.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informació vançada de l''objecte"
-
-msgid "map style"
-msgstr "estil de mapa"
-
-msgid "edit counts"
-msgstr "recompte d''edicions"
-
 msgid "not in data set"
 msgstr "absent del conjunt de dades"
 
@@ -6726,6 +6711,15 @@ msgstr "Part de: "
 msgid "In conflict with: "
 msgstr "En conflicte amb: "
 
+msgid "Advanced object info"
+msgstr "Informació vançada de l''objecte"
+
+msgid "map style"
+msgstr "estil de mapa"
+
+msgid "edit counts"
+msgstr "recompte d''edicions"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Memòria cau d''estils per  \"{0}\":"
 
@@ -7512,15 +7506,15 @@ msgstr "Consultar només els conjunts de canvis tancats"
 msgid "Query both open and closed changesets"
 msgstr "Consultar els conjunts de canvis oberts i els tancats"
 
+msgid "Only changesets owned by myself"
+msgstr "Només els meus conjunts de canvis"
+
 msgid "User ID:"
 msgstr "Identificador d''usuari:"
 
 msgid "User name:"
 msgstr "Nom d''usuari:"
 
-msgid "Only changesets owned by myself"
-msgstr "Només els meus conjunts de canvis"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Només els conjunts de canvis de l''usuari amb el següent ID"
 
@@ -9789,6 +9783,12 @@ msgstr ""
 "Valor inesperat per a la clau ''{0}'' de les preferències, s''ha obtingut "
 "''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Omplir un conjunt de canvis i tornar a la finestra de pujades"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Obre tants conjunts de canvis com sigui necessari"
+
 msgid "Please select the upload strategy:"
 msgstr "Selecciona una estratègia de pujada:"
 
@@ -9808,12 +9808,6 @@ msgstr ""
 "<html>Hi ha <strong>múltiples conjunts de canvis</strong> necessaris per "
 "pujar {0} objectes. Quina estratègia vols utilitzar?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Omplir un conjunt de canvis i tornar a la finestra de pujades"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Obre tants conjunts de canvis com sigui necessari"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "La pujada en una petició no és possible (hhi ha massa objectes)"
 
@@ -10609,11 +10603,8 @@ msgstr "No hi ha capa d''imatgeria"
 msgid "No imagery layers"
 msgstr "Cap capa d''imatgeria"
 
-msgid "Velocity, km/h"
-msgstr "Velocitat, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Hora"
@@ -10621,6 +10612,9 @@ msgstr "Hora"
 msgid "Direction"
 msgstr "Direcció"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punt GPS"
 
@@ -10786,15 +10780,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Ha fallat la localització la imatge ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Desa el testimoni d''autenticació a les preferències"
+
 msgid "Access Token Key:"
 msgstr "Clau del testimoni d''autenticació:"
 
 msgid "Access Token Secret:"
 msgstr "Secret del testimoni d''autenticació:"
 
-msgid "Save Access Token in preferences"
-msgstr "Desa el testimoni d''autenticació a les preferències"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12584,6 +12578,11 @@ msgstr "Predefincions internes"
 msgid "The default preset for JOSM"
 msgstr "Les predefinicions per defecte del JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "El connector {0} és encara utilitzat per aquest altre"
+msgstr[1] "El connector {0} és encara utilitzat per aquests {1} altres:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Connector empaquetat amb JOSM"
 
@@ -12594,11 +12593,6 @@ msgstr ""
 "Feu clic sobre<strong>Baixar llista</strong> per tal de baixar i mostrar una "
 "llista amb els connectors disponibles."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "El connector {0} és encara utilitzat per aquest altre"
-msgstr[1] "El connector {0} és encara utilitzat per aquests {1} altres:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versió {1} (local: {2})"
 
@@ -12688,6 +12682,9 @@ msgstr "Modificar la descripció de l''URL de connectors del JOSM"
 msgid "JOSM Plugin description URL"
 msgstr "Descripció de l''URL de connectors del JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Interval d''actualització (en dies):"
+
 msgid "Ask before updating"
 msgstr "Preguntar abans d''actualitzar"
 
@@ -12704,9 +12701,6 @@ msgstr ""
 "Decidiu si JOSM ha d''actualitzar automàticament els connectors actius en "
 "iniciar-se després d''una actualització del JOSM"
 
-msgid "Update interval (in days):"
-msgstr "Interval d''actualització (en dies):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12822,12 +12816,12 @@ msgstr "Rijksdriehoekscoördinaten (Països Baixos)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suècia)"
 
-msgid "Projection method"
-msgstr "Mètode de projecció"
-
 msgid "Projection code"
 msgstr "Codi de la projecció"
 
+msgid "Projection method"
+msgstr "Mètode de projecció"
+
 msgid "Display coordinates as"
 msgstr "Mostra les coordenades com"
 
@@ -13088,6 +13082,9 @@ msgstr ""
 "Ha fallat l''emmagatzemament del testimoni d''accés OAuth al gestor de "
 "credencials"
 
+msgid "Save to preferences"
+msgstr "Desar a les preferències"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13101,9 +13098,6 @@ msgstr ""
 "Ja teniu un testimoni d''autenticació per accedir al servidor OSM utilitzant "
 "OAuth."
 
-msgid "Save to preferences"
-msgstr "Desar a les preferències"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Feu clic per seguir el procés d''autorització d''OAuth"
 
@@ -14367,9 +14361,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Valor incorrecte per l''atribut ''{0}'' (conjunt de canvis). El valor és {1}."
 
-msgid "{0} bytes have been read"
-msgstr "han estat llegits {0} bytes"
-
 msgid "Prepare OSM data..."
 msgstr "Preparació de dades..."
 
@@ -14483,6 +14474,9 @@ msgstr "Fitxers WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versió de fitxer WMS no suportada; trobada {0}, esperada {1}"
 
+msgid "{0} bytes have been read"
+msgstr "han estat llegits {0} bytes"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16508,6 +16502,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeus - 2012"
 
@@ -17654,6 +17651,9 @@ msgstr ""
 "connector podreu crear, tancar, invalidar, reobrir i comentar els errors "
 "reportats que es mostren."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19730,6 +19730,12 @@ msgstr "sentit de les agulles del rellotge"
 msgid "Pedestrian Crossing"
 msgstr "Pas de vianants"
 
+msgid "Tactile Paving"
+msgstr "Paviment tàctil"
+
+msgid "incorrect"
+msgstr "incorrecte"
+
 msgid "In case of traffic signals:"
 msgstr "Es el cas de senyals de trànsit:"
 
@@ -19920,6 +19926,9 @@ msgstr "Rasa"
 msgid "Kerb"
 msgstr "Vorada"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrada (Obertura de barrera)"
 
@@ -20913,12 +20922,6 @@ msgstr "Estació d''autobusos"
 msgid "Bus Stop"
 msgstr "Parada d''autobús"
 
-msgid "Tactile Paving"
-msgstr "Paviment tàctil"
-
-msgid "incorrect"
-msgstr "incorrecte"
-
 msgid "Bus Platform"
 msgstr "Andana de l''estació d''autobusos"
 
@@ -25811,6 +25814,9 @@ msgstr "{0} és obsolet. Alternativament utilizeu el prefix de clau {1}."
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} a un node. Ha de ser utilitzat a una via."
 
@@ -25876,6 +25882,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nom abreviat del carrer"
 
@@ -28236,18 +28247,18 @@ msgstr "Baixa dades de mapa continuament en moure''s i ampliar."
 msgid "Toggle the continuous download on/off"
 msgstr "Commuta la descàrrega contínua activada/desactivada"
 
-msgid "Download Settings"
-msgstr "Paràmetres de baixada"
-
-msgid "Settings for the continuous download."
-msgstr "Paràmetre per a la descàrrega contínua"
-
 msgid "Activate continuous downloads at startup."
 msgstr "Activa la descàrrega contínua en iniciar."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Suprimeix el monitor modal de progrés durant una descàrrega."
 
+msgid "Download Settings"
+msgstr "Paràmetres de baixada"
+
+msgid "Settings for the continuous download."
+msgstr "Paràmetre per a la descàrrega contínua"
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30035,6 +30046,9 @@ msgstr "Utilitza un format de 24 hores"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Mou a la ubicació de les fotografies amb els botons següent/previ"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Mode de descàrrega"
 
@@ -32709,6 +32723,15 @@ msgstr "Obre la finestra de correcció"
 msgid "Tool:To-fix"
 msgstr "Eina:A esmenar"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Omet"
 
@@ -32724,12 +32747,27 @@ msgstr "Error esmenat"
 msgid "Not an error"
 msgstr "No és un error"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Selecciona l''àrea a baixar (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "tofix:Omet element"
 
@@ -32739,6 +32777,9 @@ msgstr "tofix:element corregit"
 msgid "tofix:Not a Error item"
 msgstr "tofix:No és un element amb error"
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Servidor de manteniment"
 
@@ -32752,6 +32793,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Alguna cosa ha anat malament, torneu a provar"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "No és possible de posar un node fora del Món."
 
diff --git a/i18n/po/ca at valencia.po b/i18n/po/ca at valencia.po
index 50d6d9a..f7e0925 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:12+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:12+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ca at valencia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3821,9 +3821,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (a la línia {0}, columna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5385,9 +5382,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "La capa no és a la llista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "La capa ''{0}'' ha de ser a la llista de capes"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -6148,17 +6142,17 @@ msgstr "Via original"
 msgid "Decision"
 msgstr "Decisió"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Per favor, seleccioneu els valors a conservar per a les següents "
-"etiquetes.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Mostra només els conflictes d''etiquetes"
 
 msgid "Show tags with multiple values only"
 msgstr "Mostra només les etiquetes amb varis valors"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Per favor, seleccioneu els valors a conservar per a les següents "
+"etiquetes.</html>"
+
 msgid "Apply?"
 msgstr "Aplicar?"
 
@@ -6474,15 +6468,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Tancar la finestra de filtre per veure tots els objectes.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informació vançada de l''objecte"
-
-msgid "map style"
-msgstr "estil de mapa"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "absent del conjunt de dades"
 
@@ -6572,6 +6557,15 @@ msgstr "Part de: "
 msgid "In conflict with: "
 msgstr "En conflicte amb: "
 
+msgid "Advanced object info"
+msgstr "Informació vançada de l''objecte"
+
+msgid "map style"
+msgstr "estil de mapa"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Memòria cau d''estils per  \"{0}\":"
 
@@ -7338,15 +7332,15 @@ msgstr "Consultar només els conjunts de canvis tancats"
 msgid "Query both open and closed changesets"
 msgstr "Consultar els conjunts de canvis oberts i els tancats"
 
+msgid "Only changesets owned by myself"
+msgstr "Només els meus conjunts de canvis"
+
 msgid "User ID:"
 msgstr "Identificador d''usuari:"
 
 msgid "User name:"
 msgstr "Nom d''usuari:"
 
-msgid "Only changesets owned by myself"
-msgstr "Només els meus conjunts de canvis"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Només els conjunts de canvis de l''usuari amb el següent ID"
 
@@ -9616,6 +9610,12 @@ msgstr ""
 "Valor inesperat per a la clau ''{0}'' de les preferències, s''ha obtingut "
 "''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Omplir un conjunt de canvis i tronar a la finestra de pujades"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Obri tants conjunts de canvis com siga necessari"
+
 msgid "Please select the upload strategy:"
 msgstr "Per favor, seleccioneu una estratègia de pujada:"
 
@@ -9635,12 +9635,6 @@ msgstr ""
 "<html>Hi ha <strong>múltiples conjunts de canvis</strong> necessaris per "
 "pujar {0} objectes. Quina estratègia voleu utilitzar?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Omplir un conjunt de canvis i tronar a la finestra de pujades"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Obri tants conjunts de canvis com siga necessari"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "La pujada en una petició no és possible (hhi ha massa objectes)"
 
@@ -10427,10 +10421,7 @@ msgstr "No hi ha capa d''imatgeria"
 msgid "No imagery layers"
 msgstr "Cap capa d''imatgeria"
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10439,6 +10430,9 @@ msgstr "Hora"
 msgid "Direction"
 msgstr "Direcció"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punt GPS"
 
@@ -10604,15 +10598,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Ha fallat la localització la imatge ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Guarda el testimoni d''autenticació a les preferències"
+
 msgid "Access Token Key:"
 msgstr "Clau del testimoni d''autenticació:"
 
 msgid "Access Token Secret:"
 msgstr "Secret del testimoni d''autenticació:"
 
-msgid "Save Access Token in preferences"
-msgstr "Guarda el testimoni d''autenticació a les preferències"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12398,6 +12392,11 @@ msgstr "Predefincions internes"
 msgid "The default preset for JOSM"
 msgstr "Les predefinicions per defecte de JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "El connector {0} és encara utilitzat per este altre"
+msgstr[1] "El connector {0} és encara utilitzat per estos {1} altres:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Connector empaquetat amb JOSM"
 
@@ -12408,11 +12407,6 @@ msgstr ""
 "Per favor, feu clic sobre<strong>Descarregar llista</strong> per tal de "
 "descarregar i mostrar una llista amb els connectors disponibles."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "El connector {0} és encara utilitzat per este altre"
-msgstr[1] "El connector {0} és encara utilitzat per estos {1} altres:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versió {1} (local: {2})"
 
@@ -12504,6 +12498,9 @@ msgstr "Modificar la descripció de la URL de connectors de JOSM"
 msgid "JOSM Plugin description URL"
 msgstr "Descripció de la URL de connectors de JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Interval d''actualització (en dies):"
+
 msgid "Ask before updating"
 msgstr "Preguntar abans d''actualitzar"
 
@@ -12520,9 +12517,6 @@ msgstr ""
 "Per favor, decidiu si JOSM ha d''actualitzar automàticament els connectors "
 "actius en iniciar-se després d''una actualització de JOSM"
 
-msgid "Update interval (in days):"
-msgstr "Interval d''actualització (en dies):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12638,12 +12632,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suècia)"
 
-msgid "Projection method"
-msgstr "Mètode de projecció"
-
 msgid "Projection code"
 msgstr "Codi de la projecció"
 
+msgid "Projection method"
+msgstr "Mètode de projecció"
+
 msgid "Display coordinates as"
 msgstr "Mostra les coordenades com"
 
@@ -12895,6 +12889,9 @@ msgstr ""
 "Ha fallat l''emmagatzemament del testimoni d''accés OAuth al gestor de "
 "credencials"
 
+msgid "Save to preferences"
+msgstr "Guardar a les preferències"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12908,9 +12905,6 @@ msgstr ""
 "Ja teniu un testimoni d''autenticació per accedir al servidor OSM utilitzant "
 "OAuth."
 
-msgid "Save to preferences"
-msgstr "Guardar a les preferències"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Feu clic per seguir el procés d''autorització d''OAuth"
 
@@ -14164,9 +14158,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Valor incorrecte per l''atribut ''{0}'' (conjunt de canvis). El valor és {1}."
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Preparació de dades..."
 
@@ -14280,6 +14271,9 @@ msgstr "Fitxers WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versió de fitxer WMS no suportada; trobada {0}, esperada {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16285,6 +16279,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -17409,6 +17406,9 @@ msgstr ""
 "connector podreu crear, tancar, invalidar, reobrir i comentar els errors "
 "reportats que es mostren."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19453,6 +19453,12 @@ msgstr "sentit de les agulles del rellotge"
 msgid "Pedestrian Crossing"
 msgstr "Pas de vianants"
 
+msgid "Tactile Paving"
+msgstr "Paviment tàctil"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19641,6 +19647,9 @@ msgstr "Rasa"
 msgid "Kerb"
 msgstr "Vorada"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -20627,12 +20636,6 @@ msgstr "Estació d''autobusos"
 msgid "Bus Stop"
 msgstr "Parada d''autobús"
 
-msgid "Tactile Paving"
-msgstr "Paviment tàctil"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Andana de l''estació d''autobusos"
 
@@ -25482,6 +25485,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25547,6 +25553,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nom abreviat del carrer"
 
@@ -27875,16 +27886,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29657,6 +29668,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -32323,6 +32337,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -32338,12 +32361,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32353,6 +32391,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32364,6 +32405,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "No és possible de posar un node fora del Món."
 
diff --git a/i18n/po/cs.po b/i18n/po/cs.po
index c8b7508..ba752e1 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-14 08:20+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-25 06:28+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-05-04 04:38+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:38+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: cs\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3866,9 +3866,6 @@ msgstr "Očekáván prvek ''{0}'', ale obdržen ''{1}''"
 msgid "value expected"
 msgstr "očekávána hodnota"
 
-msgid " (at line {0}, column {1})"
-msgstr " (na řádku {0}, sloupec {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Projekce UTM (''+proj=utm'') požaduje parametr ''+zone=...''."
 
@@ -5449,9 +5446,6 @@ msgstr "Systém měr byl změněn na {0}"
 msgid "Layer not in list."
 msgstr "Vrstva není v seznamu."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Vrstva ''{0}'' musí být v  seznamu vrstev"
-
 msgid "Default (open, closed, new)"
 msgstr "Výchozí (otevřené, zavřené, nové)"
 
@@ -6252,17 +6246,17 @@ msgstr "Orig. cesta"
 msgid "Decision"
 msgstr "Rozhodnutí"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Vyberte, prosím, hodnoty, které chcete ponechat u následujících "
-"značek.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Zobrazit pouze značky s konfliktem"
 
 msgid "Show tags with multiple values only"
 msgstr "Zobrazit pouze značky s více hodnotami"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Vyberte, prosím, hodnoty, které chcete ponechat u následujících "
+"značek.</html>"
+
 msgid "Apply?"
 msgstr "Použít?"
 
@@ -6580,15 +6574,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Chcete-li zobrazit všechny objekty, uzavřete panel Filtr.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Rozšířené informace o objektu"
-
-msgid "map style"
-msgstr "Styl mapy"
-
-msgid "edit counts"
-msgstr "počet editací"
-
 msgid "not in data set"
 msgstr "není v datové sadě"
 
@@ -6679,6 +6664,15 @@ msgstr "Část z: "
 msgid "In conflict with: "
 msgstr "V konfliktu s: "
 
+msgid "Advanced object info"
+msgstr "Rozšířené informace o objektu"
+
+msgid "map style"
+msgstr "Styl mapy"
+
+msgid "edit counts"
+msgstr "počet editací"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Keš stylů pro \"{0}\":"
 
@@ -7443,15 +7437,15 @@ msgstr "Dotazovat se pouze na uzavřené sady změn"
 msgid "Query both open and closed changesets"
 msgstr "Dotazovat se na  otevřené i uzavřené sady změn"
 
+msgid "Only changesets owned by myself"
+msgstr "Pouze sady změn patřící mě"
+
 msgid "User ID:"
 msgstr "id uživatele:"
 
 msgid "User name:"
 msgstr "Uživatelské jméno:"
 
-msgid "Only changesets owned by myself"
-msgstr "Pouze sady změn patřící mě"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Pouze sady změn od uživatele s následujícím id"
 
@@ -9704,6 +9698,12 @@ msgstr "Ukončit nahrávání"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Nalezena neočekávaná hodnota klíče ''{0}'' v nastavení: ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Naplnit jednu sadu změn a vrátit se do dialogu Nahrát data"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Otevírat a používat tolik nových sad změn, kolik bude potřeba"
+
 msgid "Please select the upload strategy:"
 msgstr "Prosím vyberte způsob nahrávání"
 
@@ -9723,12 +9723,6 @@ msgstr ""
 "<html>Je potřeba <strong>několika sad změn</strong>, aby se na server "
 "nahrálo {0} objektů. Jakou strategii chcete zvolit?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Naplnit jednu sadu změn a vrátit se do dialogu Nahrát data"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Otevírat a používat tolik nových sad změn, kolik bude potřeba"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Nahrání v jednom požadavku není možné (příliš mnoho objektů)"
 
@@ -10529,11 +10523,8 @@ msgstr "Nejsou tu žádné podkladové vrstvy."
 msgid "No imagery layers"
 msgstr "Žádné podkladové vrstvy."
 
-msgid "Velocity, km/h"
-msgstr "Rychlost, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Čas"
@@ -10541,6 +10532,9 @@ msgstr "Čas"
 msgid "Direction"
 msgstr "Směr"
 
+msgid "Velocity, {0}"
+msgstr "Rychlost, {0}"
+
 msgid "gps point"
 msgstr "GPS bod"
 
@@ -10708,15 +10702,15 @@ msgstr "Selhalo zpracování stylů kreslení mapy z ''{0}''. Došlo k chybě: {
 msgid "Failed to locate image ''{0}''"
 msgstr "Nepodařilo se nalézt obrázek ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Uložit přístupový token do nastavení"
+
 msgid "Access Token Key:"
 msgstr "Klíč přístupového tokenu:"
 
 msgid "Access Token Secret:"
 msgstr "Heslo přístupového tokenu:"
 
-msgid "Save Access Token in preferences"
-msgstr "Uložit přístupový token do nastavení"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12448,6 +12442,12 @@ msgstr "Interní předvolby"
 msgid "The default preset for JOSM"
 msgstr "Výchozí předvolba pro JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Doplněk {0} je ještě vyžadován tímto doplňkem:"
+msgstr[1] "Doplněk {0} je ještě vyžadován těmito {1} doplňky:"
+msgstr[2] "Doplněk {0} je ještě vyžadován těmito {1} doplňky:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Doplněk je obsažený v JOSM"
 
@@ -12458,12 +12458,6 @@ msgstr ""
 "Prosím, klikněte na <strong>Stáhnout seznam</strong>, aby se stáhl a "
 "zobrazil seznamu dostupných doplňků."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Doplněk {0} je ještě vyžadován tímto doplňkem:"
-msgstr[1] "Doplněk {0} je ještě vyžadován těmito {1} doplňky:"
-msgstr[2] "Doplněk {0} je ještě vyžadován těmito {1} doplňky:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Verze {1} (lokálně: {2})"
 
@@ -12552,6 +12546,9 @@ msgstr "Upravit URL, odkud se dají stahovat doplňky."
 msgid "JOSM Plugin description URL"
 msgstr "URL pro stahování doplňků JOSM."
 
+msgid "Update interval (in days):"
+msgstr "Interval aktualizace (dnů):"
+
 msgid "Ask before updating"
 msgstr "Zeptat se před aktualizací"
 
@@ -12568,9 +12565,6 @@ msgstr ""
 "Prosím, rozhodněte, zda se budou po spuštění novější verze JOSM automaticky "
 "aktualizovat také používané doplňky."
 
-msgid "Update interval (in days):"
-msgstr "Interval aktualizace (dnů):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12686,12 +12680,12 @@ msgstr "Rijksdriehoekscoördinaten (Netherlands)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Švédsko)"
 
-msgid "Projection method"
-msgstr "Metoda projekce"
-
 msgid "Projection code"
 msgstr "Kód projekce"
 
+msgid "Projection method"
+msgstr "Metoda projekce"
+
 msgid "Display coordinates as"
 msgstr "Zobrazovat souřadnice jako"
 
@@ -12947,6 +12941,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Nepodařilo se uložit přístupový token OAuth do správce přihlašovacích údajů."
 
+msgid "Save to preferences"
+msgstr "Uložit do nastavení"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12958,9 +12955,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Již máte přístupový token pro přístup OSM serveru pomocí OAuth."
 
-msgid "Save to preferences"
-msgstr "Uložit do nastavení"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Kliknutím projdete autorizačním procesem OAuth"
 
@@ -14181,9 +14175,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Neplatná číselná hodnota vlastnosti \"{0}\". Přijatá hodnota je \"{1}\""
 
-msgid "{0} bytes have been read"
-msgstr "{0} bajtů bylo načteno"
-
 msgid "Prepare OSM data..."
 msgstr "Připravuji OSM data..."
 
@@ -14298,6 +14289,9 @@ msgstr "WMS soubory (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nepodporovaná verze WMS souboru; nalezeno {0}, očekáváno {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bajtů bylo načteno"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16054,7 +16048,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (Standardní vrstva)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik, černobíle)"
@@ -16332,6 +16326,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -16592,7 +16589,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Lithuania)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Luxembourg Inspire Railway"
@@ -16706,7 +16703,7 @@ msgid "Powiat stalowowolski: Budynki (buildings)"
 msgstr "Powiat stalowowolski: Budynki (buildings)"
 
 msgid "Poznań: Ortofotomapa 2014 (aerial image)"
-msgstr ""
+msgstr "Poznań: Ortofotomapa 2014 (aerial image)"
 
 msgid "Przemyśl: Budynki (buildings)"
 msgstr "Przemyśl: Budynki (buildings)"
@@ -17473,6 +17470,9 @@ msgstr ""
 "Doplněk ukazuje v mapě hlášené chyby ze systému MapDust. Hlášení chyb můžete "
 "tímto doplňkem vytvářet, uzavírat, zneplatňovat, znovu otevírat a komentovat."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19536,6 +19536,12 @@ msgstr "po směru hodinových ručiček"
 msgid "Pedestrian Crossing"
 msgstr "Přechod pro chodce"
 
+msgid "Tactile Paving"
+msgstr "Hmatová dlažba"
+
+msgid "incorrect"
+msgstr "nesprávně"
+
 msgid "In case of traffic signals:"
 msgstr "V případě semaforu:"
 
@@ -19726,6 +19732,9 @@ msgstr "Příkop"
 msgid "Kerb"
 msgstr "Obrubník"
 
+msgid "Tactile paving"
+msgstr "Hmatová dlažba"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Vstup (průchod překážkou)"
 
@@ -20712,12 +20721,6 @@ msgstr "Autobusové nádraží"
 msgid "Bus Stop"
 msgstr "Zastávka autobusu"
 
-msgid "Tactile Paving"
-msgstr "Hmatová dlažba"
-
-msgid "incorrect"
-msgstr "nesprávně"
-
 msgid "Bus Platform"
 msgstr "Nástupiště autobusu"
 
@@ -25600,6 +25603,9 @@ msgstr "{0} je zastaralé. Použijte místo toho  prefix klíče {1}: ."
 msgid "questionable key (ending with a number): {0}"
 msgstr "pochybný klíč (končící číslem): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Klíč {0} má neobvyklou hodnotu."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} na uzlu. Mělo by být použito na cestě."
 
@@ -25667,6 +25673,13 @@ msgstr ""
 "Uzel spojuje vedení napětí nebo kabel s objektem, který nesouvisí s "
 "infrastrukturou napájení."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Vodní cesta končí bez připojení na jinou vodní cestu, nebo je špatně směr "
+"vodního toku."
+
 msgid "abbreviated street name"
 msgstr "zkrácený název ulice"
 
@@ -28001,18 +28014,18 @@ msgstr "Stahovat OSM data kontinuálně při posouvání a zvětšování."
 msgid "Toggle the continuous download on/off"
 msgstr "Zapnout/vypnout kontinuální stahování."
 
-msgid "Download Settings"
-msgstr "Nastavení stahování"
-
-msgid "Settings for the continuous download."
-msgstr "Nastavení pro kontinuální stahování."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Aktivovat kontinuální stahování při startu."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Potlačit při stahování výchozí modální okno průběhu."
 
+msgid "Download Settings"
+msgstr "Nastavení stahování"
+
+msgid "Settings for the continuous download."
+msgstr "Nastavení pro kontinuální stahování."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29785,6 +29798,9 @@ msgstr "Použít 24hodinový formát"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Přesunout se na umístění obrázku tlačítky další/předchozí"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Režim stahování"
 
@@ -32413,6 +32429,15 @@ msgstr "Otevřít okno to-fix"
 msgid "Tool:To-fix"
 msgstr "Nástroj: To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr "Povolit doplněk Tofix"
+
+msgid "Auto delete layer"
+msgstr "Automatické mazání vrstvy"
+
+msgid "Select the checkbox to:"
+msgstr "Zvolte zaškrtávací políčko pro:"
+
 msgid "Skip"
 msgstr "Přeskočit"
 
@@ -32428,12 +32453,27 @@ msgstr "Chyba opravena"
 msgid "Not an error"
 msgstr "Není chybou"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html><a href=\"\">Seznam úkolů</a></html>"
+
+msgid "Select a task ..."
+msgstr "Zvolte úkol..."
+
 msgid "Set download area (m²)"
 msgstr "Nastavit oblast stahování (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Úkoly"
+
+msgid "Config"
+msgstr "Nastavení"
+
+msgid "Activation"
+msgstr "Aktivace"
+
 msgid "tofix:Skip item"
 msgstr "tofix: Přeskočit položku"
 
@@ -32443,6 +32483,9 @@ msgstr "tofix: Opravená položka"
 msgid "tofix:Not a Error item"
 msgstr "tofix: Položka, která není chybou"
 
+msgid "Activate to-fix plugin."
+msgstr "Aktivaci doplňku to-fix."
+
 msgid "Maintenance server"
 msgstr "Server údržby"
 
@@ -32456,6 +32499,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Něco se nepodařilo, zkuste znovu"
 
+msgid "No change to upload!"
+msgstr "Žádná změna pro nahrání na server!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Nemohu umístit uzel mimo svět."
 
diff --git a/i18n/po/cy.po b/i18n/po/cy.po
index e5275d6..c17c172 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:07+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:07+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: cy\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3521,9 +3521,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5029,9 +5026,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5746,15 +5740,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6052,15 +6046,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6150,6 +6135,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6868,13 +6862,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8872,6 +8866,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8889,12 +8889,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9636,10 +9630,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9648,6 +9639,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9788,13 +9782,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11358,6 +11352,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11366,11 +11365,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11455,6 +11449,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11469,9 +11466,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11585,10 +11579,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11815,6 +11809,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11824,9 +11821,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12946,9 +12940,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13059,6 +13050,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14798,6 +14792,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15873,6 +15870,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17858,6 +17858,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18046,6 +18052,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19029,12 +19038,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23884,6 +23887,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23949,6 +23955,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26061,16 +26072,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27735,6 +27746,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30240,6 +30254,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30255,12 +30278,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30270,6 +30308,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30281,6 +30322,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/da.po b/i18n/po/da.po
index 0811db3..e35eec6 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-28 14:41+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-29 17:43+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-05-04 04:38+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:38+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: da_DK\n"
 "X-Poedit-SourceCharset: utf-8\n"
 
@@ -3812,9 +3812,6 @@ msgstr "Forventet element ''{0}'', men fik ''{1}''"
 msgid "value expected"
 msgstr "værdi forventet"
 
-msgid " (at line {0}, column {1})"
-msgstr " (ved linje {0}, kolonne {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM projektion (''+proj=utm'') kræver ''+zone=...'' parameter."
 
@@ -5390,9 +5387,6 @@ msgstr "Målesystem ændret til {0}"
 msgid "Layer not in list."
 msgstr "Lag er ikke i listen"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Lag \"{0}\" skal være i liste over lag"
-
 msgid "Default (open, closed, new)"
 msgstr "Standard (åben, lukket, ny)"
 
@@ -6184,16 +6178,16 @@ msgstr "Orig. vej"
 msgid "Decision"
 msgstr "Beslutning"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Marker de værdier der skal beholdes for de følgende tags.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Vis kun tags med konflikter"
 
 msgid "Show tags with multiple values only"
 msgstr "Vis kun tags med mange værdier"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Marker de værdier der skal beholdes for de følgende tags.</html>"
+
 msgid "Apply?"
 msgstr "Udfør?"
 
@@ -6505,15 +6499,6 @@ msgstr[1] "<b>{0}</b> deaktiverede objekter"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Luk filter-dialogen for at se alle objekter.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Udvidet objekt-information"
-
-msgid "map style"
-msgstr "kortstil"
-
-msgid "edit counts"
-msgstr "rediger tæller"
-
 msgid "not in data set"
 msgstr "ikke i datasæt"
 
@@ -6603,6 +6588,15 @@ msgstr "Del af: "
 msgid "In conflict with: "
 msgstr "I konflikt med: "
 
+msgid "Advanced object info"
+msgstr "Udvidet objekt-information"
+
+msgid "map style"
+msgstr "kortstil"
+
+msgid "edit counts"
+msgstr "rediger tæller"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Stilcache for \"{0}\":"
 
@@ -7369,15 +7363,15 @@ msgstr "Forespørg kun lukkede rettesæt"
 msgid "Query both open and closed changesets"
 msgstr "Forespørg både åbne og lukkede rettesæt"
 
+msgid "Only changesets owned by myself"
+msgstr "Kun rettesæt ejet af mig selv"
+
 msgid "User ID:"
 msgstr "Bruger-ID:"
 
 msgid "User name:"
 msgstr "Brugernavn:"
 
-msgid "Only changesets owned by myself"
-msgstr "Kun rettesæt ejet af mig selv"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Kun rettesæt ejet af brugeren med det følgende brugerID"
 
@@ -9598,6 +9592,12 @@ msgstr "Annuller upload"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Uventet værdi for nøgle ''{0}'' i indstillinger, fik ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Fyld et rettesæt op og returner til upload-dialogen"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Åbn og brug så mange rettesæt som nødvendigt"
+
 msgid "Please select the upload strategy:"
 msgstr "Vælg upload strategien:"
 
@@ -9617,12 +9617,6 @@ msgstr ""
 "<html><strong>Flere rettesæt</strong> er nødvendige for at uploade {0} "
 "objekter. Hvilken strategi ønsker du at bruge?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Fyld et rettesæt op og returner til upload-dialogen"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Åbn og brug så mange rettesæt som nødvendigt"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Upload i en forespørgsel er ikke muligt (for mange objekter at uploade)"
@@ -10410,11 +10404,8 @@ msgstr "Der er ingen billedlag."
 msgid "No imagery layers"
 msgstr "Ingen billedlag"
 
-msgid "Velocity, km/h"
-msgstr "Hastighed, km/t"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Tid"
@@ -10422,6 +10413,9 @@ msgstr "Tid"
 msgid "Direction"
 msgstr "Retning"
 
+msgid "Velocity, {0}"
+msgstr "Hastighed, {0}"
+
 msgid "gps point"
 msgstr "gps-punkt"
 
@@ -10588,15 +10582,15 @@ msgstr "Kunne ikke fortolke korttegningsstile fra ''{0}''. Fejlen var: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Kunne ikke finde billedet \"{0}\""
 
+msgid "Save Access Token in preferences"
+msgstr "Gem adgangsudtryk i indstillinger"
+
 msgid "Access Token Key:"
 msgstr "Adgangsudtryksnøgle:"
 
 msgid "Access Token Secret:"
 msgstr "Adgangsudtrykshemmelighed:"
 
-msgid "Save Access Token in preferences"
-msgstr "Gem adgangsudtryk i indstillinger"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12329,6 +12323,11 @@ msgstr "Intern prædefinition"
 msgid "The default preset for JOSM"
 msgstr "Standard prædefinition for JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Udvidelsen {0} er stadig krævet af denne udvidelse:"
+msgstr[1] "Udvidelsen {0} er stadig krævet af disse {1} udvidelser:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Udvidelse som følger med JOSM"
 
@@ -12339,11 +12338,6 @@ msgstr ""
 "Klik på <strong>Download liste</strong> for at downloade og vise en liste "
 "over tilgængelige udvidelser."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Udvidelsen {0} er stadig krævet af denne udvidelse:"
-msgstr[1] "Udvidelsen {0} er stadig krævet af disse {1} udvidelser:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Version {1} (lokal: {2})"
 
@@ -12432,6 +12426,9 @@ msgstr "Rediger JOSM-udvidelsers beskrivelses-URL."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM’s udvidelsesmodulbeskrivelsesURL"
 
+msgid "Update interval (in days):"
+msgstr "Opdateringsinterval (i dage):"
+
 msgid "Ask before updating"
 msgstr "Spørg før opdatering"
 
@@ -12448,9 +12445,6 @@ msgstr ""
 "Beslut hvorvidt JOSM automatisk skal opdatere aktive udvidelser ved opstart "
 "efter JOSM selv er opdateret."
 
-msgid "Update interval (in days):"
-msgstr "Opdateringsinterval (i dage):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12566,12 +12560,12 @@ msgstr "Rijksdriehoekscoördinaten (Nederlandene)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Sverige)"
 
-msgid "Projection method"
-msgstr "Projektionsmetode"
-
 msgid "Projection code"
 msgstr "Projektionskode"
 
+msgid "Projection method"
+msgstr "Projektionsmetode"
+
 msgid "Display coordinates as"
 msgstr "Vis koordinater som"
 
@@ -12824,6 +12818,9 @@ msgstr "Kunne ikke hente OAuth adgangsudtryk fra legitimationsstyring"
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "Kunne ikke gemme OAuth adgangsudtryk til legitimationsstyring"
 
+msgid "Save to preferences"
+msgstr "Gem i indstillinger"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12836,9 +12833,6 @@ msgid ""
 msgstr ""
 "Du har allerede et adgangsudtryk til at tilgå OSM serveren via OAuth."
 
-msgid "Save to preferences"
-msgstr "Gem i indstillinger"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Klik for at gå igennem OAuth godkendelsesprocessen"
 
@@ -14054,9 +14048,6 @@ msgstr "Manglende påkrævet attribut \"{0}\"."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Ulovlig long værdi af attribut ''{0}''. Fik ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bytes er blevet læst"
-
 msgid "Prepare OSM data..."
 msgstr "Forbereder OSM-data..."
 
@@ -14167,6 +14158,9 @@ msgstr "WMS Filer (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "WMS-filversion ikke understøttet; fandt {0}, forventede {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bytes er blevet læst"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16164,6 +16158,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr "BD Ortho"
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17314,6 +17311,9 @@ msgstr ""
 "lukke, ugyldiggøre, genåbne og kommentere fejlrapporter ved at bruge denne "
 "udvidelse."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr "Tillader brugeren at arbejde med billeder gemt på mapillary.com"
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19377,6 +19377,12 @@ msgstr "med uret"
 msgid "Pedestrian Crossing"
 msgstr "Fodgængerfelt"
 
+msgid "Tactile Paving"
+msgstr "Følbar overflade"
+
+msgid "incorrect"
+msgstr "ukorrekt"
+
 msgid "In case of traffic signals:"
 msgstr "I tilfælde af trafiksignaler:"
 
@@ -19567,6 +19573,9 @@ msgstr "Grøft"
 msgid "Kerb"
 msgstr "Kantsten"
 
+msgid "Tactile paving"
+msgstr "Følbar overflade"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Indgang (Hul i barrierer)"
 
@@ -20556,12 +20565,6 @@ msgstr "Busstation"
 msgid "Bus Stop"
 msgstr "Busstop"
 
-msgid "Tactile Paving"
-msgstr "Følbar overflade"
-
-msgid "incorrect"
-msgstr "ukorrekt"
-
 msgid "Bus Platform"
 msgstr "Bus-platform"
 
@@ -25447,6 +25450,9 @@ msgstr "{0} er forældet. Brug {1}: nøgle præfikset i stedet."
 msgid "questionable key (ending with a number): {0}"
 msgstr "tvivlsom nøgle (slutter med et tal): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Nøglen {0} har en usædvanlig værdi."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} på et punkt. Bør bruges på en vej."
 
@@ -25514,6 +25520,13 @@ msgstr ""
 "Punkt forbinder en højspændingsledning eller kabel med en genstand, der ikke "
 "er relateret til el infrastruktur."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Vandløb ender uden en forbindelse til et andet vandløb eller retningen af "
+"vandløbet er forkert."
+
 msgid "abbreviated street name"
 msgstr "forkortet gadenavn"
 
@@ -27842,18 +27855,18 @@ msgstr "Download kortdata kontinuerligt ved panorering og zooming."
 msgid "Toggle the continuous download on/off"
 msgstr "Slå kontinuerlig download til/fra"
 
-msgid "Download Settings"
-msgstr "Download indstillinger"
-
-msgid "Settings for the continuous download."
-msgstr "Indstillinger for den kontinuerlige download."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Aktiver kontinuerlig download ved opstart."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Undertryk standard dialog med forløb når du downloader."
 
+msgid "Download Settings"
+msgstr "Download indstillinger"
+
+msgid "Settings for the continuous download."
+msgstr "Indstillinger for den kontinuerlige download."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29601,6 +29614,9 @@ msgstr "Brug 24-timers format"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Flyt til billedets placering med næste/forrige knapper"
 
+msgid "Preview images when hovering its icon"
+msgstr "Forhåndsvis billeder når markør er over dets ikon"
+
 msgid "Download mode"
 msgstr "Download tilstand"
 
@@ -32219,6 +32235,15 @@ msgstr "Åbn skal-rettes vindue"
 msgid "Tool:To-fix"
 msgstr "Værktøj:Skal-rettes"
 
+msgid "Enable Tofix plugin"
+msgstr "Aktiver Skal-rettes udvidelse"
+
+msgid "Auto delete layer"
+msgstr "Slet lag automatisk"
+
+msgid "Select the checkbox to:"
+msgstr "Vælg afkrydsningsfeltet for at:"
+
 msgid "Skip"
 msgstr "Spring over"
 
@@ -32234,12 +32259,27 @@ msgstr "Rettet fejl"
 msgid "Not an error"
 msgstr "Ikke en fejl"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html><a href=\"\">Liste over opgaver</a></html>"
+
+msgid "Select a task ..."
+msgstr "Vælg en opgave ..."
+
 msgid "Set download area (m²)"
 msgstr "Sæt download område (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Opgaver"
+
+msgid "Config"
+msgstr "Konfig"
+
+msgid "Activation"
+msgstr "Aktivering"
+
 msgid "tofix:Skip item"
 msgstr "skal-rettes:Spring over emne"
 
@@ -32249,6 +32289,9 @@ msgstr "skal-rettes:Ret emne"
 msgid "tofix:Not a Error item"
 msgstr "skal-rettes:Ikke et fejl emne"
 
+msgid "Activate to-fix plugin."
+msgstr "Aktiver skal-rettes udvidelse."
+
 msgid "Maintenance server"
 msgstr "Vedligeholdelses server"
 
@@ -32262,6 +32305,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Noget gik galt, prøv igen"
 
+msgid "No change to upload!"
+msgstr "Ingen ændring at uploade!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Kan ikke placere et punkt uden for verdenen."
 
diff --git a/i18n/po/de.po b/i18n/po/de.po
index 68c09ef..eab8b06 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 20:07+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-29 18:38+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-05-04 04:43+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:42+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: de\n"
 "X-Poedit-SearchPath-0: .\n"
 "X-Poedit-Basepath: /home/simon/src/josm.all/i18n\n"
@@ -3928,9 +3928,6 @@ msgstr "Erwartetes Element ''{0}'', aber ''{1}'' erhalten"
 msgid "value expected"
 msgstr "Wert erwartet"
 
-msgid " (at line {0}, column {1})"
-msgstr " (Zeile {0}, Spalte {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM-Projektion (''+proj=utm'') erfordert Parameter ''+zone=...''."
 
@@ -5536,9 +5533,6 @@ msgstr "Einheitendarstellung geändert in {0}"
 msgid "Layer not in list."
 msgstr "Ebene nicht in der Liste."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Ebene ''{0}'' muss in der Liste der Ebenen sein"
-
 msgid "Default (open, closed, new)"
 msgstr "Standard (offen, geschlossen, neu)"
 
@@ -6336,17 +6330,17 @@ msgstr "Orig. Linie"
 msgid "Decision"
 msgstr "Entscheidung"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Bitte wählen Sie die Werte, welche für folgende Merkmale behalten "
-"werden sollen.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Nur Merkmale mit Konflikten anzeigen"
 
 msgid "Show tags with multiple values only"
 msgstr "Nur Merkmale mit mehreren Werten anzeigen"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Bitte wählen Sie die Werte, welche für folgende Merkmale behalten "
+"werden sollen.</html>"
+
 msgid "Apply?"
 msgstr "Anwenden?"
 
@@ -6668,15 +6662,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Den Filterdialog schließen, um alle Objekte zu sehen<p></html>"
 
-msgid "Advanced object info"
-msgstr "Erweiterte Objektinformationen"
-
-msgid "map style"
-msgstr "Kartenstil"
-
-msgid "edit counts"
-msgstr "Bearbeitungsanzahl"
-
 msgid "not in data set"
 msgstr "Nicht im Datensatz"
 
@@ -6766,6 +6751,15 @@ msgstr "Teil von: "
 msgid "In conflict with: "
 msgstr "Im Konflikt mit: "
 
+msgid "Advanced object info"
+msgstr "Erweiterte Objektinformationen"
+
+msgid "map style"
+msgstr "Kartenstil"
+
+msgid "edit counts"
+msgstr "Bearbeitungsanzahl"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Stilzwischenspeicher für ''{0}'':"
 
@@ -7552,15 +7546,15 @@ msgstr "Nur nach geschlossenen Änderungssätzen suchen"
 msgid "Query both open and closed changesets"
 msgstr "Nach offenen und geschlossenen Änderungssätzen suchen"
 
+msgid "Only changesets owned by myself"
+msgstr "Nur meine eigenen Änderungssätze"
+
 msgid "User ID:"
 msgstr "Benutzerkennung:"
 
 msgid "User name:"
 msgstr "Benutzername:"
 
-msgid "Only changesets owned by myself"
-msgstr "Nur meine eigenen Änderungssätze"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Nur Änderungssätze vom Nutzer mit der folgenden Benutzerkennung"
 
@@ -9880,6 +9874,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Unerwarteter Wert für Schlüssel ''{0}'' in den Einstellungen: ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Einen Änderungssatz füllen und zurück zum Hochlade-Dialog"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "So viele Änderungssätze öffnen und benutzen, wie nötig sind"
+
 msgid "Please select the upload strategy:"
 msgstr "Bitte die Vorgehensweise wählen:"
 
@@ -9899,12 +9899,6 @@ msgstr ""
 "<html>Es sind <strong>mehrere Änderungssätze</strong> notwendig, um {0} "
 "Objekte hochzuladen. Welche Vorgehensweise wollen Sie nutzen?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Einen Änderungssatz füllen und zurück zum Hochlade-Dialog"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "So viele Änderungssätze öffnen und benutzen, wie nötig sind"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Hochladen in einem Vorgang nicht möglich (zu viele Objekte)"
 
@@ -10697,11 +10691,8 @@ msgstr "Es gibt keine Hintergrundbildebenen."
 msgid "No imagery layers"
 msgstr "Keine Hintergrundbildebenen"
 
-msgid "Velocity, km/h"
-msgstr "Geschwindigkeit, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Dauer"
@@ -10709,6 +10700,9 @@ msgstr "Dauer"
 msgid "Direction"
 msgstr "Richtung"
 
+msgid "Velocity, {0}"
+msgstr "Geschwindigkeit, {0}"
+
 msgid "gps point"
 msgstr "GPS-Punkt"
 
@@ -10878,15 +10872,15 @@ msgstr "Kartenstile in ''{0}'' enthalten Fehler: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Fehler beim Laden des Bildes ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Zugriffkennung in den Einstellungen speichern"
+
 msgid "Access Token Key:"
 msgstr "Schlüssel der Zugriffskennung:"
 
 msgid "Access Token Secret:"
 msgstr "Geheimer Teil der Zugriffskennung:"
 
-msgid "Save Access Token in preferences"
-msgstr "Zugriffkennung in den Einstellungen speichern"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12682,6 +12676,11 @@ msgstr "Interne Objektvorlage"
 msgid "The default preset for JOSM"
 msgstr "Die Standardvorlage von JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Erweiterung {0} wird noch von dieser Erweiterung benötigt:"
+msgstr[1] "Erweiterung {0} wird noch von diesen {1} Erweiterungen benötigt:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Erweiterung mit JOSM ausgeliefert"
 
@@ -12692,11 +12691,6 @@ msgstr ""
 "Klicken Sie auf <strong>Liste herunterladen</strong>, um die aktuelle "
 "Erweiterungsliste herunterzuladen und anzuzeigen."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Erweiterung {0} wird noch von dieser Erweiterung benötigt:"
-msgstr[1] "Erweiterung {0} wird noch von diesen {1} Erweiterungen benötigt:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Version {1} (lokal: {2})"
 
@@ -12794,6 +12788,9 @@ msgstr "JOSM-Erweiterungsbeschreibungs-URL bearbeiten."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM-Erweiterungsbeschreibungs-URL"
 
+msgid "Update interval (in days):"
+msgstr "Aktualisierungsintervall (in Tagen):"
+
 msgid "Ask before updating"
 msgstr "Vor Aktualisierung fragen"
 
@@ -12810,9 +12807,6 @@ msgstr ""
 "Bitte entscheiden Sie, ob JOSM aktive Erweiterungen nach der Aktualisierung "
 "von JOSM beim Start automatisch aktualisieren soll."
 
-msgid "Update interval (in days):"
-msgstr "Aktualisierungsintervall (in Tagen):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12928,12 +12922,12 @@ msgstr "Reichsdreieckskoordinaten (Niederlande)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Schweden)"
 
-msgid "Projection method"
-msgstr "Projektionsmethode"
-
 msgid "Projection code"
 msgstr "Projektionsbezeichnung"
 
+msgid "Projection method"
+msgstr "Projektionsmethode"
+
 msgid "Display coordinates as"
 msgstr "Koordinaten anzeigen als"
 
@@ -13194,6 +13188,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Speichern der OAuth-Zugangsmarke beim Berechtigungsverwalter fehlgeschlagen."
 
+msgid "Save to preferences"
+msgstr "Einstellungen speichern"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13207,9 +13204,6 @@ msgstr ""
 "Es gibt bereits eine Zugriffskennung für den Zugriff mittels OAuth auf den "
 "OSM-Server."
 
-msgid "Save to preferences"
-msgstr "Einstellungen speichern"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Den OAuth-Autorisierungsprozess starten"
 
@@ -14487,9 +14481,6 @@ msgstr "Fehlendes erforderliches Attribut \"{0}\"."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Ungültiger langer Wert \"{1}\" für das Attribut ''{0}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} Bytes wurden gelesen"
-
 msgid "Prepare OSM data..."
 msgstr "OSM-Daten werden vorbereitet …"
 
@@ -14608,6 +14599,9 @@ msgstr "WMS-Dateien (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "WMS-Datei-Version nicht unterstützt; gefunden {0}, erwartet {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} Bytes wurden gelesen"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16663,6 +16657,9 @@ msgstr "BANO (Französische Adressen unter offener Lizenz)"
 msgid "BD Carthage"
 msgstr "BD Carthage (französisches Flussnetz)"
 
+msgid "BD Ortho"
+msgstr "BD Ortho"
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17818,6 +17815,11 @@ msgstr ""
 "Mithilfe dieser Erweiterung können Sie Fehlerberichte erstellen, schließen, "
 "wiedereröffnen und kommentieren."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+"Ermöglicht dem Benutzer das Arbeiten mit von mapillary.com bereitgestellten "
+"Bildern"
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19894,6 +19896,12 @@ msgstr "Im Uhrzeigersinn"
 msgid "Pedestrian Crossing"
 msgstr "Fußgängerüberweg"
 
+msgid "Tactile Paving"
+msgstr "Blindenleitbelag"
+
+msgid "incorrect"
+msgstr "fehlerhaft"
+
 msgid "In case of traffic signals:"
 msgstr "Bei Ampeln:"
 
@@ -20084,6 +20092,9 @@ msgstr "Wassergraben"
 msgid "Kerb"
 msgstr "Bordstein"
 
+msgid "Tactile paving"
+msgstr "Ertastbares Pflaster"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Eingang (Barrierenöffnung)"
 
@@ -21076,12 +21087,6 @@ msgstr "Busbahnhof"
 msgid "Bus Stop"
 msgstr "Bushaltestelle"
 
-msgid "Tactile Paving"
-msgstr "Blindenleitbelag"
-
-msgid "incorrect"
-msgstr "fehlerhaft"
-
 msgid "Bus Platform"
 msgstr "Bussteig"
 
@@ -23919,31 +23924,31 @@ msgstr "Anzahl der Leiterseile pro Leiter"
 
 msgctxt "power"
 msgid "single"
-msgstr "single"
+msgstr "1 – einfach"
 
 msgctxt "power"
 msgid "double"
-msgstr "doppelt"
+msgstr "2 – zweifach"
 
 msgctxt "power"
 msgid "triple"
-msgstr "dreifach"
+msgstr "3 – dreifach"
 
 msgctxt "power"
 msgid "quad"
-msgstr "vierfach"
+msgstr "4 – vierfach"
 
 msgctxt "power"
 msgid "fivefold"
-msgstr "fünffach"
+msgstr "5 – fünffach"
 
 msgctxt "power"
 msgid "sixfold"
-msgstr "sechsfach"
+msgstr "6 – sechsfach"
 
 msgctxt "power"
 msgid "eightfold"
-msgstr "achtfach"
+msgstr "8 – achtfach"
 
 msgid "Used for data communications"
 msgstr "Wird für Datenkommunikation genutzt"
@@ -25979,6 +25984,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr "fragwürdiger Schlüssel (endet mit einer Zahl): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Der Schlüssel {0} hat einen ungewöhnlichen Wert."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} auf einem Punkt. Sollte auf einer Linie verwendet werden."
 
@@ -26046,6 +26054,13 @@ msgstr ""
 "Punkt verbindet eine Stromleitung oder Stromkabel mit einem Objekt, welches "
 "nicht zur Strominfrastruktur gehört."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Wasserweg endet ohne einer Verbindung zu einem anderen Wasserweg oder die "
+"Richtung des Wasserwegs ist falsch."
+
 msgid "abbreviated street name"
 msgstr "Abgekürzter Straßenname"
 
@@ -28407,12 +28422,6 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr "Kontinuierliches Herunterladen ein-/ausschalten"
 
-msgid "Download Settings"
-msgstr "Herunterladeeinstellungen"
-
-msgid "Settings for the continuous download."
-msgstr "Einstellungen für das kontinuierliche Herunterladen."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Kontinuierliches Herunterladen beim Start aktivieren."
 
@@ -28420,6 +28429,12 @@ msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 "Standardmäßige modale Fortschrittsanzeige beim Herunterladen unterdrücken."
 
+msgid "Download Settings"
+msgstr "Herunterladeeinstellungen"
+
+msgid "Settings for the continuous download."
+msgstr "Einstellungen für das kontinuierliche Herunterladen."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30202,6 +30217,9 @@ msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 "Wechseln Sie zur Bildadresse mit den nächstes/vorheriges Schaltflächen"
 
+msgid "Preview images when hovering its icon"
+msgstr "Beim Überfahen des Symbols Vorschaubilder anzeigen"
+
 msgid "Download mode"
 msgstr "Herunterlademodus"
 
@@ -32863,6 +32881,15 @@ msgstr "To-fix-Fenster öffnen."
 msgid "Tool:To-fix"
 msgstr "Werkzeug:To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr "Tofix-Plugin aktivieren"
+
+msgid "Auto delete layer"
+msgstr "Ebene automatisch löschen"
+
+msgid "Select the checkbox to:"
+msgstr "Wählen Sie das Kontrollkästchen dafür aus:"
+
 msgid "Skip"
 msgstr "Überspringen"
 
@@ -32878,12 +32905,27 @@ msgstr "Behobener Fehler"
 msgid "Not an error"
 msgstr "Kein Fehler"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html><a href=\"\">Liste der Aufgaben</a></html>"
+
+msgid "Select a task ..."
+msgstr "Aufgabe auswählen ..."
+
 msgid "Set download area (m²)"
 msgstr "Herunterladebereich festlegen (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Aufgaben"
+
+msgid "Config"
+msgstr "Konfiguration"
+
+msgid "Activation"
+msgstr "Aktivierung"
+
 msgid "tofix:Skip item"
 msgstr "tofix:Element überspringen"
 
@@ -32893,6 +32935,9 @@ msgstr "tofix:Behobenes Element"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Kein Fehler-Element"
 
+msgid "Activate to-fix plugin."
+msgstr "To-fix-Plugin aktivieren"
+
 msgid "Maintenance server"
 msgstr "Wartungsserver"
 
@@ -32907,6 +32952,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Etwas ging schief, versuchen Sie es noch einmal"
 
+msgid "No change to upload!"
+msgstr "Keine Änderung zum Hochladen!"
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 "Ein Punkt kann nicht außerhalb des heruntergeladenen Bereichs platziert "
diff --git a/i18n/po/de_DE.po b/i18n/po/de_DE.po
index 8cf24d9..0348dbf 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:10+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:10+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3529,9 +3529,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5037,9 +5034,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5754,15 +5748,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6060,15 +6054,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6158,6 +6143,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6876,13 +6870,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8880,6 +8874,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8897,12 +8897,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9644,10 +9638,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9656,6 +9647,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9796,13 +9790,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11366,6 +11360,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11374,11 +11373,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11463,6 +11457,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11477,9 +11474,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11593,10 +11587,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11823,6 +11817,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11832,9 +11829,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12954,9 +12948,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13067,6 +13058,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14809,6 +14803,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15884,6 +15881,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17869,6 +17869,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18057,6 +18063,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19040,12 +19049,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23895,6 +23898,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23960,6 +23966,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26076,16 +26087,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27750,6 +27761,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30255,6 +30269,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30270,12 +30293,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30285,6 +30323,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30296,6 +30337,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/el.po b/i18n/po/el.po
index 3bd0c22..da8b3a6 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:44+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:44+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: el\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3707,9 +3707,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (στη γραμμή {0}, στήλη {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5247,9 +5244,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "το επίπεδο δεν είναι στη λίστα."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Το επίπεδο ''{0}'' πρέπει να είναι στη λίστα των επιπέδων"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5975,17 +5969,17 @@ msgstr ""
 msgid "Decision"
 msgstr "Απόφαση"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Παρακαλώ επιλέξτε τις τιμές που θα διατηρηθούν για τις ακόλουθες "
-"ετικέτες.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Εμφάνιση ετικετών με συγκρούσεις μόνο"
 
 msgid "Show tags with multiple values only"
 msgstr "Εμφάνιση ετικετών με πολλαπλές τιμές μόνο"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Παρακαλώ επιλέξτε τις τιμές που θα διατηρηθούν για τις ακόλουθες "
+"ετικέτες.</html>"
+
 msgid "Apply?"
 msgstr "Εφαρμογή;"
 
@@ -6291,15 +6285,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Κλείσιμο διαλόγου φίλτρου για προβολή όλων των αντικειμένων.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Προχωρημένες πληροφορίες αντικειμένου"
-
-msgid "map style"
-msgstr "στυλ χάρτη"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6389,6 +6374,15 @@ msgstr "Μέρος του: "
 msgid "In conflict with: "
 msgstr "Σε διένεξη με: "
 
+msgid "Advanced object info"
+msgstr "Προχωρημένες πληροφορίες αντικειμένου"
+
+msgid "map style"
+msgstr "στυλ χάρτη"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -7122,15 +7116,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr "Μόνο ομάδες αλλαγών που ανήκουν σε εμένα"
+
 msgid "User ID:"
 msgstr "Αναγνωριστικό χρήστη:"
 
 msgid "User name:"
 msgstr "Όνομα χρήστη:"
 
-msgid "Only changesets owned by myself"
-msgstr "Μόνο ομάδες αλλαγών που ανήκουν σε εμένα"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Μόνο ομάδες αλλαγών που ανήκουν στον χρήστη με το παρακάτω αναγνωριστικό"
@@ -9193,6 +9187,12 @@ msgstr "Ακύρωση αποστολής"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr "Παρακαλώ επιλέξτε την στρατηγική αποστολής:"
 
@@ -9210,12 +9210,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Η αποστολή με ένα αίτημα είναι αδύνατη (Πολλά αντικείμενα προς αποστολή)"
@@ -9960,10 +9954,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9972,6 +9963,9 @@ msgstr "Ώρα"
 msgid "Direction"
 msgstr "Κατεύθυνση"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "σημείο gps"
 
@@ -10117,13 +10111,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11706,6 +11700,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Πρόσθετα που έρχονται με το JOSM"
 
@@ -11714,11 +11713,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Έκδοση {1} (τοπικά: {2})"
 
@@ -11806,6 +11800,9 @@ msgstr "Επεξεργασία URL περιγραφής  πρόσθετου το
 msgid "JOSM Plugin description URL"
 msgstr "URL περιγραφής πρόσθετου του JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Διάστημα ενημέρωσης (ημέρες)"
+
 msgid "Ask before updating"
 msgstr "Ερώτηση πριν την ενημέρωση"
 
@@ -11822,9 +11819,6 @@ msgstr ""
 "Παρακαλώ αποφασίστε αν ο JOSM θα ενημερώνει αυτόματα τα ενεργά πρόσθετα κατά "
 "την εκκίνηση μετά από ενημέρωση του ίδιου του JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Διάστημα ενημέρωσης (ημέρες)"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11938,12 +11932,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Μέθοδος προβολής"
-
 msgid "Projection code"
 msgstr "Κωδικός Προβολής"
 
+msgid "Projection method"
+msgstr "Μέθοδος προβολής"
+
 msgid "Display coordinates as"
 msgstr "Εμφάνιση συντεταγμένων ως"
 
@@ -12169,6 +12163,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12178,9 +12175,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13313,9 +13307,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Προετοιμασία δεδομένων OSM..."
 
@@ -13428,6 +13419,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Μη υποστηριζόμενη έκδοση αρχείου WMS΄ βρέθηκε {0}, αναμενόταν {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15196,6 +15190,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16271,6 +16268,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18259,6 +18259,12 @@ msgstr "δεξιόστροφα"
 msgid "Pedestrian Crossing"
 msgstr "Διάβαση Πεζών"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18447,6 +18453,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19430,12 +19439,6 @@ msgstr "Σταθμός λεωφορείων"
 msgid "Bus Stop"
 msgstr "Στάση λεωφορείου"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -24285,6 +24288,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24350,6 +24356,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26471,16 +26482,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28165,6 +28176,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30675,6 +30689,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30690,12 +30713,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30705,6 +30743,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30716,6 +30757,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Δεν μπορεί να τοποθετηθεί κόμβος εκτός κόσμου."
 
diff --git a/i18n/po/en_AU.po b/i18n/po/en_AU.po
index fee0cff..4a3797a 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:08+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:09+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3778,9 +3778,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (at line {0}, column {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5342,9 +5339,6 @@ msgstr "System of measurement changed to {0}"
 msgid "Layer not in list."
 msgstr "layer not in list."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Layer ''{0}'' must be in list of layers"
-
 msgid "Default (open, closed, new)"
 msgstr "Default (open, closed, new)"
 
@@ -6117,16 +6111,16 @@ msgstr "Orig. Way"
 msgid "Decision"
 msgstr "Decision"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Please select the values to keep for the following tags.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Show tags with conflicts only"
 
 msgid "Show tags with multiple values only"
 msgstr "Show tags with multiple values only"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Please select the values to keep for the following tags.</html>"
+
 msgid "Apply?"
 msgstr "Apply?"
 
@@ -6437,15 +6431,6 @@ msgstr[1] "<b>{0}</b> objects disabled"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Close the filter dialogue to see all objects.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Advanced object info"
-
-msgid "map style"
-msgstr "map style"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "not in data set"
 
@@ -6535,6 +6520,15 @@ msgstr "Part of: "
 msgid "In conflict with: "
 msgstr "In conflict with: "
 
+msgid "Advanced object info"
+msgstr "Advanced object info"
+
+msgid "map style"
+msgstr "map style"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Styles Cache for \"{0}\":"
 
@@ -7285,15 +7279,15 @@ msgstr "Query closed changesets only"
 msgid "Query both open and closed changesets"
 msgstr "Query both open and closed changesets"
 
+msgid "Only changesets owned by myself"
+msgstr "Only changesets owned by myself"
+
 msgid "User ID:"
 msgstr "User ID:"
 
 msgid "User name:"
 msgstr "User name:"
 
-msgid "Only changesets owned by myself"
-msgstr "Only changesets owned by myself"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Only changesets owned by the user with the following user ID"
 
@@ -9498,6 +9492,12 @@ msgstr "Cancel uploading"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Fill up one changeset and return to the Upload Dialogue"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Open and use as many new changesets as necessary"
+
 msgid "Please select the upload strategy:"
 msgstr "Please select the upload strategy:"
 
@@ -9517,12 +9517,6 @@ msgstr ""
 "<html>There are <strong>multiple changesets</strong> necessary in order to "
 "upload {0} objects. Which strategy do you want to use?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Fill up one changeset and return to the Upload Dialogue"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Open and use as many new changesets as necessary"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Upload in one request not possible (too many objects to upload)"
 
@@ -10300,11 +10294,8 @@ msgstr "There are no imagery layers."
 msgid "No imagery layers"
 msgstr "No imagery layers"
 
-msgid "Velocity, km/h"
-msgstr "Velocity, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Time"
@@ -10312,6 +10303,9 @@ msgstr "Time"
 msgid "Direction"
 msgstr "Direction"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps point"
 
@@ -10473,15 +10467,15 @@ msgstr "Failed to parse Mappaint styles from ''{0}''. Error was: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
+msgid "Save Access Token in preferences"
+msgstr "Save Access Token in preferences"
+
 msgid "Access Token Key:"
 msgstr "Access Token Key:"
 
 msgid "Access Token Secret:"
 msgstr "Access Token Secret:"
 
-msgid "Save Access Token in preferences"
-msgstr "Save Access Token in preferences"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12150,6 +12144,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plug-in bundled with JOSM"
 
@@ -12160,11 +12159,6 @@ msgstr ""
 "Please click on <strong>Download list</strong> to download and display a "
 "list of available plug-ins."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Version {1} (local: {2})"
 
@@ -12255,6 +12249,9 @@ msgstr "Edit JOSM Plug-in description URL."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM Plug-in description URL"
 
+msgid "Update interval (in days):"
+msgstr "Update interval (in days):"
+
 msgid "Ask before updating"
 msgstr "Ask before updating"
 
@@ -12271,9 +12268,6 @@ msgstr ""
 "Please decide whether JOSM shall automatically update active plug-ins at "
 "startup after an update of JOSM itself."
 
-msgid "Update interval (in days):"
-msgstr "Update interval (in days):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12387,12 +12381,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Projection method"
-
 msgid "Projection code"
 msgstr "Projection code"
 
+msgid "Projection method"
+msgstr "Projection method"
+
 msgid "Display coordinates as"
 msgstr "Display coordinates as"
 
@@ -12630,6 +12624,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "Save to preferences"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12642,9 +12639,6 @@ msgid ""
 msgstr ""
 "You already have an Access Token to access the OSM server using OAuth."
 
-msgid "Save to preferences"
-msgstr "Save to preferences"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Click to step through the OAuth authorisation process"
 
@@ -13811,9 +13805,6 @@ msgstr "Missing required attribute ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Illegal long value for attribute ''{0}''. Got ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Prepare OSM data..."
 
@@ -13925,6 +13916,9 @@ msgstr "WMS Files (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Unsupported WMS file version; found {0}, expected {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15760,6 +15754,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16847,6 +16844,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18850,6 +18850,12 @@ msgstr "clockwise"
 msgid "Pedestrian Crossing"
 msgstr "Pedestrian Crossing"
 
+msgid "Tactile Paving"
+msgstr "Tactile Paving"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19038,6 +19044,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -20021,12 +20030,6 @@ msgstr "Bus Station"
 msgid "Bus Stop"
 msgstr "Bus Stop"
 
-msgid "Tactile Paving"
-msgstr "Tactile Paving"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Bus Platform"
 
@@ -24876,6 +24879,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24941,6 +24947,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -27102,16 +27113,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28791,6 +28802,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31308,6 +31322,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31323,12 +31346,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31338,6 +31376,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31349,6 +31390,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Cannot place a node outside of the world."
 
diff --git a/i18n/po/en_CA.po b/i18n/po/en_CA.po
index a48c1ce..373e747 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:10+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:11+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3526,9 +3526,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5034,9 +5031,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5751,15 +5745,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6057,15 +6051,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6155,6 +6140,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6873,13 +6867,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8877,6 +8871,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8894,12 +8894,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9641,10 +9635,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9653,6 +9644,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9793,13 +9787,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11363,6 +11357,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11371,11 +11370,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11460,6 +11454,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11474,9 +11471,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11590,10 +11584,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11820,6 +11814,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11829,9 +11826,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12951,9 +12945,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13064,6 +13055,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14803,6 +14797,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15878,6 +15875,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17863,6 +17863,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18051,6 +18057,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19034,12 +19043,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23889,6 +23892,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23954,6 +23960,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26066,16 +26077,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27740,6 +27751,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30245,6 +30259,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30260,12 +30283,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30275,6 +30313,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30286,6 +30327,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/en_GB.po b/i18n/po/en_GB.po
index 59621a6..9276caf 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-28 14:30+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-24 13:29+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-05-04 05:08+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:08+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: de\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3790,9 +3790,6 @@ msgstr "Expected element ''{0}'', but got ''{1}''"
 msgid "value expected"
 msgstr "value expected"
 
-msgid " (at line {0}, column {1})"
-msgstr " (at line {0}, column {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 
@@ -5357,9 +5354,6 @@ msgstr "System of measurement changed to {0}"
 msgid "Layer not in list."
 msgstr "layer not in list."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Layer ''{0}'' must be in list of layers"
-
 msgid "Default (open, closed, new)"
 msgstr "Default (open, closed, new)"
 
@@ -6136,16 +6130,16 @@ msgstr "Orig. Way"
 msgid "Decision"
 msgstr "Decision"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Please select the values to keep for the following tags.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Show tags with conflicts only"
 
 msgid "Show tags with multiple values only"
 msgstr "Show tags with multiple values only"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Please select the values to keep for the following tags.</html>"
+
 msgid "Apply?"
 msgstr "Apply?"
 
@@ -6456,15 +6450,6 @@ msgstr[1] "<b>{0}</b> objects disabled"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Close the filter dialogue to see all objects.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Advanced object info"
-
-msgid "map style"
-msgstr "map style"
-
-msgid "edit counts"
-msgstr "edit counts"
-
 msgid "not in data set"
 msgstr "not in data set"
 
@@ -6554,6 +6539,15 @@ msgstr "Part of: "
 msgid "In conflict with: "
 msgstr "In conflict with: "
 
+msgid "Advanced object info"
+msgstr "Advanced object info"
+
+msgid "map style"
+msgstr "map style"
+
+msgid "edit counts"
+msgstr "edit counts"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Styles Cache for \"{0}\":"
 
@@ -7318,15 +7312,15 @@ msgstr "Query closed changesets only"
 msgid "Query both open and closed changesets"
 msgstr "Query both open and closed changesets"
 
+msgid "Only changesets owned by myself"
+msgstr "Only changesets owned by myself"
+
 msgid "User ID:"
 msgstr "User ID:"
 
 msgid "User name:"
 msgstr "User name:"
 
-msgid "Only changesets owned by myself"
-msgstr "Only changesets owned by myself"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Only changesets owned by the user with the following user ID"
 
@@ -9538,6 +9532,12 @@ msgstr "Cancel uploading"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Fill up one changeset and return to the Upload dialogue"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Open and use as many new changesets as necessary"
+
 msgid "Please select the upload strategy:"
 msgstr "Please select the upload strategy:"
 
@@ -9557,12 +9557,6 @@ msgstr ""
 "<html>There are <strong>multiple changesets</strong> necessary in order to "
 "upload {0} objects. Which strategy do you want to use?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Fill up one changeset and return to the Upload dialogue"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Open and use as many new changesets as necessary"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Upload in one request not possible (too many objects to upload)"
 
@@ -10348,11 +10342,8 @@ msgstr "There are no imagery layers."
 msgid "No imagery layers"
 msgstr "No imagery layers"
 
-msgid "Velocity, km/h"
-msgstr "Velocity, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Time"
@@ -10360,6 +10351,9 @@ msgstr "Time"
 msgid "Direction"
 msgstr "Direction"
 
+msgid "Velocity, {0}"
+msgstr "Velocity, {0}"
+
 msgid "gps point"
 msgstr "gps point"
 
@@ -10523,15 +10517,15 @@ msgstr "Failed to parse Mappaint styles from ''{0}''. Error was: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Failed to locate image ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Save Access Token in preferences"
+
 msgid "Access Token Key:"
 msgstr "Access Token Key:"
 
 msgid "Access Token Secret:"
 msgstr "Access Token Secret:"
 
-msgid "Save Access Token in preferences"
-msgstr "Save Access Token in preferences"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12251,6 +12245,11 @@ msgstr "Internal preset"
 msgid "The default preset for JOSM"
 msgstr "The default preset for JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Plugin {0} is still required by this plugin:"
+msgstr[1] "Plugin {0} is still required by these {1} plugins:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plug-in bundled with JOSM"
 
@@ -12261,11 +12260,6 @@ msgstr ""
 "Please click on <strong>Download list</strong> to download and display a "
 "list of available plug-ins."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Plugin {0} is still required by this plugin:"
-msgstr[1] "Plugin {0} is still required by these {1} plugins:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Version {1} (local: {2})"
 
@@ -12356,6 +12350,9 @@ msgstr "Edit JOSM Plug-in description URL."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM Plug-in description URL"
 
+msgid "Update interval (in days):"
+msgstr "Update interval (in days):"
+
 msgid "Ask before updating"
 msgstr "Ask before updating"
 
@@ -12372,9 +12369,6 @@ msgstr ""
 "Please decide whether JOSM shall automatically update active plug-ins at "
 "startup after an update of JOSM itself."
 
-msgid "Update interval (in days):"
-msgstr "Update interval (in days):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12490,12 +12484,12 @@ msgstr "Rijksdriehoekscoördinaten (Netherlands)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 
-msgid "Projection method"
-msgstr "Projection method"
-
 msgid "Projection code"
 msgstr "Projection code"
 
+msgid "Projection method"
+msgstr "Projection method"
+
 msgid "Display coordinates as"
 msgstr "Display coordinates as"
 
@@ -12743,6 +12737,9 @@ msgstr "Failed to retrieve OAuth Access Token from credential manager"
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "Failed to store OAuth Access Token to credentials manager"
 
+msgid "Save to preferences"
+msgstr "Save to preferences"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12755,9 +12752,6 @@ msgid ""
 msgstr ""
 "You already have an Access Token to access the OSM server using OAuth."
 
-msgid "Save to preferences"
-msgstr "Save to preferences"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Click to step through the OAuth authorisation process"
 
@@ -13971,9 +13965,6 @@ msgstr "Missing required attribute ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Illegal long value for attribute ''{0}''. Got ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bytes have been read"
-
 msgid "Prepare OSM data..."
 msgstr "Prepare OSM data..."
 
@@ -14085,6 +14076,9 @@ msgstr "WMS Files (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Unsupported WMS file version; found {0}, expected {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bytes have been read"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16071,6 +16065,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17208,6 +17205,9 @@ msgstr ""
 "create, close, invalidate, re-open and comment bug reports by using this "
 "plugin."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19267,6 +19267,12 @@ msgstr "clockwise"
 msgid "Pedestrian Crossing"
 msgstr "Pedestrian Crossing"
 
+msgid "Tactile Paving"
+msgstr "Tactile Paving"
+
+msgid "incorrect"
+msgstr "incorrect"
+
 msgid "In case of traffic signals:"
 msgstr "In case of traffic signals:"
 
@@ -19457,6 +19463,9 @@ msgstr "Ditch"
 msgid "Kerb"
 msgstr "Kerb"
 
+msgid "Tactile paving"
+msgstr "Tactile paving"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrance (barrier opening)"
 
@@ -20446,12 +20455,6 @@ msgstr "Bus Station"
 msgid "Bus Stop"
 msgstr "Bus Stop"
 
-msgid "Tactile Paving"
-msgstr "Tactile Paving"
-
-msgid "incorrect"
-msgstr "incorrect"
-
 msgid "Bus Platform"
 msgstr "Bus Platform"
 
@@ -25339,6 +25342,9 @@ msgstr "{0} is deprecated. Use the {1}: key prefix instead."
 msgid "questionable key (ending with a number): {0}"
 msgstr "questionable key (ending with a number): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "The key {0} has an uncommon value."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} on a node. Should be used on a way."
 
@@ -25406,6 +25412,13 @@ msgstr ""
 "Node connects a power line or cable with an object which is not related to "
 "the power infrastructure."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+
 msgid "abbreviated street name"
 msgstr "abbreviated street name"
 
@@ -27717,18 +27730,18 @@ msgstr "Download map data continuously when paning and zooming."
 msgid "Toggle the continuous download on/off"
 msgstr "Toggle the continuous download on/off"
 
-msgid "Download Settings"
-msgstr "Download Settings"
-
-msgid "Settings for the continuous download."
-msgstr "Settings for the continuous download."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Activate continuous downloads at startup."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Supress the default modal progress monitor when downloading."
 
+msgid "Download Settings"
+msgstr "Download Settings"
+
+msgid "Settings for the continuous download."
+msgstr "Settings for the continuous download."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29480,6 +29493,9 @@ msgstr "Use 24 hour format"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Move to picture''s location with next/previous buttons"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Download mode"
 
@@ -32089,6 +32105,15 @@ msgstr "Open to-fix window."
 msgid "Tool:To-fix"
 msgstr "Tool:To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr "Enable Tofix plugin"
+
+msgid "Auto delete layer"
+msgstr "Auto delete layer"
+
+msgid "Select the checkbox to:"
+msgstr "Select the checkbox to:"
+
 msgid "Skip"
 msgstr "Skip"
 
@@ -32104,12 +32129,27 @@ msgstr "Fixed Error"
 msgid "Not an error"
 msgstr "Not an error"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html><a href=\"\">List of tasks</a></html>"
+
+msgid "Select a task ..."
+msgstr "Select a task ..."
+
 msgid "Set download area (m²)"
 msgstr "Set download area (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Tasks"
+
+msgid "Config"
+msgstr "Config"
+
+msgid "Activation"
+msgstr "Activation"
+
 msgid "tofix:Skip item"
 msgstr "tofix:Skip item"
 
@@ -32119,6 +32159,9 @@ msgstr "tofix:Fixed item"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Not a Error item"
 
+msgid "Activate to-fix plugin."
+msgstr "Activate to-fix plugin."
+
 msgid "Maintenance server"
 msgstr "Maintenance server"
 
@@ -32132,6 +32175,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Something went wrong, try again"
 
+msgid "No change to upload!"
+msgstr "No change to upload!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Cannot place a node outside of the world."
 
diff --git a/i18n/po/eo.po b/i18n/po/eo.po
index b17d0b7..dfa74a5 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:40+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:39+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: eo\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3522,9 +3522,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5030,9 +5027,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5747,15 +5741,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6053,15 +6047,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6151,6 +6136,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6869,13 +6863,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8873,6 +8867,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8890,12 +8890,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9637,10 +9631,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9649,6 +9640,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9789,13 +9783,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11359,6 +11353,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11367,11 +11366,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11456,6 +11450,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11470,9 +11467,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11586,10 +11580,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11816,6 +11810,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11825,9 +11822,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12951,9 +12945,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13064,6 +13055,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14803,6 +14797,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15878,6 +15875,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17863,6 +17863,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18051,6 +18057,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19034,12 +19043,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23889,6 +23892,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23954,6 +23960,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26066,16 +26077,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27740,6 +27751,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30245,6 +30259,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30260,12 +30283,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30275,6 +30313,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30286,6 +30327,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/es.po b/i18n/po/es.po
index d6e379f..744147f 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-29 03:19+0000\n"
-"Last-Translator: Omar Vega <ovruni at gnu.org.pe>\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-25 09:29+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-05-04 05:02+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:02+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: es\n"
 "X-Language: es_ES\n"
 "X-Source-Language: C\n"
@@ -552,7 +552,7 @@ msgid "Enable/disable expert mode"
 msgstr "Activar/desactivar modo experto"
 
 msgid "Follow line"
-msgstr "Seguir la línea"
+msgstr "Seguir línea"
 
 msgid "Continues drawing a line that shares nodes with another line."
 msgstr "Continúa dibujando una línea que comparte nodos con otra línea."
@@ -1149,7 +1149,7 @@ msgstr ""
 "Por favor, seleccione formas con angulos de aproximadamente 90 y 180 grados"
 
 msgid "Download from Overpass API ..."
-msgstr "Descargando desde la API Overpass..."
+msgstr "Descargar desde la API Overpass..."
 
 msgid "Download map data from Overpass API server."
 msgstr "Descargar datos del mapa desde el servidor API Overpass."
@@ -1471,10 +1471,10 @@ msgstr[0] "Vía simplificada (eliminado {0} nodo)"
 msgstr[1] "Vía simplificada (eliminados {0} nodos)"
 
 msgid "Split Way"
-msgstr "Separar vía"
+msgstr "Partir vía"
 
 msgid "Split a way at the selected node."
-msgstr "Separar vía por el nodo seleccionado"
+msgstr "Cortar la vía por el nodo seleccionado"
 
 msgid "Cannot split since another split operation is already in progress"
 msgstr "No se puede partir ya que otra operación de división está en marcha"
@@ -1721,12 +1721,12 @@ msgid "Updates the objects in the active data layer from the server."
 msgstr "Actualizar desde el servidor los objetos en la capa de datos activa."
 
 msgid "Update modified"
-msgstr "Actualización modificada"
+msgstr "Actualizar modificados"
 
 msgid ""
 "Updates the currently modified objects from the server (re-downloads data)"
 msgstr ""
-"Actualiza desde el servidor los objectos actualmente modificados (vuelve a "
+"Actualiza desde el servidor los objetos actualmente modificados (vuelve a "
 "descargar los datos)"
 
 msgid "No current dataset found"
@@ -2486,6 +2486,8 @@ msgid ""
 "{0}Add selection to relation{1}: Verify every single relation to avoid "
 "damage!"
 msgstr ""
+"{0} Añadir selección a la relación {1}: ¡Verificar cada relación para evitar "
+"daños!"
 
 msgid "Add selection to {0} relation"
 msgid_plural "Add selection to {0} relations"
@@ -3351,7 +3353,7 @@ msgstr[1] ""
 "significado semántico?</html>"
 
 msgid "Reverse directional way."
-msgstr "Invertir vías con sentido"
+msgstr "Invertir el sentido de la vía."
 
 msgid ""
 "When reversing this way, the following changes are suggested in order to "
@@ -3885,9 +3887,6 @@ msgstr "Elemento esperado ''{0}'', pero se obtuvo ''{1}''"
 msgid "value expected"
 msgstr "valor esperado"
 
-msgid " (at line {0}, column {1})"
-msgstr " (a la línea {0}, columna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Proyección UTM (''+proj=utm'') requiere el parámetro ''+zone=...''."
 
@@ -4533,7 +4532,7 @@ msgid "Route relation contains a gap"
 msgstr "Le relación de la ruta contiene una interrupción"
 
 msgid "Stop position not part of route"
-msgstr ""
+msgstr "La posición de parada no forma parte de la ruta"
 
 msgid "Role verification problem"
 msgstr "Problema de verificación de función"
@@ -4963,7 +4962,7 @@ msgid "House number {0} at {1}"
 msgstr "Número de portal {0} en {1}"
 
 msgid "House number {0}"
-msgstr "Número de casa {0}"
+msgstr "Número de portal {0}"
 
 msgid "highway"
 msgstr "vía"
@@ -5473,9 +5472,9 @@ msgid ""
 "Middle click again to cycle through.<br>Hold CTRL to select directly from "
 "this list with the mouse.<hr>"
 msgstr ""
-"Clic con el botón central otra vez para desplazarse por las opciones. "
-"<br>Mantenga CTRL para seleccionar directamente d esta lista con el "
-"ratón.<hr>"
+"Pulse de nuevo sobre el botón central del ratón para desplazarse por las "
+"diferentes geometrías superpuestas. <br>Mantenga pulsado el botón CTRL del "
+"teclado para seleccionar directamente de esta lista con el ratón.<hr>"
 
 msgid "(no object)"
 msgstr "(sin objeto)"
@@ -5504,9 +5503,6 @@ msgstr "El sistema de medición ha cambiado a {0}"
 msgid "Layer not in list."
 msgstr "capa no listada"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "La capa ''{0}'' debe estar en la lista de capas"
-
 msgid "Default (open, closed, new)"
 msgstr "Por defecto (abierto, cerrado, nuevo)"
 
@@ -6319,17 +6315,17 @@ msgstr "Vía original"
 msgid "Decision"
 msgstr "Decisión"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Por favor, seleccione los valores a conservar para las siguientes "
-"etiquetas.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Mostrar solo etiquetas con conflictos"
 
 msgid "Show tags with multiple values only"
 msgstr "Mostrar sólo los atributos con valores múltiples"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Por favor, seleccione los valores a conservar para las siguientes "
+"etiquetas.</html>"
+
 msgid "Apply?"
 msgstr "¿Aplicar?"
 
@@ -6652,15 +6648,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Cierre el diálogo de filtrado para ver todos los objetos.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Información ampliada sobre el objeto"
-
-msgid "map style"
-msgstr "estilo de mapa"
-
-msgid "edit counts"
-msgstr "cuenta de edición"
-
 msgid "not in data set"
 msgstr "no en el conjunto de datos"
 
@@ -6750,6 +6737,15 @@ msgstr "Parte de: "
 msgid "In conflict with: "
 msgstr "En conflicto con: "
 
+msgid "Advanced object info"
+msgstr "Información ampliada sobre el objeto"
+
+msgid "map style"
+msgstr "estilo de mapa"
+
+msgid "edit counts"
+msgstr "cuenta de edición"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Caché de estilos para \"{0}\":"
 
@@ -7535,15 +7531,15 @@ msgstr "Consultar sólo en las modificaciones cerradas"
 msgid "Query both open and closed changesets"
 msgstr "Consultar en las modificaciones abiertas y cerradas"
 
+msgid "Only changesets owned by myself"
+msgstr "Sólo modificaciones realizadas por mí"
+
 msgid "User ID:"
 msgstr "ID de usuario:"
 
 msgid "User name:"
 msgstr "Nombre de usuario:"
 
-msgid "Only changesets owned by myself"
-msgstr "Sólo modificaciones realizadas por mí"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Sólo modificaciones realizadas por el usuario con el siguiente ID"
 
@@ -7803,13 +7799,13 @@ msgid "Copy {1} of {0}"
 msgstr "Copia {1} de {0}"
 
 msgid "Change visibility of the selected layer."
-msgstr ""
+msgstr "Cambiar la visibilidad de la capa seleccionada."
 
 msgid "Show layer"
 msgstr "Mostrar capa"
 
 msgid "Adjust opacity of the layer."
-msgstr "Ajustar opacidad de la capa"
+msgstr "Ajustar la opacidad de la capa"
 
 msgid "Opacity"
 msgstr "Opacidad"
@@ -7821,13 +7817,13 @@ msgid "Gamma"
 msgstr "Gamma"
 
 msgid "Adjust sharpness/blur value of the layer."
-msgstr ""
+msgstr "Ajustar el valor de desenfoque/nitidez de la capa."
 
 msgid "Sharpness"
 msgstr "Nitidez"
 
 msgid "Adjust colorfulness of the layer."
-msgstr ""
+msgstr "Ajustar el colorido de la capa."
 
 msgid "Colorfulness"
 msgstr "Colorido"
@@ -7897,7 +7893,7 @@ msgid "Tag filter"
 msgstr "Filtro de etiqueta"
 
 msgid "Objects: {2} / Tags: {0} / Memberships: {1}"
-msgstr "Objectos: {2} / Etiquetas: {0} / Miembros: {1}"
+msgstr "Objetos: {2} / Etiquetas: {0} / Miembros: {1}"
 
 msgid "Tags: {0} / Memberships: {1}"
 msgstr "Etiquetas: {0} / Miembros: {1}"
@@ -9604,7 +9600,7 @@ msgstr ""
 "corto</i>.<br /><br />Esto técnicamente está permitido pero, por favor, "
 "considere que muchos usuarios que están siguiendo los cambios que se "
 "realizan en su área dependen de comentarios significativos sobre los "
-"conjuntos de cambios que se ha realizado para entender lo que está pasando. "
+"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>."
 
@@ -9660,7 +9656,7 @@ msgstr[1] ""
 "vacíos:<br>{0}<br>Continuar?</html>"
 
 msgid "Empty metadata"
-msgstr "Metadatos vacío"
+msgstr "Metadatos vacíos"
 
 msgid "Cancel the upload and resume editing"
 msgstr "Cancelar la carga y reanudar la edición"
@@ -9852,6 +9848,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Valor no esperado para la clave ''{0}'' en las preferencias, tiene ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Llenar un conjunto de cambios y volver al diálogo de subida"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Abrir y usar tantos conjuntos de cambios nuevos como sea necesario"
+
 msgid "Please select the upload strategy:"
 msgstr "Por favor, selecciona la estrategia de subida:"
 
@@ -9871,12 +9873,6 @@ msgstr ""
 "<html>Se requieren <strong>varios conjuntos de cambios</strong> para subir "
 "{0} objetos. ¿Qué estrategia va a emplear?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Llenar un conjunto de cambios y volver al diálogo de subida"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Abrir y usar tantos conjuntos de cambios nuevos como sea necesario"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "No es posible subir datos de una sola vez (hay demasiados objetos por subir)"
@@ -10672,11 +10668,8 @@ msgstr "No hay capas de imagenes disponibles."
 msgid "No imagery layers"
 msgstr "No hay capas de imágenes"
 
-msgid "Velocity, km/h"
-msgstr "Velocidad, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, M"
+msgid "HDOP"
+msgstr "Incertidumbre 2D (en la horizontal)"
 
 msgid "Time"
 msgstr "Tiempo"
@@ -10684,6 +10677,9 @@ msgstr "Tiempo"
 msgid "Direction"
 msgstr "Dirección"
 
+msgid "Velocity, {0}"
+msgstr "Velocidad, {0}"
+
 msgid "gps point"
 msgstr "punto GPS"
 
@@ -10826,6 +10822,9 @@ msgid ""
 "JOSM does no longer support mappaint styles written in the old XML format.\n"
 "Please update ''{0}'' to MapCSS"
 msgstr ""
+"JOSM ya no admite estilos de representación cartográfica escritos en el "
+"viejo formato XML .\n"
+"Por favor, actualice '' {0} '' a MapCSS"
 
 msgid "loading style ''{0}''..."
 msgstr "cargando estilo ''{0}''..."
@@ -10851,15 +10850,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "No se pudo localizar la imagen ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Almacenar llave de acceso en preferencias"
+
 msgid "Access Token Key:"
 msgstr "Llave de acceso:"
 
 msgid "Access Token Secret:"
 msgstr "Llave secreta de acceso:"
 
-msgid "Save Access Token in preferences"
-msgstr "Almacenar llave de acceso en preferencias"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12659,6 +12658,12 @@ msgstr "Ajuste predeterminado interno"
 msgid "The default preset for JOSM"
 msgstr "El ajuste predeterminado de JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "El complemento {0} todavía es requerido por este complemento:"
+msgstr[1] ""
+"El complemento {0} todavía es requerido por estos complementos {1}:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Complemento incluido en JOSM"
 
@@ -12669,12 +12674,6 @@ msgstr ""
 "Por favor, presione en <strong>Descargar lista</strong> para descargar y "
 "mostrar una lista de complementos disponibles."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "El complemento {0} todavía es requerido por este complemento:"
-msgstr[1] ""
-"El complemento {0} todavía es requerido por estos complementos {1}:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versión {1} (local: {2})"
 
@@ -12767,6 +12766,9 @@ msgstr "Editar la URL de la descripción del complemento de JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "URL de descripción del complemento de JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Intervalo de actualización (en días):"
+
 msgid "Ask before updating"
 msgstr "Preguntar antes de actualizar"
 
@@ -12783,9 +12785,6 @@ msgstr ""
 "Por favor, decida si JOSM actualizará automáticamente los componentes "
 "activos al iniciarse después de una actualización de sí mismo."
 
-msgid "Update interval (in days):"
-msgstr "Intervalo de actualización (en días):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12901,12 +12900,12 @@ msgstr "Rijksdriehoekscoördinaten (Países Bajos)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suecia)"
 
-msgid "Projection method"
-msgstr "Método de proyección"
-
 msgid "Projection code"
 msgstr "Código de proyección"
 
+msgid "Projection method"
+msgstr "Método de proyección"
+
 msgid "Display coordinates as"
 msgstr "Visualizar las coordenadas como"
 
@@ -13161,6 +13160,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Error almacenando el Token de Acceso OAuth en el administrador credenciales"
 
+msgid "Save to preferences"
+msgstr "Guardar preferencias"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13173,9 +13175,6 @@ msgid ""
 msgstr ""
 "Usted ya tiene una llave de Acceso para acceder al servidor OSM usando OAuth"
 
-msgid "Save to preferences"
-msgstr "Guardar preferencias"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Seleccione para seguir los pasos del proceso de autorización OAuth"
 
@@ -13863,9 +13862,11 @@ msgid ""
 "Error adding certificate {0} - certificate fingerprint mismatch. Expected "
 "{1}, was {2}"
 msgstr ""
+"Error al añadir el certificado {0}. El certificado de huella digital no "
+"coincide. Esperado {1}, pero fue {2}"
 
 msgid "Adding certificate for TLS connections: {0}"
-msgstr ""
+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."
@@ -14447,9 +14448,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Hay un valor ilegal número(long) para el atributo \"{0}\". Se obtuvo \"{1}\"."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bytes han sido leídos"
-
 msgid "Prepare OSM data..."
 msgstr "Preparando datos OSM..."
 
@@ -14564,6 +14562,9 @@ msgstr "Archivos WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versión de archivo WMS no soportada; encontrada {0}, esperada {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bytes han sido leídos"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15961,6 +15962,8 @@ msgstr "(El texto ya ha sido copiado a tu portapapeles.)"
 msgid ""
 "Opening the bug report failed. Please report manually using this website:"
 msgstr ""
+"Fallo al abrir el informe de error. Por favor, informe de forma manual "
+"utilizando este sitio web:"
 
 msgid ""
 "Error in search expression on position {0} - right side of or(|) expression "
@@ -16316,10 +16319,10 @@ msgid "OpenCycleMap"
 msgstr "OpenCycleMap"
 
 msgid "OpenSeaMap"
-msgstr ""
+msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (estilo estándar)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik blanco y negro)"
@@ -16328,7 +16331,7 @@ msgid "OpenStreetMap (Mapnik, no labels)"
 msgstr "OpenStreetMap (Mapnik, sin etiquetas)"
 
 msgid "OpenStreetMap (French Style)"
-msgstr ""
+msgstr "OpenStreetMap (estilo francés)"
 
 msgid "OpenStreetMap (German Style)"
 msgstr "OpenStreetMap (estilo alemán)"
@@ -16448,7 +16451,7 @@ msgid "basemap.at Orthofoto"
 msgstr "basemap.at Orthofoto"
 
 msgid "Geoimage.at MaxRes"
-msgstr ""
+msgstr "Geoimage.at MaxRes"
 
 msgid "Graz: Basiskarte (base map)"
 msgstr "Graz: Basiskarte (mapa base)"
@@ -16475,13 +16478,13 @@ msgid "VoGIS: Echtfarbenbild Winter 2015 (20cm)"
 msgstr "VoGIS: Invierno Echtfarbenbild 2015 (20cm)"
 
 msgid "VoGIS: Echtfarbenbild 2015 (10cm)"
-msgstr ""
+msgstr "VoGIS: Imagen en color verdadero 2015 (10cm)"
 
 msgid "VoGIS: Flächenwidmungsplan"
 msgstr "VoGIS: Flächenwidmungsplan"
 
 msgid "VoGIS: Höhen und Gelände"
-msgstr ""
+msgstr "VoGIS: Alturas y terrenos"
 
 msgid "AGIV(laanderen) aerial imagery (covers Brussels region as well)"
 msgstr ""
@@ -16598,6 +16601,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Burdeos - 2012"
 
@@ -16629,10 +16635,10 @@ msgid "Géolittoral - Sentiers"
 msgstr "Géolittoral - Sentiers"
 
 msgid "Lyon - Orthophoto 2012-03 10cm - EPSG:3946"
-msgstr ""
+msgstr "Lyon - Ortofoto 2012-03 10cm - EPSG:3946"
 
 msgid "Lyon - Orthophoto 2015-05 8cm - EPSG:3946"
-msgstr ""
+msgstr "Lyon - Ortofoto 2015-05 8cm - EPSG:3946"
 
 msgid "Loire-Atlantique - Orthophotos 2012 - 20 cm"
 msgstr "Loire-Atlántico - Ortofotos 2012 - 20 cm"
@@ -16686,13 +16692,13 @@ msgid "Bavaria (2 m)"
 msgstr "Bavaria (2 m)"
 
 msgid "Berlin aerial photograph 2011"
-msgstr ""
+msgstr "Berlin fotografía aérea 2011"
 
 msgid "Berlin aerial photograph 2014"
-msgstr ""
+msgstr "Berlin fotografía aérea 2014"
 
 msgid "Berlin aerial photograph 2015"
-msgstr ""
+msgstr "Berlin fotografía aérea 2015"
 
 msgid "Stuttgart (aerial imagery)"
 msgstr "Imágenes aéreas de Stuttgart"
@@ -16757,7 +16763,7 @@ msgid "5 cm resolution bald image"
 msgstr "imagen cruda resolución de 5 cm"
 
 msgid "Törökbálint ortophoto 2015"
-msgstr ""
+msgstr "Törökbálint ortofotografía 2015"
 
 msgid "Danube flood ortophoto 2013"
 msgstr "Inundación del Danubio ortofoto de 2013"
@@ -16820,7 +16826,7 @@ msgid "Lodi - Italy"
 msgstr "Lodi - Italia"
 
 msgid "Lombardia - Italy (CTR)"
-msgstr ""
+msgstr "Lombardia - Italia (CTR)"
 
 msgid "Lombardia - Italy (CTR DBT)"
 msgstr "Lombardía - Italia (CTR DBT)"
@@ -16859,7 +16865,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Lituania)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Ferrocarril Inspire Luxemburgo"
@@ -16961,7 +16967,7 @@ msgid "Powiat poznański: Ortofotomapa (Aerial image)"
 msgstr "Powiat poznański: Ortofotomapa (imagen aérea)"
 
 msgid "Powiat ropczycko-sędziszowski: Budynki (buildings)"
-msgstr ""
+msgstr "Powiat ropczycko-sędziszowski: Budynki (edificios)"
 
 msgid "Powiat rzeszowski: Budynki (buildings)"
 msgstr "Powiat rzeszowski: Budynki (edificios)"
@@ -16973,7 +16979,7 @@ msgid "Powiat stalowowolski: Budynki (buildings)"
 msgstr "Powiat stalowowolski: Budynki (edificios)"
 
 msgid "Poznań: Ortofotomapa 2014 (aerial image)"
-msgstr ""
+msgstr "Poznań: Ortofotomapa 2014 (imagen aérea)"
 
 msgid "Przemyśl: Budynki (buildings)"
 msgstr "Przemyśl: Budynki (edificios)"
@@ -17697,6 +17703,8 @@ msgid ""
 "Gives assistance for the mapping process of indoor OSM building data. "
 "Includes a validator and a mappaint style for indoor-data."
 msgstr ""
+"Facilita el cartografiado de interiores de edificios en OSM. Incluye un "
+"validador de datos y un estilo de mapa propio para interiores."
 
 msgid ""
 "Extra information about current layer objects pop ups - currently GPX "
@@ -17760,6 +17768,9 @@ msgstr ""
 "el sitio web de MapDust. Puede crear, cerrar, invalidar, reabrir y comentar "
 "los informes de errores existentes mediante el uso de este componente."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19162,7 +19173,7 @@ msgid "Destination"
 msgstr "Destino"
 
 msgid "Destination reference"
-msgstr ""
+msgstr "Referencia de destino"
 
 msgid "Placement"
 msgstr "Ubicación"
@@ -19848,6 +19859,12 @@ msgstr "agujas del reloj"
 msgid "Pedestrian Crossing"
 msgstr "Paso de peatones"
 
+msgid "Tactile Paving"
+msgstr "Pavimento táctil"
+
+msgid "incorrect"
+msgstr "incorrecto"
+
 msgid "In case of traffic signals:"
 msgstr "En el caso de semáforos:"
 
@@ -20038,6 +20055,9 @@ msgstr "Zanja"
 msgid "Kerb"
 msgstr "Bordillo"
 
+msgid "Tactile paving"
+msgstr "Pavimento táctil"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrada (apertura de barrera)"
 
@@ -20247,13 +20267,13 @@ msgid "mangrove"
 msgstr "manglar"
 
 msgid "wet_meadow"
-msgstr ""
+msgstr "pradera húmeda"
 
 msgid "string_bog"
-msgstr ""
+msgstr "string bog (terreno pantanoso lineal ondulado periglaciar )"
 
 msgid "saltern"
-msgstr ""
+msgstr "salina"
 
 msgid "Mud"
 msgstr "Lodazal"
@@ -21032,12 +21052,6 @@ msgstr "Estación de autobús"
 msgid "Bus Stop"
 msgstr "Parada de autobús"
 
-msgid "Tactile Paving"
-msgstr "Pavimento táctil"
-
-msgid "incorrect"
-msgstr "incorrecto"
-
 msgid "Bus Platform"
 msgstr "Andén de autobús"
 
@@ -21411,7 +21425,7 @@ msgid "Fishing"
 msgstr "Pesca"
 
 msgid "Bird Hide"
-msgstr ""
+msgstr "Observatorio de aves"
 
 msgid "Night Club"
 msgstr "Club nocturno"
@@ -22686,7 +22700,7 @@ msgstr "torre transformadora"
 
 msgctxt "building"
 msgid "public"
-msgstr ""
+msgstr "público"
 
 msgctxt "building"
 msgid "Levels"
@@ -23372,7 +23386,7 @@ msgid "Vodo-Vodyanoi Energetichesky Reactor (VVER)"
 msgstr "Reactor Vodo-Vodyanoi Energetichesky (VVER)"
 
 msgid "Solar Power Generator"
-msgstr "Generador de energía Solar"
+msgstr "Generador de energía solar"
 
 msgctxt "generator method"
 msgid "photovoltaic"
@@ -23389,7 +23403,7 @@ msgid "photovoltaic"
 msgstr "fotovoltaica"
 
 msgid "solar_thermal_collector"
-msgstr "colector termo solar"
+msgstr "colector termosolar"
 
 msgid "thermal"
 msgstr "termal"
@@ -23464,7 +23478,7 @@ msgid "Wave Energy Converter"
 msgstr "Conversor de energía de onda"
 
 msgid "Osmotic Power Generator"
-msgstr "Gnerador de energía osmótica"
+msgstr "Generador de energía osmótica"
 
 msgid "Geothermal Power Generator"
 msgstr "Generador de energía Geotérmica"
@@ -24279,7 +24293,7 @@ msgid "food"
 msgstr "Alimentación"
 
 msgid "newspapers"
-msgstr ""
+msgstr "Periódicos"
 
 msgid "parking_tickets"
 msgstr "tickets de aparcamiento"
@@ -24294,7 +24308,7 @@ msgid "public_transport_tickets"
 msgstr "billetes de de transporte público"
 
 msgid "SIM_cards"
-msgstr ""
+msgstr "Tarjetas SIM"
 
 msgid "stamps"
 msgstr "sellos"
@@ -24742,10 +24756,10 @@ msgid "scoria"
 msgstr "escoria"
 
 msgid "Ridge"
-msgstr "dorsal centroocéanica"
+msgstr "Cresta montañosa o cordal"
 
 msgid "A mountain or hill ridge."
-msgstr "Una montaña o cerro en la dorsal centrooceánica"
+msgstr "El cordal de una cordillera, sierra o cresta montañosa."
 
 msgid "Valley"
 msgstr "Valle"
@@ -25582,19 +25596,19 @@ msgid "Walking Route"
 msgstr "Ruta peatonal"
 
 msgid "Riding Route"
-msgstr ""
+msgstr "Ruta a caballo"
 
 msgid "ihn"
-msgstr ""
+msgstr "Ruta internacional"
 
 msgid "nhn"
-msgstr ""
+msgstr "Ruta nacional"
 
 msgid "rhn"
-msgstr ""
+msgstr "Ruta regional"
 
 msgid "lhn"
-msgstr ""
+msgstr "Ruta local"
 
 msgid "Piste Route"
 msgstr "Ruta de pista"
@@ -25780,13 +25794,14 @@ msgid "Test"
 msgstr "Prueba"
 
 msgid "Even housenumber in odd address interpolation."
-msgstr ""
+msgstr "Número de portal par en interpolación de direcciones impares."
 
 msgid "Odd housenumber in even address interpolation."
-msgstr ""
+msgstr "Número de portal impar en interpolación de direcciones pares."
 
 msgid "Way with {0}. Tag each housenumber separately if possible."
 msgstr ""
+"Vía con {0}. Etiquetar cada número de portal por separado si es posible."
 
 msgid "{0} without {1}"
 msgstr "{0} sin {1}"
@@ -25881,6 +25896,8 @@ msgid ""
 "{0} is unspecific. Instead use the key fixme with the information what "
 "exactly should be fixed in the value of fixme."
 msgstr ""
+"{0} no es específica. En su lugar se debe utilizar la clave fixme con "
+"información en el valor de lo que debe arreglarse exactamente."
 
 msgid "{0} is deprecated. Please use instead a multipolygon."
 msgstr "{0} está en desuso. Por favor utilice en su lugar un multipolígono."
@@ -25923,7 +25940,8 @@ msgstr "La definición de {0} no es clara"
 msgid ""
 "{0} is not recommended. Use the Reverse Ways function from the Tools menu."
 msgstr ""
-"{0} no es recomendado. Use la función Invertir vías en el menú Herramientas."
+"{0} no es recomendado. Use la función \"Invertir vías\" del menú "
+"Herramientas."
 
 msgid "key with uncommon character"
 msgstr "clave con carácter poco frecuente"
@@ -25943,6 +25961,9 @@ msgstr "{0} está en desuso. Utilice en su lugar el prefijo clave {1}."
 msgid "questionable key (ending with a number): {0}"
 msgstr "clave cuestionable (termina con un número): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "La clave {0} tiene un valor poco común."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} sobre un nodo. Debería ser utilizado sobre una vía."
 
@@ -25989,7 +26010,7 @@ msgid "node connects waterway and bridge"
 msgstr "el nodo conecta a una vía fluvial y puente"
 
 msgid "{0} node connected to a highway"
-msgstr ""
+msgstr "{0} nodo conectado a una carretera"
 
 msgid "suspicious roundabout direction"
 msgstr "Dirección de rotonda sospechosa"
@@ -26001,12 +26022,21 @@ msgid "{0} on a small area"
 msgstr "{0} en un área pequeña"
 
 msgid "Too large building"
-msgstr ""
+msgstr "Edificio demasiado grande"
 
 msgid ""
 "Node connects a power line or cable with an object which is not related to "
 "the power infrastructure."
 msgstr ""
+"Nodo que conecta una línea eléctrica o cable con un objeto que no está "
+"relacionado con la infraestructura de energía."
+
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+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 "abbreviated street name"
 msgstr "nombre de calle abreviado"
@@ -27343,13 +27373,13 @@ msgid "Building address"
 msgstr "Dirección de edificación"
 
 msgid "empty"
-msgstr "vacío"
+msgstr "s/n"
 
 msgid "skip"
 msgstr "omitir"
 
 msgid "House number:"
-msgstr "Número de Casa:"
+msgstr "Número de portal:"
 
 msgid "Street:"
 msgstr "Calle:"
@@ -28381,18 +28411,18 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr "Conmutar el modo de descarga continua sí/no"
 
-msgid "Download Settings"
-msgstr "Configuración de descargas"
-
-msgid "Settings for the continuous download."
-msgstr "Configuraciones para la descarga continua."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Activar descargas continuas en el arranque."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Suprimir el monitor de progreso modal por defecto al descargar."
 
+msgid "Download Settings"
+msgstr "Configuración de descargas"
+
+msgid "Settings for the continuous download."
+msgstr "Configuraciones para la descarga continua."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29461,64 +29491,70 @@ msgid "Offset into background:"
 msgstr "Valor de desviación respecto al origen:"
 
 msgid "Indoor Mapping Helper"
-msgstr ""
+msgstr "Asistente para el cartografiado de interiores"
 
 msgid "POWER"
-msgstr ""
+msgstr "ENERGÍA"
 
 msgid "Activates the plug-in"
-msgstr ""
+msgstr "Activa el componente"
 
 msgid "Working Level"
-msgstr ""
+msgstr "Nivel de trabajo"
 
 msgid "Selects the working level."
-msgstr ""
+msgstr "Selecciona el nivel de trabajo."
 
 msgid "Level Name"
-msgstr ""
+msgstr "Nombre del nivel"
 
 msgid "Optional name-tag for a level."
-msgstr ""
+msgstr "Nombre de etiquetado opcional para un nivel"
 
 msgid "The object preset you want to tag."
-msgstr ""
+msgstr "El objeto predefinido que desea etiquetar."
 
 msgid "Sets the name tag when the room-object is selected."
 msgstr ""
+"Establece el nombre de la etiqueta cuando el objeto estancia es seleccionado."
 
 msgid "Sets the ref tag when the room-object is selected."
 msgstr ""
+"Establece la etiqueta referencia cuando el objeto estancia es seleccionado."
 
 msgid "Apply Tags"
-msgstr ""
+msgstr "Aplicar etiquetas"
 
 msgid "Fitting"
-msgstr ""
+msgstr "Ajustes"
 
 msgid ""
 "<html>Please mind to start fitting your building-plans now.<br>To do so, use "
 "the PicLayer plug-in, which you can install<br>using the JOSM plug-in "
 "management.</html>"
 msgstr ""
+"<Html> Tenga en cuenta que debe comenzar ajustando la imagen del plano del "
+"edificio. <br> Para ello utilice el componente PicLayer, el cual puede "
+"instalar utilizando el gestor de componentes del JOSM. </ Html>"
 
 msgid "Level Selection"
-msgstr ""
+msgstr "Selección de nivel"
 
 msgid "Lowest Level"
-msgstr ""
+msgstr "Nivel más bajo"
 
 msgid "The lowest level of your building."
-msgstr ""
+msgstr "El nivel más inferior de tu edificio."
 
 msgid "Highest Level"
-msgstr ""
+msgstr "Nivel más alto"
 
 msgid "The highest level of your building."
-msgstr ""
+msgstr "El nivel más superior de tu edificio."
 
 msgid "Toolbox for indoor mapping assistance"
 msgstr ""
+"Caja de herramientas para el asistente de cartografiado de interiores"
 
 msgid "InfoMode"
 msgstr "ModoInfo"
@@ -30174,6 +30210,9 @@ msgstr "Usar formato de 24 horas"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Mover a ubicación de imágenes con el botón siguiente/anterior"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Modo de descarga"
 
@@ -31980,10 +32019,10 @@ msgid "Public Transport: Edit waypoint name"
 msgstr "Transporte público: editar nombre del punto de ruta"
 
 msgid "Distance between stops"
-msgstr ""
+msgstr "Distancia entre paradas"
 
 msgid "A valid public_transport:version=2 route is required"
-msgstr ""
+msgstr "Se requiere una ruta valida public_transport:version=2"
 
 msgid "Invalid selection"
 msgstr "Selección no válida"
@@ -32843,6 +32882,15 @@ msgstr "Abrir  la ventana to-fix"
 msgid "Tool:To-fix"
 msgstr "Herramienta:Para-corregir"
 
+msgid "Enable Tofix plugin"
+msgstr "Activar el componente Tofix"
+
+msgid "Auto delete layer"
+msgstr "Eliminación automática de capa"
+
+msgid "Select the checkbox to:"
+msgstr "Seleccione la casilla de verificación para:"
+
 msgid "Skip"
 msgstr "Omitir"
 
@@ -32858,12 +32906,27 @@ msgstr "Error corregido"
 msgid "Not an error"
 msgstr "No es un error"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html> <a href=\"\"> Lista de tareas </a> </html>"
+
+msgid "Select a task ..."
+msgstr "Seleccionar una tarea..."
+
 msgid "Set download area (m²)"
 msgstr "Establecer el área de descarga (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Tareas"
+
+msgid "Config"
+msgstr "Configuración"
+
+msgid "Activation"
+msgstr "Activación"
+
 msgid "tofix:Skip item"
 msgstr "tofix:Saltar ítem"
 
@@ -32873,6 +32936,9 @@ msgstr "tofix:ítem corregido"
 msgid "tofix:Not a Error item"
 msgstr "tofix:no es un ítem con error"
 
+msgid "Activate to-fix plugin."
+msgstr "Activar el componente to-fix"
+
 msgid "Maintenance server"
 msgstr "Servidor de mantenimiento"
 
@@ -32886,6 +32952,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Ocurrió un error, inténtelo de nuevo"
 
+msgid "No change to upload!"
+msgstr "¡Sin cambios que subir!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "No se puede colocar un nodo fuera del mundo."
 
diff --git a/i18n/po/et.po b/i18n/po/et.po
index 9f16574..5f20b05 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:40+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:40+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: et\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3617,9 +3617,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5125,9 +5122,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "Kiht ei ole nimistus."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Kiht ''{0}'' peab olema kihtide nimistus"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5842,16 +5836,16 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Palun vali väärtused, mida omistada järgmistele siltidele.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Näidatakse ainult konfliktseid silte"
 
 msgid "Show tags with multiple values only"
 msgstr "Näidatakse ainult erinevate väärtustega silte"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Palun vali väärtused, mida omistada järgmistele siltidele.</html>"
+
 msgid "Apply?"
 msgstr ""
 
@@ -6150,15 +6144,6 @@ msgstr[1] "<b>{0}</b> objekti keelatud"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Kõigi objektide nägemiseks sulge filtri dialoog.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Objekti põhjalikum info"
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6248,6 +6233,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr "Objekti põhjalikum info"
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6971,13 +6965,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -9029,6 +9023,12 @@ msgstr "Katkesta üleslaadimine"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr "Palun vali üleslaadimise strateegia:"
 
@@ -9046,12 +9046,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9805,10 +9799,7 @@ msgstr "Aluskaardi kihte ei ole"
 msgid "No imagery layers"
 msgstr "Aluskaardi kihte ei ole"
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9817,6 +9808,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9959,13 +9953,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11536,6 +11530,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plugin kaasatud JOSMi"
 
@@ -11546,11 +11545,6 @@ msgstr ""
 "Klõpsa nupul <strong>Laadi alla nimekiri</strong>, et laadida alla ja kuvada "
 "saadaolevate pluginate nimekirja."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11637,6 +11631,9 @@ msgstr "Muuda JOSM plugina kirjelduse URLi."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM plugina kirjelduse URL"
 
+msgid "Update interval (in days):"
+msgstr "Uuendamise intervall (päevades)"
+
 msgid "Ask before updating"
 msgstr "Küsi enne uuendamist"
 
@@ -11653,9 +11650,6 @@ msgstr ""
 "Palun vali, kas JOSM uuendab aktiivseid pluginaid automaatselt peale JOSMi "
 "enda uuendamist."
 
-msgid "Update interval (in days):"
-msgstr "Uuendamise intervall (päevades)"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11769,12 +11763,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Projektsiooni meetodid"
-
 msgid "Projection code"
 msgstr "Projektsiooni kood"
 
+msgid "Projection method"
+msgstr "Projektsiooni meetodid"
+
 msgid "Display coordinates as"
 msgstr ""
 
@@ -12013,6 +12007,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12022,9 +12019,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13154,9 +13148,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "OSM andmeid ettevalmistamine..."
 
@@ -13268,6 +13259,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15048,6 +15042,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16125,6 +16122,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18117,6 +18117,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr "Ülekäigurada"
 
+msgid "Tactile Paving"
+msgstr "Taktiilsillutis"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr "Valgusfoori korral:"
 
@@ -18305,6 +18311,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19288,12 +19297,6 @@ msgstr "Bussijaam"
 msgid "Bus Stop"
 msgstr "Bussipeatus"
 
-msgid "Tactile Paving"
-msgstr "Taktiilsillutis"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Bussiplatvorm"
 
@@ -24143,6 +24146,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24208,6 +24214,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26331,16 +26342,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28010,6 +28021,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30523,6 +30537,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30538,12 +30561,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30553,6 +30591,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30564,6 +30605,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/eu.po b/i18n/po/eu.po
index a43a7a6..342288c 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:34+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:34+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: eu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3656,9 +3656,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5193,9 +5190,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "Geruza hau ez dago zerrendan."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "\"{0}\" geruzak, geruzen zerrendan egon behar du"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5933,15 +5927,15 @@ msgstr "Jatorrizko bidea"
 msgid "Decision"
 msgstr "Erabakia"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr "Gatazkak dituzten etiketak soilik erakutsi"
 
 msgid "Show tags with multiple values only"
 msgstr "Balio-anitzak diren etiketak soilik erakutsi"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Aplikatu?"
 
@@ -6241,15 +6235,6 @@ msgstr ""
 "</p><p>Objektu guztiak ikusi ahal izateko itxi ezazu elkarrizketa-"
 "iragazkia.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Objektuen informazio aurreratua"
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6339,6 +6324,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr "Objektuen informazio aurreratua"
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -7058,15 +7052,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr ""
+
 msgid "User ID:"
 msgstr "Erabiltzaile IDa:"
 
 msgid "User name:"
 msgstr "Erabiltzaile izena:"
 
-msgid "Only changesets owned by myself"
-msgstr ""
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -9062,6 +9056,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -9079,12 +9079,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9828,10 +9822,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9840,6 +9831,9 @@ msgstr ""
 msgid "Direction"
 msgstr "Norabidea"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9980,13 +9974,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11550,6 +11544,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11558,11 +11557,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11647,6 +11641,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11661,9 +11658,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11777,10 +11771,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suedia)"
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -12007,6 +12001,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12016,9 +12013,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13138,9 +13132,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13252,6 +13243,9 @@ msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 "Sustengurik gabeko WMS fitxategi-bertsioa; {0} aurkitu da eta {1} espero zen"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14996,6 +14990,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16080,6 +16077,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18096,6 +18096,12 @@ msgstr "erlojuaren norabidea"
 msgid "Pedestrian Crossing"
 msgstr "Oinezkoen pasabidea"
 
+msgid "Tactile Paving"
+msgstr "Ukimen-zola"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18284,6 +18290,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19267,12 +19276,6 @@ msgstr "Autobus-estazioa"
 msgid "Bus Stop"
 msgstr "Autobus-gelakua"
 
-msgid "Tactile Paving"
-msgstr "Ukimen-zola"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Autobusaren plataforma"
 
@@ -24122,6 +24125,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24187,6 +24193,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26299,16 +26310,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27973,6 +27984,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30483,6 +30497,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30498,12 +30521,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30513,6 +30551,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30524,6 +30565,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/fa.po b/i18n/po/fa.po
index 2275619..705480d 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:57+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:57+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: fa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3587,9 +3587,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5096,9 +5093,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5813,15 +5807,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6119,15 +6113,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6217,6 +6202,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6935,13 +6929,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8944,6 +8938,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8961,12 +8961,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9708,10 +9702,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9720,6 +9711,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9860,13 +9854,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11430,6 +11424,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11438,11 +11437,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11527,6 +11521,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11541,9 +11538,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11657,10 +11651,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11887,6 +11881,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11896,9 +11893,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13018,9 +13012,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13131,6 +13122,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14870,6 +14864,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15945,6 +15942,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17930,6 +17930,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18118,6 +18124,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19101,12 +19110,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23956,6 +23959,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24021,6 +24027,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26133,16 +26144,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27807,6 +27818,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30312,6 +30326,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30327,12 +30350,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30342,6 +30380,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30353,6 +30394,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/fi.po b/i18n/po/fi.po
index a0efe86..861c74d 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:41+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:41+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: fi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3781,9 +3781,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (rivillä {0}, sarakkeessa {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM projektio (''+proj=utm'') edellyttää parametria ''+zone=...''"
 
@@ -5343,9 +5340,6 @@ msgstr "Mittayksiköt vaihdettiin, uusi järjestelmä on: {0}"
 msgid "Layer not in list."
 msgstr "taso ei ole listassa."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Tason \"{0}\" tulee olla tasolistassa"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -6091,15 +6085,15 @@ msgstr "Alkp. Polk."
 msgid "Decision"
 msgstr "Päätös"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>Valitse arvot jotka pidetään seuraaville tageille.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Näytä vain tagit joissa ristiriitoja"
 
 msgid "Show tags with multiple values only"
 msgstr "Näytä vain tagit joissa useita arvoja"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>Valitse arvot jotka pidetään seuraaville tageille.</html>"
+
 msgid "Apply?"
 msgstr "Toteutav"
 
@@ -6413,15 +6407,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Saat kaikki kohteet näkyviin sulkemalla suodinpaneelin.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Kohteen tarkat tiedot"
-
-msgid "map style"
-msgstr "karttatyyli"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "puuttuu ladatusta datasta"
 
@@ -6511,6 +6496,15 @@ msgstr "Osa objekteja: "
 msgid "In conflict with: "
 msgstr "Ristiriidassa, toinen osapuoli: "
 
+msgid "Advanced object info"
+msgstr "Kohteen tarkat tiedot"
+
+msgid "map style"
+msgstr "karttatyyli"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Piirtotyylit kohteelle \"{0}\":"
 
@@ -7264,15 +7258,15 @@ msgstr "Hae vain suljettuja muutoskokoelmia"
 msgid "Query both open and closed changesets"
 msgstr "Hae avoimia ja suljettuja muutoskokoelmia"
 
+msgid "Only changesets owned by myself"
+msgstr "Vain omat muutoskokoelmani"
+
 msgid "User ID:"
 msgstr "Käyttäjän ID:"
 
 msgid "User name:"
 msgstr "Käyttäjänimi:"
 
-msgid "Only changesets owned by myself"
-msgstr "Vain omat muutoskokoelmani"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Hae muutoskokoelmia käyttäjän id-numeron perusteella"
 
@@ -9495,6 +9489,12 @@ msgstr "Peruuta lähetys"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Avaa ja käytä tarvittava määrä muutoskokoelmia"
+
 msgid "Please select the upload strategy:"
 msgstr "Valitse lähetystapa"
 
@@ -9512,12 +9512,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Avaa ja käytä tarvittava määrä muutoskokoelmia"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Lähetys yhdellä pyynnöllä ei ole mahdollista, liian monta lähetettävää "
@@ -10280,10 +10274,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10292,6 +10283,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps-piste"
 
@@ -10432,13 +10426,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -12078,6 +12072,11 @@ msgstr "Sisäänrakennetut esivalinnat"
 msgid "The default preset for JOSM"
 msgstr "JOSM:n oletuksena käyttämät esivalinnat"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Liitännäinen tulee JOSM:n mukana"
 
@@ -12086,11 +12085,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -12175,6 +12169,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr "Liitännäisten päivitystarkistuksen väli (päivissä):"
+
 msgid "Ask before updating"
 msgstr "Kysy varmistus ennen päivitystä"
 
@@ -12191,9 +12188,6 @@ msgstr ""
 "Valitse saako JOSM automaattisesti päivittää käytössä olevat liitännäiset "
 "aina kun JOSM on päivitetty."
 
-msgid "Update interval (in days):"
-msgstr "Liitännäisten päivitystarkistuksen väli (päivissä):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12309,12 +12303,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Ruotsi)"
 
-msgid "Projection method"
-msgstr "Projektiometodi"
-
 msgid "Projection code"
 msgstr "Karttaprojektion tunniste"
 
+msgid "Projection method"
+msgstr "Projektiometodi"
+
 msgid "Display coordinates as"
 msgstr "Näytä koordinaatit"
 
@@ -12549,6 +12543,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "Tallenna asetuksiin"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12558,9 +12555,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr "Tallenna asetuksiin"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13744,9 +13738,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Valmistellaan OSM-karttatietoja..."
 
@@ -13858,6 +13849,9 @@ msgstr "WMS-tiedostot (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "WMS tiedoston versiota ei tueta; luettiin arvo: {0}, odotettiin: {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15684,6 +15678,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16773,6 +16770,9 @@ msgstr ""
 "Virheraportteja voi luoda, kommentoida, sulkea ja avata uudelleen tällä "
 "liitännäisellä."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18785,6 +18785,12 @@ msgstr "myötäpäivään"
 msgid "Pedestrian Crossing"
 msgstr "Suojatie"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18973,6 +18979,9 @@ msgstr "Oja"
 msgid "Kerb"
 msgstr "Kanttikivi"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Kulkuaukko (esteessä)"
 
@@ -19956,12 +19965,6 @@ msgstr "Linja-autoasema"
 msgid "Bus Stop"
 msgstr "Linja-autopysäkki"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Bussipysäkin laituri"
 
@@ -24820,6 +24823,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24885,6 +24891,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -27031,16 +27042,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28733,6 +28744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31261,6 +31275,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31276,12 +31299,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31291,6 +31329,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31302,6 +31343,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Pistettä ei voi sijoittaa maailman ulkopuolelle."
 
diff --git a/i18n/po/fil.po b/i18n/po/fil.po
index 2a4359e..9d3dc0e 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:11+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:11+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: fil\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/fo.po b/i18n/po/fo.po
index 423960e..d2da0a9 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:41+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:40+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}: valmøguleiki ''{1}'' er tvítýddur"
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/fr.po b/i18n/po/fr.po
index 54a8957..91c2ad6 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 12:18+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-13 07:05+0000\n"
 "Last-Translator: Penegal <Unknown>\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-05-04 04:42+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:41+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: fr\n"
 "X-Poedit-Bookmarks: 1767,-1,-1,2669,-1,-1,-1,-1,-1,-1\n"
 
@@ -2477,7 +2477,7 @@ msgid ""
 "damage!"
 msgstr ""
 "{0}Ajout de la sélection à la relation {1}: Vérifiez toutes les relations "
-"pour éviter d'en endommager !"
+"pour éviter d''en endommager !"
 
 msgid "Add selection to {0} relation"
 msgid_plural "Add selection to {0} relations"
@@ -3871,9 +3871,6 @@ msgstr "Élément attendu ''{0}'', ''{1}'' obtenu"
 msgid "value expected"
 msgstr "valeur attendue"
 
-msgid " (at line {0}, column {1})"
-msgstr " (à la ligne {0}, colonne {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 "Le paramètre \"+zone=...\" est requis pour la projection UTM (''+proj=utm'')."
@@ -5344,7 +5341,7 @@ msgid "Menu: {0}"
 msgstr "Menu : {0}"
 
 msgid "Main toolbar"
-msgstr "Barre d'outils principale"
+msgstr "Barre d''outils principale"
 
 msgid ""
 "Toggles the visibility of the main toolbar (i.e., the horizontal toolbar)"
@@ -5476,9 +5473,6 @@ msgstr "Le système de mesure à été changé en {0}"
 msgid "Layer not in list."
 msgstr "Le calque n’est pas dans la liste."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Le calque ''{0}'' doit être dans la liste des calques"
-
 msgid "Default (open, closed, new)"
 msgstr "Défaut (ouvert, fermé, nouveau)"
 
@@ -6280,17 +6274,17 @@ msgstr "Du chemin"
 msgid "Decision"
 msgstr "Décision"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Sélectionnez les valeurs à conserver pour les attributs "
-"suivants.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Afficher les attributs en conflits"
 
 msgid "Show tags with multiple values only"
 msgstr "Afficher les attributs avec des valeurs multiples"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Sélectionnez les valeurs à conserver pour les attributs "
+"suivants.</html>"
+
 msgid "Apply?"
 msgstr "Appliquer ?"
 
@@ -6599,15 +6593,6 @@ msgstr[1] "<b>{0}</b> objets désactivés"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Fermer le filtre pour voir tous les objets.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informations sur l’objet"
-
-msgid "map style"
-msgstr "Modèle de la carte"
-
-msgid "edit counts"
-msgstr "nombre de modifications"
-
 msgid "not in data set"
 msgstr "absent du jeu de données"
 
@@ -6697,6 +6682,15 @@ msgstr "Fait partie de: "
 msgid "In conflict with: "
 msgstr "En conflit avec : "
 
+msgid "Advanced object info"
+msgstr "Informations sur l’objet"
+
+msgid "map style"
+msgstr "Modèle de la carte"
+
+msgid "edit counts"
+msgstr "nombre de modifications"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Cache de styles pour \"{0}\" :"
 
@@ -7470,15 +7464,15 @@ msgstr "Seulement les groupes fermés"
 msgid "Query both open and closed changesets"
 msgstr "Tous les groupes"
 
+msgid "Only changesets owned by myself"
+msgstr "Seulement ceux que je possède"
+
 msgid "User ID:"
 msgstr "Identifiant :"
 
 msgid "User name:"
 msgstr "Nom d’utilisateur :"
 
-msgid "Only changesets owned by myself"
-msgstr "Seulement ceux que je possède"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Seulement ceux de l’utilisateur suivant"
 
@@ -9465,7 +9459,7 @@ msgid "Layer ''{0}'' has no modifications to be saved."
 msgstr "Layer ''{0}'' has no modifications to be saved."
 
 msgid "Layer Name and File Path"
-msgstr "Nom de la couche et nom du réprtoire"
+msgstr "Nom de la couche et nom du répertoire"
 
 msgid "Recommended Actions"
 msgstr "Actions recommandées"
@@ -9775,6 +9769,14 @@ msgstr ""
 "Valeur inattendue pour la clé ''{0}'' dans les préférences, actuellement "
 "''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Remplir un groupe de modifications et retourner à la fenêtre d’envoi"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+"Ouvrir et utiliser autant de nouveaux groupes de modifications que "
+"nécessaires"
+
 msgid "Please select the upload strategy:"
 msgstr "Sélectionnez la méthode d’envoi :"
 
@@ -9794,14 +9796,6 @@ msgstr ""
 "<html><strong>Plusieurs groupes de modifications</strong> sont nécessaires "
 "pour envoyer {0} objets. Quelle méthode voulez-vous utiliser ?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Remplir un groupe de modifications et retourner à la fenêtre d’envoi"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-"Ouvrir et utiliser autant de nouveaux groupes de modifications que "
-"nécessaires"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Télécharger en une fois vers le serveur OSM n’est pas possible (trop "
@@ -10597,11 +10591,8 @@ msgstr "Il n’’y a pas de calque d’’imagerie."
 msgid "No imagery layers"
 msgstr "Aucun calque d’’imagerie"
 
-msgid "Velocity, km/h"
-msgstr "Vélocité, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Heure"
@@ -10609,6 +10600,9 @@ msgstr "Heure"
 msgid "Direction"
 msgstr "Sens"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "point GPS"
 
@@ -10777,15 +10771,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Impossible de trouver l''image \"{0}\""
 
+msgid "Save Access Token in preferences"
+msgstr "Enregistrer l’autorisation d’accès"
+
 msgid "Access Token Key:"
 msgstr "Clé de l’autorisation d’accès :"
 
 msgid "Access Token Secret:"
 msgstr "Secret de l’autorisation d’accès :"
 
-msgid "Save Access Token in preferences"
-msgstr "Enregistrer l’autorisation d’accès"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12545,6 +12539,11 @@ msgstr "Modèle d’attributs interne"
 msgid "The default preset for JOSM"
 msgstr "Le modèle d’attributs par défaut de JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Le greffon {0} est encore requis par ce greffon :"
+msgstr[1] "Le greffon {0} est encore requis par ces {1} greffons :"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Greffon intégré à JOSM"
 
@@ -12555,11 +12554,6 @@ msgstr ""
 "Veuillez cliquer sur <strong>Télécharger la liste</strong> pour afficher la "
 "liste des greffons disponibles."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Le greffon {0} est encore requis par ce greffon :"
-msgstr[1] "Le greffon {0} est encore requis par ces {1} greffons :"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0} : Version {1} (version locale : {2})"
 
@@ -12647,6 +12641,9 @@ msgstr "Modifier l’adresse web de téléchargement des greffons."
 msgid "JOSM Plugin description URL"
 msgstr "Adresse web de téléchargement des greffons."
 
+msgid "Update interval (in days):"
+msgstr "Intervalle de mise à jour (jours) :"
+
 msgid "Ask before updating"
 msgstr "Demander ce qu’il faut faire"
 
@@ -12661,9 +12658,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr "Quand des mises à jour sont disponibles au démarrage :"
 
-msgid "Update interval (in days):"
-msgstr "Intervalle de mise à jour (jours) :"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12779,12 +12773,12 @@ msgstr "Rijksdriehoekscoördinaten (Pays-Bas)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 (Suède)"
 
-msgid "Projection method"
-msgstr "Projection :"
-
 msgid "Projection code"
 msgstr "Code :"
 
+msgid "Projection method"
+msgstr "Projection :"
+
 msgid "Display coordinates as"
 msgstr "Coordonnées :"
 
@@ -13045,6 +13039,9 @@ msgstr ""
 "Impossible dʼenregistrer lʼautorisation dʼaccès OAuth vers le gestionnaire "
 "de mot de passe."
 
+msgid "Save to preferences"
+msgstr "Enregistrer l’autorisation d’accès"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13054,9 +13051,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Vous possédez déjà  une autorisation d’accès"
 
-msgid "Save to preferences"
-msgstr "Enregistrer l’autorisation d’accès"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Lancer le processus d’autorisation OAuth"
 
@@ -14344,9 +14338,6 @@ msgstr ""
 "La valeur longue pour l’attribut ''{0}'' est erronée. Actuellement elle est "
 "{1}."
 
-msgid "{0} bytes have been read"
-msgstr "{0} octets ont été lus"
-
 msgid "Prepare OSM data..."
 msgstr "Préparation des données…"
 
@@ -14467,6 +14458,9 @@ msgstr ""
 "La version du fichier WMS n’est pas supportée ; version {0} trouvée, version "
 "{1} attendue"
 
+msgid "{0} bytes have been read"
+msgstr "{0} octets ont été lus"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15865,8 +15859,8 @@ msgstr "(Le rapport a déjà été copié dans votre presse-papier.)"
 msgid ""
 "Opening the bug report failed. Please report manually using this website:"
 msgstr ""
-"L'ouverture du rapport de bug a échoué. Veuillez rapporter manuellement "
-"l'erreur à l'adresse :"
+"L''ouverture du rapport de bug a échoué. Veuillez rapporter manuellement "
+"l''erreur à l''adresse :"
 
 msgid ""
 "Error in search expression on position {0} - right side of or(|) expression "
@@ -16503,6 +16497,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17598,7 +17595,7 @@ msgid ""
 "Includes a validator and a mappaint style for indoor-data."
 msgstr ""
 "Assiste la cartographie OSM des intérieurs. Inclut un validateur et un style "
-"pour les données d'intérieur."
+"pour les données d''intérieur."
 
 msgid ""
 "Extra information about current layer objects pop ups - currently GPX "
@@ -17660,6 +17657,9 @@ msgstr ""
 "pouvez créer, fermer, invalider, ré-ouvrir et commenter les signalements en "
 "utilisant ce greffon."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19736,6 +19736,12 @@ msgstr "sens horaire"
 msgid "Pedestrian Crossing"
 msgstr "Passage piéton"
 
+msgid "Tactile Paving"
+msgstr "Bande rugueuse"
+
+msgid "incorrect"
+msgstr "incorrect"
+
 msgid "In case of traffic signals:"
 msgstr "En cas de feux de signalisation:"
 
@@ -19926,6 +19932,9 @@ msgstr "Fossé"
 msgid "Kerb"
 msgstr "Bordure"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrée (Ouverture d’une barrière)"
 
@@ -20922,12 +20931,6 @@ msgstr "Gare routière"
 msgid "Bus Stop"
 msgstr "Arrêt de bus"
 
-msgid "Tactile Paving"
-msgstr "Bande rugueuse"
-
-msgid "incorrect"
-msgstr "incorrect"
-
 msgid "Bus Platform"
 msgstr "Plateforme de bus"
 
@@ -25666,10 +25669,10 @@ msgid "Test"
 msgstr "Essai"
 
 msgid "Even housenumber in odd address interpolation."
-msgstr "Numéro de rue pair dans une interpolation d'adresses impaires."
+msgstr "Numéro de rue pair dans une interpolation d''adresses impaires."
 
 msgid "Odd housenumber in even address interpolation."
-msgstr "Numéro de rue impair dans une interpolation d'adresses paires."
+msgstr "Numéro de rue impair dans une interpolation d''adresses paires."
 
 msgid "Way with {0}. Tag each housenumber separately if possible."
 msgstr ""
@@ -25768,7 +25771,7 @@ msgid ""
 "{0} is unspecific. Instead use the key fixme with the information what "
 "exactly should be fixed in the value of fixme."
 msgstr ""
-"{0} n'est pas spécifique. Utilisez fixme à la place, avec l'élément à "
+"{0} n''est pas spécifique. Utilisez fixme à la place, avec l''élément à "
 "corriger."
 
 msgid "{0} is deprecated. Please use instead a multipolygon."
@@ -25832,6 +25835,9 @@ msgstr "{0} est obsolète. A la place, utilisez {1}: préfixe de clé."
 msgid "questionable key (ending with a number): {0}"
 msgstr "clé douteuse (termine par un numéro): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} sur un nœud. Devrait être employé sur un chemin."
 
@@ -25898,6 +25904,11 @@ msgid ""
 msgstr ""
 "Nœud connecté à la fois à une ligne électrique et à un objet sans rapport."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "abbréviation du nom de rue"
 
@@ -28272,18 +28283,18 @@ msgstr "Télécharger les données de carte en continu en se déplaçant"
 msgid "Toggle the continuous download on/off"
 msgstr "Basculez le téléchargement en continu on/off"
 
-msgid "Download Settings"
-msgstr "Paramètres de téléchargement"
-
-msgid "Settings for the continuous download."
-msgstr "Paramètres pour le téléchargement en continu"
-
 msgid "Activate continuous downloads at startup."
 msgstr "Activer le téléchargement en continu au démarrage"
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Supprimer la fenêtre modale de progression lors du téléchargement."
 
+msgid "Download Settings"
+msgstr "Paramètres de téléchargement"
+
+msgid "Settings for the continuous download."
+msgstr "Paramètres pour le téléchargement en continu"
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30066,6 +30077,9 @@ msgstr ""
 "Centrer la vue sur la localisation de la photo avec les boutons "
 "suivante/précédente"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Mode téléchargement"
 
@@ -32739,6 +32753,15 @@ msgstr "Ouvrir la fenêtre des éléments à réparer"
 msgid "Tool:To-fix"
 msgstr "Outil:À réparer"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Passer"
 
@@ -32754,12 +32777,27 @@ msgstr "Erreur corrigée"
 msgid "Not an error"
 msgstr "Pas d''erreur"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Régler la zone de téléchargement (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "À réparer:Passer l''élément"
 
@@ -32769,6 +32807,9 @@ msgstr "À réparer:Élément corrigé"
 msgid "tofix:Not a Error item"
 msgstr "À réparer:Élément sans erreur"
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Serveur de maintenance"
 
@@ -32782,6 +32823,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Quelque chose a mal tourné, essayez à nouveau"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Impossible de placer un nœud hors du monde."
 
diff --git a/i18n/po/ga.po b/i18n/po/ga.po
index fd5765e..b9d6bfc 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:43+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:43+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/gl.po b/i18n/po/gl.po
index d6d7c95..55457b1 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:44+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:43+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: gl\n"
 "X-Poedit-Language: Galician\n"
 
@@ -3730,9 +3730,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5255,9 +5252,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "a capa non está na lista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "A capa «{0}» debe estar na lista de capas"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -6014,16 +6008,16 @@ msgstr "Vía orixinal"
 msgid "Decision"
 msgstr "Decisión"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Escolla os valores a conservar para as seguintes etiquetas.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Amosar só as etiquetas con conflitos"
 
 msgid "Show tags with multiple values only"
 msgstr "Amosar só as etiquetas con multiples valores"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Escolla os valores a conservar para as seguintes etiquetas.</html>"
+
 msgid "Apply?"
 msgstr "Aplicar?"
 
@@ -6340,15 +6334,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Pechar o diálogo de filtrado para ver todos os obxectos.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Información do obxecto avanzada"
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6438,6 +6423,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr "Información do obxecto avanzada"
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -7173,15 +7167,15 @@ msgstr "Pedir só conxuntos de cambios pechados"
 msgid "Query both open and closed changesets"
 msgstr "Pedir tanto conxuntos de cambios abertos coma pechados"
 
+msgid "Only changesets owned by myself"
+msgstr "Só conxuntos de cambios que me pertencen a min mismo"
+
 msgid "User ID:"
 msgstr "ID do usuario:"
 
 msgid "User name:"
 msgstr "Nome de usuario:"
 
-msgid "Only changesets owned by myself"
-msgstr "Só conxuntos de cambios que me pertencen a min mismo"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Só conxuntos de cambios que lle pertencen ao seguinte ID de usuario"
 
@@ -9249,6 +9243,12 @@ msgstr "Cancela a actualización"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -9266,12 +9266,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -10017,10 +10011,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10029,6 +10020,9 @@ msgstr "Tempo"
 msgid "Direction"
 msgstr "Dirección"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punto gps"
 
@@ -10179,15 +10173,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
+msgid "Save Access Token in preferences"
+msgstr ""
+
 msgid "Access Token Key:"
 msgstr "Clave do código de acceso:"
 
 msgid "Access Token Secret:"
 msgstr "Secreto do código de acceso:"
 
-msgid "Save Access Token in preferences"
-msgstr ""
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -11799,6 +11793,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Complemento empaquetado con JOSM"
 
@@ -11807,11 +11806,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versión {1} (local: {2})"
 
@@ -11903,6 +11897,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr "O intervalo de actualización (en días):"
+
 msgid "Ask before updating"
 msgstr "Preguntar antes de actualizar"
 
@@ -11917,9 +11914,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr "O intervalo de actualización (en días):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12033,12 +12027,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 
-msgid "Projection method"
-msgstr "Método de proxección"
-
 msgid "Projection code"
 msgstr "Código de proxeción"
 
+msgid "Projection method"
+msgstr "Método de proxección"
+
 msgid "Display coordinates as"
 msgstr "Amosar coordenadas como"
 
@@ -12263,6 +12257,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12272,9 +12269,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Vostede xa ten un código de acceso ao servidor OSM mediante OAuth."
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13429,9 +13423,6 @@ msgstr "Falta un atributo requirido «{0}»."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Valor numerico longo para o atributo «{0}». Obtívose «{1}»."
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Preparar os datos de OSM…"
 
@@ -13545,6 +13536,9 @@ msgstr "ficheiros WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versión de ficheiro WMS non admitido; atopouse {0}, esperabase {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15329,6 +15323,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16409,6 +16406,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18421,6 +18421,12 @@ msgstr "no sentido das agullas do reloxo"
 msgid "Pedestrian Crossing"
 msgstr "Cruce peatonal"
 
+msgid "Tactile Paving"
+msgstr "Pavimento táctil"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18609,6 +18615,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19593,12 +19602,6 @@ msgstr "Estación de autobús"
 msgid "Bus Stop"
 msgstr "Parada de autobús"
 
-msgid "Tactile Paving"
-msgstr "Pavimento táctil"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Andén de autobús"
 
@@ -24448,6 +24451,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24513,6 +24519,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26640,16 +26651,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28320,6 +28331,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30833,6 +30847,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30848,12 +30871,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30863,6 +30901,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30874,6 +30915,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/he.po b/i18n/po/he.po
index 0eefe6e..3d13fc8 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:45+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:45+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: he\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3533,9 +3533,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5045,9 +5042,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "השכבה אינה ברשימה."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5770,15 +5764,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "החל?"
 
@@ -6076,15 +6070,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6174,6 +6159,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6893,13 +6887,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8898,6 +8892,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8915,12 +8915,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9670,10 +9664,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9682,6 +9673,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "נקודת gps"
 
@@ -9824,13 +9818,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11394,6 +11388,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "תוסף ארוז עם JOSM"
 
@@ -11402,11 +11401,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11491,6 +11485,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11505,9 +11502,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11621,12 +11615,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "שיטת הטלה"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "שיטת הטלה"
+
 msgid "Display coordinates as"
 msgstr "הצג קורדינטות כ"
 
@@ -11851,6 +11845,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11860,9 +11857,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12984,9 +12978,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "מכין נתוני OSM..."
 
@@ -13097,6 +13088,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "גירסת קובץ WMS לא נתמכת; נמצא {0}, צפי {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14838,6 +14832,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15913,6 +15910,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17898,6 +17898,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr "מעבר חציה"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18086,6 +18092,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19069,12 +19078,6 @@ msgstr "תחנת אוטובוס"
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23924,6 +23927,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23989,6 +23995,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26101,16 +26112,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27778,6 +27789,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30284,6 +30298,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30299,12 +30322,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30314,6 +30352,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30325,6 +30366,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/hi.po b/i18n/po/hi.po
index 48a8313..f465c29 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:46+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:45+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: hi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/hr.po b/i18n/po/hr.po
index dff808d..e4253c3 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:00+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:00+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: hr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3633,9 +3633,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5142,9 +5139,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5862,15 +5856,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Potvrditi?"
 
@@ -6168,15 +6162,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr "Napredne informacije o objektu"
-
-msgid "map style"
-msgstr "stil karte"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6267,6 +6252,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr "Napredne informacije o objektu"
+
+msgid "map style"
+msgstr "stil karte"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6986,15 +6980,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr ""
+
 msgid "User ID:"
 msgstr "Korisnički ID:"
 
 msgid "User name:"
 msgstr "Korisničko ime:"
 
-msgid "Only changesets owned by myself"
-msgstr ""
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -9012,6 +9006,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -9029,12 +9029,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9785,10 +9779,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9797,6 +9788,9 @@ msgstr ""
 msgid "Direction"
 msgstr "Smjer"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9937,13 +9931,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11507,6 +11501,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11515,11 +11514,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11604,6 +11598,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11618,9 +11615,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11734,10 +11728,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11964,6 +11958,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11973,9 +11970,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13095,9 +13089,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13208,6 +13199,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14947,6 +14941,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16022,6 +16019,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18007,6 +18007,12 @@ msgstr "u smjeru kazaljke na satu"
 msgid "Pedestrian Crossing"
 msgstr "Pješački prijelaz"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18195,6 +18201,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19178,12 +19187,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -24033,6 +24036,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24098,6 +24104,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26210,16 +26221,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27884,6 +27895,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30393,6 +30407,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30408,12 +30431,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30423,6 +30461,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30434,6 +30475,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Ne mogu dodati točku van Svijeta"
 
diff --git a/i18n/po/ht.po b/i18n/po/ht.po
index d2b4d52..41b7ba8 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:45+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:44+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/hu.po b/i18n/po/hu.po
index ead054f..6314276 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-01 22:50+0000\n"
-"Last-Translator: Báthory Péter <bathory86p at gmail.com>\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-25 19:50+0000\n"
+"Last-Translator: Zoltan Faludi <Unknown>\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-05-04 04:46+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:46+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: hu\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3828,9 +3828,6 @@ msgstr "Várt elem: „{0}”, kapott érték: „{1}”"
 msgid "value expected"
 msgstr "várt érték"
 
-msgid " (at line {0}, column {1})"
-msgstr " ({0}. sor {1}. oszlopában)"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 "Az UTM vetülethez (''+proj=utm'') szükséges a ''+zone=...'' paraméter "
@@ -3962,7 +3959,7 @@ msgid "Polar Stereographic: Parameter ''{0}'' must be 90 or -90."
 msgstr "Poláris sztereografikus: „{0}” paraméter 90 vagy -90 kell legyen."
 
 msgid "Sinusoidal"
-msgstr ""
+msgstr "Szinuszos"
 
 msgid "Swiss Oblique Mercator"
 msgstr "Svájci ferdetengelyű Mercator"
@@ -5410,9 +5407,6 @@ msgstr "Mérési rendszer módosult erre: {0}"
 msgid "Layer not in list."
 msgstr "A réteg nincs a listában."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "\"{0}\" réteg a rétegek listájában kell legyen"
-
 msgid "Default (open, closed, new)"
 msgstr "Alapértelmezett (nyitás, bezárt, új)"
 
@@ -6196,15 +6190,15 @@ msgstr "Ered. vonal"
 msgid "Decision"
 msgstr "Döntés"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>Kérlek válaszd ki a címkékhez megtartandó értékeket.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Csak az ütköző címkék"
 
 msgid "Show tags with multiple values only"
 msgstr "Csak a több értékel rendelkező címkék"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>Kérlek válaszd ki a címkékhez megtartandó értékeket.</html>"
+
 msgid "Apply?"
 msgstr "Alkalmaz?"
 
@@ -6516,15 +6510,6 @@ msgstr[1] "<p><b>{0}</b> objektum letiltva"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Az összes megjelenítéséhez zárd be a szűrő ablakot.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Fejlett objektum infó"
-
-msgid "map style"
-msgstr "térképsítlus"
-
-msgid "edit counts"
-msgstr "szerkesztésszám"
-
 msgid "not in data set"
 msgstr "nincs az adathalmazban"
 
@@ -6614,6 +6599,15 @@ msgstr "Része: "
 msgid "In conflict with: "
 msgstr "Ütközésben ezzel: "
 
+msgid "Advanced object info"
+msgstr "Fejlett objektum infó"
+
+msgid "map style"
+msgstr "térképsítlus"
+
+msgid "edit counts"
+msgstr "szerkesztésszám"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Stílus cache ehhez: \"{0}\":"
 
@@ -7388,15 +7382,15 @@ msgstr "Csak a lezárt módosításcsomagok lekérdezése"
 msgid "Query both open and closed changesets"
 msgstr "Nyitott és lezárt módosításcsomagok lekérdezése"
 
+msgid "Only changesets owned by myself"
+msgstr "Csak a saját módosításcsomagjaim"
+
 msgid "User ID:"
 msgstr "Felhasználói azonosító:"
 
 msgid "User name:"
 msgstr "Felhasználónév:"
 
-msgid "Only changesets owned by myself"
-msgstr "Csak a saját módosításcsomagjaim"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Csak a következő azonosítójú felhasználó módosításcsomagjai"
 
@@ -9665,6 +9659,12 @@ msgstr "Feltöltés megszakítása"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Nemvárt érték \"{0}\" kulcshoz a beállításokban: \"{1}\""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Egy módosításcsomag megtöltése és visszatérés a feltöltési ablakhoz"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Annyi módosításcsomag nyitása, amennyire szükség van"
+
 msgid "Please select the upload strategy:"
 msgstr "Kérlek válassz feltöltési startégiát:"
 
@@ -9684,12 +9684,6 @@ msgstr ""
 "<html><strong>Több módosításcsomagra</strong> van szükség {0} objektum "
 "feltöltéséhez. Melyik stratégiát szeretnéd használni?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Egy módosításcsomag megtöltése és visszatérés a feltöltési ablakhoz"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Annyi módosításcsomag nyitása, amennyire szükség van"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Feltöltés egy kérésben nem lehetséges (túl sok feltöltendő objektum)"
 
@@ -10480,11 +10474,8 @@ msgstr "Nincsenek légifelvétel-rétegek."
 msgid "No imagery layers"
 msgstr "Nincsenek légifelvétel-rétegek"
 
-msgid "Velocity, km/h"
-msgstr "Sebesség, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Idő"
@@ -10492,6 +10483,9 @@ msgstr "Idő"
 msgid "Direction"
 msgstr "Irány"
 
+msgid "Velocity, {0}"
+msgstr "Sebesség, {0}"
+
 msgid "gps point"
 msgstr "gps pont"
 
@@ -10658,15 +10652,15 @@ msgstr "Nem sikerült értelmezni a térképstílusokat itt: \"{0}\". Hiba: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "A kép nem található ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "A token mentése a beállításokba"
+
 msgid "Access Token Key:"
 msgstr "Elérési token kulcs:"
 
 msgid "Access Token Secret:"
 msgstr "Elérési token titok:"
 
-msgid "Save Access Token in preferences"
-msgstr "A token mentése a beállításokba"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12420,6 +12414,11 @@ msgstr "Belső készlet"
 msgid "The default preset for JOSM"
 msgstr "A JOSM alapértelmezett készlete"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "{0} bővítményre szüksége van ennek a bővítménynek:"
+msgstr[1] "{0} bővítményre szüksége van ennek a {1} bővítménynek:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "JOSM-be csomagolt bővítmény"
 
@@ -12430,11 +12429,6 @@ msgstr ""
 "Az elérhető bővítmények listájának letöltéséhez és megjelenítéséhez kérlek "
 "kattints a <strong>Lista letöltése</strong> gombra."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "{0} bővítményre szüksége van ennek a bővítménynek:"
-msgstr[1] "{0} bővítményre szüksége van ennek a {1} bővítménynek:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Verzió {1} (telepítve: {2})"
 
@@ -12521,6 +12515,9 @@ msgstr "JOSM Bővítmény leíró URL szerkesztése."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM Bővítmény leíró URL"
 
+msgid "Update interval (in days):"
+msgstr "Frissítési intervallum (napban):"
+
 msgid "Ask before updating"
 msgstr "Kérdezz frissítés előtt"
 
@@ -12537,9 +12534,6 @@ msgstr ""
 "Kérlek döntsd el, hogy a JOSM egy frissítés után indulásnál frissítheti-e a "
 "bővítményeket automatikusan."
 
-msgid "Update interval (in days):"
-msgstr "Frissítési intervallum (napban):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12655,12 +12649,12 @@ msgstr "Rijksdriehoekscoördinaten (Hollandia)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (svéd)"
 
-msgid "Projection method"
-msgstr "Velületi rendszer"
-
 msgid "Projection code"
 msgstr "Vetület kódja"
 
+msgid "Projection method"
+msgstr "Velületi rendszer"
+
 msgid "Display coordinates as"
 msgstr "Koordináták megjelenítése mint"
 
@@ -12914,6 +12908,9 @@ msgstr "Nem sikerült lekérni az OAuth elérési tokent az igazoláskezelőtől
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "Nem sikerült elmenteni az OAuth elérési tokent az igazoláskezelőbe."
 
+msgid "Save to preferences"
+msgstr "Mentés a beállításokhoz"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12926,9 +12923,6 @@ msgid ""
 msgstr ""
 "Rendelkezésedre áll egy OAuth hozzáférési token az OSM szerver eléréséhez."
 
-msgid "Save to preferences"
-msgstr "Mentés a beállításokhoz"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Klikkelj az OAuth meghatalmazási folyamat lépéseinek végigviteléhez"
 
@@ -13291,7 +13285,7 @@ msgstr "Készletcsoport {0}"
 
 msgid "Reference {0} is being used before it was defined"
 msgstr ""
-"A(z) {0} beállítás hamarabb kerülne használatba, mint ahogy definiálva van"
+"A(z) {0} referencia hamarabb kerülne használatba, mint ahogy definiálva lett"
 
 msgid "Roles cannot appear more than once"
 msgstr "Szerepek nem jelenhetnek meg egytől többször"
@@ -14178,9 +14172,6 @@ msgstr "Hiányzó kötelező leíró ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Helytelen hosszúszám érték a(z) ''{0}'' leíróban. Kapott: ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bájt volt olvasva"
-
 msgid "Prepare OSM data..."
 msgstr "OSM adatok előkészítése…"
 
@@ -14296,6 +14287,9 @@ msgstr "WMS fájlok (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nemtámogatott WMS fájl verzió; talált {0}, várt {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bájt volt olvasva"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16310,6 +16304,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17466,6 +17463,9 @@ msgstr ""
 "Létrehozhatja, lezárhatja, érvénytelenítheti, újranyithatja ezeket és hozzá "
 "is szólhat a hibajelentésekhez ennek a bővítménynek a használatával."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18015,7 +18015,7 @@ msgid "Motorcar"
 msgstr "Gépkocsi"
 
 msgid "Reference"
-msgstr "Azonosítószám"
+msgstr "Azonosító"
 
 msgid "Operator"
 msgstr "Üzemeltető"
@@ -19093,6 +19093,8 @@ msgid ""
 "Some road types already imply some access restrictions which should not be "
 "set again."
 msgstr ""
+"Néhány úttípus egyben egyfajta behajtási korlátozást is jelent, amit nem "
+"kell még egyszer beállítani."
 
 msgid "No exit (cul-de-sac)"
 msgstr "Zsákutca"
@@ -19525,6 +19527,12 @@ msgstr "óramutatóval megegyező"
 msgid "Pedestrian Crossing"
 msgstr "Gyalogátkelő"
 
+msgid "Tactile Paving"
+msgstr "Vakvezető burkolat"
+
+msgid "incorrect"
+msgstr "helytelen"
+
 msgid "In case of traffic signals:"
 msgstr "Közlekedési jelzések esetében"
 
@@ -19715,6 +19723,9 @@ msgstr "Vizesárok"
 msgid "Kerb"
 msgstr "Szegély"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Sorompós bejárat"
 
@@ -20700,12 +20711,6 @@ msgstr "Autóbusz-állomás"
 msgid "Bus Stop"
 msgstr "Buszmegálló"
 
-msgid "Tactile Paving"
-msgstr "Vakvezető burkolat"
-
-msgid "incorrect"
-msgstr "helytelen"
-
 msgid "Bus Platform"
 msgstr "Autóbuszperon"
 
@@ -21893,7 +21898,7 @@ msgstr "Homokcsapda"
 
 msgctxt "golf"
 msgid "Natural"
-msgstr ""
+msgstr "Természetes"
 
 msgctxt "golf"
 msgid "Frontal Water hazard"
@@ -22499,7 +22504,7 @@ msgstr ""
 
 msgctxt "content"
 msgid "slurry"
-msgstr ""
+msgstr "hígtrágya"
 
 msgctxt "content"
 msgid "water"
@@ -23350,7 +23355,7 @@ msgid "tubular"
 msgstr "csöves"
 
 msgid "solid"
-msgstr ""
+msgstr "tömör"
 
 msgid "steel"
 msgstr "acél"
@@ -23518,7 +23523,7 @@ msgid "Incomplete tower"
 msgstr "Félkész torony"
 
 msgid "Location transition"
-msgstr ""
+msgstr "Elhelyezkedés átvezetés"
 
 msgid "Pole"
 msgstr "Villanypózna"
@@ -25470,10 +25475,10 @@ msgid "incomplete object: only {0} and {1}"
 msgstr "befejezetlen objektum: csak {0} és {1}"
 
 msgid "{0} together with addr:*"
-msgstr ""
+msgstr "{0} addr:* címkével együtt"
 
 msgid "{0} together with {1} and conflicting values"
-msgstr ""
+msgstr "{0}, {1} címkével együtt és ellentmondó az értékük"
 
 msgid "{0} on suspicious object"
 msgstr "{0} gyanús objektumon"
@@ -25500,13 +25505,13 @@ msgid "incomplete usage of {0} on a way without {1}"
 msgstr "a(z) {0} bejezetlen használata egy vonalon {1} nélkül"
 
 msgid "Same value of {0} and {1}"
-msgstr ""
+msgstr "{0} és {1} értéke ugyanaz"
 
 msgid "Same value of {0}, {1} and {2}"
-msgstr ""
+msgstr "{0}, {1} és {2} értéke ugyanaz"
 
 msgid "{0} and {1} together with {2} and conflicting values"
-msgstr ""
+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}"
@@ -25537,11 +25542,15 @@ msgid ""
 "Wrong usage of {0} tag. Remove {1}, because it is clear that the name is "
 "missing even without an additional tag."
 msgstr ""
+"{0} címke használata helytelen. Töröld a(z) {1} címkét, mert egy további "
+"címke nélkül is egyértelmű, hogy a név hiányzik."
 
 msgid ""
 "{0} is unspecific. Instead use the key fixme with the information what "
 "exactly should be fixed in the value of fixme."
 msgstr ""
+"{0} címke nem meghatározott. Helyette használd a fixme kulcsot az értékében "
+"leírva, hogy pontosan mit kéne javítani."
 
 msgid "{0} is deprecated. Please use instead a multipolygon."
 msgstr "A(z) {0} kivezetésre került. Kérlek, használj inkább multipoligont."
@@ -25576,10 +25585,10 @@ msgstr ""
 "''right'' vagy ''both''."
 
 msgid "Unspecific tag {0}"
-msgstr ""
+msgstr "Meghatározatlan címke {0}"
 
 msgid "Definition of {0} is unclear"
-msgstr ""
+msgstr "{0} definíciója nem világos"
 
 msgid ""
 "{0} is not recommended. Use the Reverse Ways function from the Tools menu."
@@ -25596,12 +25605,15 @@ msgid "{0} is inaccurate"
 msgstr "{0} pontatlan"
 
 msgid "{0} is deprecated for {1}"
-msgstr ""
+msgstr "{0} elavult, {1} helyettesíti"
 
 msgid "{0} is deprecated. Use the {1}: key prefix instead."
-msgstr ""
+msgstr "{0} elavult. Helyette használd a(z) {1}: kulcs előtagot."
 
 msgid "questionable key (ending with a number): {0}"
+msgstr "vitatható kulcs (számra végződik): {0}"
+
+msgid "The key {0} has an uncommon value."
 msgstr ""
 
 msgid "{0} on a node. Should be used on a way."
@@ -25668,6 +25680,13 @@ msgid ""
 "Node connects a power line or cable with an object which is not related to "
 "the power infrastructure."
 msgstr ""
+"A pont egy elektromos távvezetéket köt össze egy objektummal, ami nem az "
+"energia infrastruktúra része."
+
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
 
 msgid "abbreviated street name"
 msgstr "rövidített utca név"
@@ -25682,7 +25701,7 @@ msgid "Unnamed unclassified highway"
 msgstr "Név és kategória nélküli közút"
 
 msgid "highway without a reference"
-msgstr "közút hivatkozás nélkül"
+msgstr "közút útszám nélkül"
 
 msgid "temporary highway type"
 msgstr "ideiglenes közút típus"
@@ -25756,15 +25775,16 @@ msgstr "szokatlan vonatsín nyomtávolság; használj mm-t elválasztó nélkül
 
 msgid "unusual incline; use percentages/degrees or up/down"
 msgstr ""
+"szokatlan incline érték; használj százalékot/fokot, vagy up/down értéket"
 
 msgid "{0} must be a numeric value"
 msgstr "a(z) {0}-nak szám értéket kell adni"
 
 msgid "{0} must be a positive integer number"
-msgstr ""
+msgstr "{0} pozitív egész szám kell legyen"
 
 msgid "unusual value of {0}"
-msgstr ""
+msgstr "{0} értéke szokatlan"
 
 msgid "relation without type"
 msgstr "kapcsolat típus nélkül"
@@ -26103,13 +26123,13 @@ msgid "Can not save preferences"
 msgstr "Nem lehet menteni a beállításokat"
 
 msgid "Epsilon multiplier"
-msgstr ""
+msgstr "Epszilon szorzó"
 
 msgid "Starting Epsilon"
-msgstr ""
+msgstr "Kezdő epszilon"
 
 msgid "Max points count per 1 km"
-msgstr ""
+msgstr "Max pont szám kilométerenként"
 
 msgid "Enter key mode"
 msgstr ""
@@ -26121,28 +26141,28 @@ msgid "Autosimplify"
 msgstr "Automatikus egyszerűsítés"
 
 msgid "Simplify with initial epsilon"
-msgstr ""
+msgstr "Egyszerűsítés kezdeti epszilonnal"
 
 msgid "Save as is"
 msgstr "Mentés mint..."
 
 msgid "Snap to nodes"
-msgstr ""
+msgstr "Pontokra illesztés"
 
 msgid "Add fixed points on click"
-msgstr ""
+msgstr "Fix pont hozzáadása kattintáskor"
 
 msgid "Add fixed points on spacebar"
-msgstr ""
+msgstr "Fix pont hozzáadása szóköz billentyűvel"
 
 msgid "Allow edit existing ways"
-msgstr ""
+msgstr "Meglévő vonalak szerkesztésének engedélyezése"
 
 msgid "Draw closed polygons only"
-msgstr ""
+msgstr "Csak zárt poligonok rajzolása"
 
 msgid "FastDraw configuration"
-msgstr ""
+msgstr "FastDraw konfigurálása"
 
 msgid "Try copying tags from properties table"
 msgstr ""
@@ -26635,20 +26655,24 @@ msgid "Starting address number must be less than ending address number"
 msgstr ""
 
 msgid "Align Way Segments"
-msgstr ""
+msgstr "Vonalszakasz igazítása"
 
 msgid "Align Ways"
-msgstr ""
+msgstr "Vonalak igazítása"
 
 msgid ""
 "Please select two segments that don''t share any nodes.\n"
 "Alternatively put the pivot on their common node.\n"
 msgstr ""
+"Válassz két szakaszt, amiknek nincs közös pontja.\n"
+"Vagy helyezd a tengelyt a közös pontjukra.\n"
 
 msgid ""
 "Aligning would result nodes ''outside the world''.\n"
 "Alignment not possible.\n"
 msgstr ""
+"Az igazítás a „világon kívüli” pontokat eredményezne.\n"
+"Az igazítás nem lehetséges.\n"
 
 msgid ""
 "There is at least a non-pivot endpoint of the alignee that joins more than "
@@ -26691,10 +26715,10 @@ msgid "This panel activates in Align Ways mode:"
 msgstr ""
 
 msgid "Length preserved"
-msgstr ""
+msgstr "Hossztartó"
 
 msgid "Angle preserved"
-msgstr ""
+msgstr "Szögtartó"
 
 msgid "Align with:"
 msgstr "Igazítás ezzel:"
@@ -26906,10 +26930,10 @@ msgid "updated building info"
 msgstr "frissített épület információ"
 
 msgid "Tag Element"
-msgstr "elem cimke"
+msgstr "Épület címkézése"
 
 msgid "Select an item to tag."
-msgstr ""
+msgstr "Válassz egy címkézendő elemet."
 
 msgid "Tag Building"
 msgstr ""
@@ -27077,32 +27101,34 @@ msgid "Set width of the building"
 msgstr "Állítsd be az épület szélességét"
 
 msgid "Merge address points"
-msgstr ""
+msgstr "Lakcím pontok beolvasztása"
 
 msgid "Move tags from address nodes inside buildings to building ways"
-msgstr ""
+msgstr "Az épületeken belüli lakcím pontok címkéit az épületekre helyezi át"
 
 msgid "Select both address nodes and building ways to merge"
 msgstr ""
+"Válaszd ki a lakcímet tartalmazó pontokat valamint az épület vonalakat, "
+"amivel egyesítenéd"
 
 msgid "No address nodes found in the selection"
-msgstr ""
+msgstr "A kijelölésben nem található lakcím pont"
 
 msgid "No building ways found in the selection"
-msgstr ""
+msgstr "A kijelölésben nem található épület"
 
 msgid "There is {0} building with multiple address nodes inside"
 msgid_plural "There are {0} buildings with multiple address nodes inside"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Van {0} épület, amin belül több lakcím pont található"
+msgstr[1] "Van {0} épület, amin belül több lakcím pont található"
 
 msgid "There is {0} building with address conflicts"
 msgid_plural "There are {0} buildings with address conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0} épület címe ellentmondásos"
+msgstr[1] "{0} épület címe ellentmondásos"
 
 msgid "No address nodes inside buildings found"
-msgstr ""
+msgstr "Az épületeken belül nem található lakcím pont"
 
 msgid "on polygon"
 msgstr "poligonon"
@@ -27142,41 +27168,45 @@ msgstr ""
 "Valószínűleg a gyorsítótár fájl egy korábbi verziója."
 
 msgid "Lambert Zone {0} cache file (.{0})"
-msgstr ""
+msgstr "Lambert {0}. zóna cache fájl (.{0})"
 
 msgid "Lambert CC9 Zone {0} cache file (.CC{0})"
-msgstr ""
+msgstr "Lambert CC9 {0}. zóna cache fájl (.{0})"
 
 msgid "Guadeloupe Fort-Marigot cache file (.UTM1)"
-msgstr ""
+msgstr "Guadeloupe Fort-Marigot cache fájl (.UTM1)"
 
 msgid "Guadeloupe Ste-Anne cache file (.UTM2)"
-msgstr ""
+msgstr "Guadeloupe Ste-Anne cache fjál (.UTM2)"
 
 msgid "Martinique Fort Desaix cache file (.UTM3)"
-msgstr ""
+msgstr "Martinique Fort Desaix cache fájl (.UTM3)"
 
 msgid "Reunion RGR92 cache file (.UTM4)"
-msgstr ""
+msgstr "Reunion RGR92 cache fájl (.UTM4)"
 
 msgid "CadastreGrabber: Illegal url."
-msgstr ""
+msgstr "CadastreGrabber: illegális url."
 
 msgid ""
 "Cannot open a new client session.\n"
 "Server in maintenance or temporary overloaded."
 msgstr ""
+"Nem nyitható új kliens munkamenet.\n"
+"A kiszolgálón karbantartást végeznek, vagy átmenetileg túlterhelt."
 
 msgid ""
 "Town/city {0} not found or not available\n"
 "or action canceled"
 msgstr ""
+"{0} település nem található, vagy nem elérhető\n"
+"vagy a művelet megszakadt"
 
 msgid "Choose from..."
 msgstr "Válasszon a következőkből:"
 
 msgid "Select commune"
-msgstr ""
+msgstr "Commune kiválasztása"
 
 msgid "Auto sourcing"
 msgstr ""
@@ -27657,7 +27687,7 @@ msgstr ""
 "zónával {1}"
 
 msgid "Cache Lambert Zone Error"
-msgstr "Gyorsítótár Lambert Zóna Hiba"
+msgstr "Lambert Zóna hiba gyorsítótárazás"
 
 msgid "canvec tile helper"
 msgstr "CanVec csempe segítő"
@@ -27666,13 +27696,13 @@ msgid "Use"
 msgstr "Használ"
 
 msgid "Please select a scheme to use."
-msgstr "Kérlek, válassz egy sémát a használathoz."
+msgstr "Kérlek, válaszd ki a használni kívánt sémát."
 
 msgid "Color Scheme"
 msgstr "Színséma"
 
 msgid "Please select the scheme to delete."
-msgstr "Kérlek, válassz egy sémát a törléshez."
+msgstr "Kérlek, válaszd ki a törlendő sémát."
 
 msgid "Use the selected scheme from the list."
 msgstr "Használd a listából kiválasztott sémát."
@@ -27687,178 +27717,182 @@ msgid "Color Schemes"
 msgstr "Színsémák"
 
 msgid "Conflate object pair"
-msgstr ""
+msgstr "Objektum párok összeolvasztása"
 
 msgid "Added {0} object to subject layer"
 msgid_plural "Added {0} objects to subject layer"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0} objektum a tárgy réteghez adva"
+msgstr[1] "{0} objektum a tárgy réteghez adva"
 
 msgid "Conflation"
-msgstr ""
+msgstr "Összevon"
 
 msgid "Activates the conflation plugin"
-msgstr ""
+msgstr "Aktiválja az összeolvasztó bővítményt"
 
 msgid "Matches"
-msgstr ""
+msgstr "Egyezések"
 
 msgid "Reference only"
-msgstr ""
+msgstr "Csak a referencia"
 
 msgid "Subject only"
-msgstr ""
+msgstr "Csak a cél"
 
 msgid "Matches ({0})"
-msgstr ""
+msgstr "Egyezések ({0})"
 
 msgid "Reference only ({0})"
-msgstr ""
+msgstr "Csak referenciák ({0})"
 
 msgid "Subject only ({0})"
-msgstr ""
+msgstr "Csak célok ({0})"
 
 msgid "Configure"
 msgstr "Konfiguráció"
 
 msgid "Configure conflation options"
-msgstr ""
+msgstr "Összeolvasztás beállításai"
 
 msgid "Delete {0} conflation matches"
-msgstr ""
+msgstr "{0} összevonás egyezés törlése"
 
 msgid "Remove {0} unmatched objects"
-msgstr ""
+msgstr "{0} nem egyező objektum eltávolítása"
 
 msgid "Remove selected matches"
-msgstr ""
+msgstr "Kiválasztott egyezések eltávolítása"
 
 msgid "Conflate"
-msgstr ""
+msgstr "Összevon"
 
 msgid "Conflate selected objects"
-msgstr ""
+msgstr "Kiválasztott objektumok összevonása"
 
 msgid "Conflation: {0}"
-msgstr ""
+msgstr "Összeolvasztás: {0}"
 
 msgid "Cannot replace geometry."
 msgstr "Nem lehet lecserélni a geometriát."
 
 msgid "Zoom to selected primitive(s)"
-msgstr ""
+msgstr "Kijelölt elemekre nagyítás"
 
 msgid "Select selected primitive(s)"
-msgstr ""
+msgstr "Kiválasztott elemek kijelölése"
 
 msgid "Select the primitives currently selected in the list"
-msgstr ""
+msgstr "Kijelöli a listában jelenleg kiválasztott elemeket"
 
 msgid "Match finder settings"
-msgstr ""
+msgstr "Egyezés kereső beállításai"
 
 msgid "Match finder method"
-msgstr ""
+msgstr "Egyezés kereső módszer"
 
 msgid "Threshold distance"
-msgstr ""
+msgstr "Küszöbtávolság"
 
 msgid "Distances greater than this will result in a score of zero."
-msgstr ""
+msgstr "Az ennél nagyobb távolságok nulla súlyt kapnak"
 
 msgid "Centroid distance"
-msgstr ""
+msgstr "Centroid távolság"
 
 msgid "Hausdorff distance"
-msgstr ""
+msgstr "Hausdorff távolság"
 
 msgid "Configure conflation settings"
-msgstr ""
+msgstr "Összeolvasztás beállításai"
 
 msgid "Generate matches"
-msgstr ""
+msgstr "Egyezések keresése"
 
 msgid "Layer:"
-msgstr ""
+msgstr "Réteg:"
 
 msgid "{0}: 0 / {1}: 0 / {2}: 0"
-msgstr ""
+msgstr "{0}: 0 / {1}: 0 / {2}: 0"
 
 msgid "Subject"
 msgstr "Tárgy"
 
 msgid "Selections must be made for both reference and subject."
-msgstr ""
+msgstr "A referencia és a cél számára is kell kijelölés"
 
 msgid "Incomplete selections"
-msgstr ""
+msgstr "Félkész kijelölések"
 
 msgid "Restore subject selection"
-msgstr ""
+msgstr "Cél kijelölés visszaállítása"
 
 msgid "Restore reference selection"
-msgstr ""
+msgstr "Referencia kijelölés visszaállítása"
 
 msgid "Freeze subject selection"
-msgstr ""
+msgstr "Cél kijelölés fagyasztása"
 
 msgid "No valid OSM data layer present."
-msgstr ""
+msgstr "Nem található érvényes OSM adatréteg"
 
 msgid "Error freezing selection"
-msgstr ""
+msgstr "Kijelölés fagyasztása sikertelen"
 
 msgid "Nothing is selected, please try again."
-msgstr ""
+msgstr "Nincs semmi kijelölve, próbáld újra."
 
 msgid "Empty selection"
-msgstr ""
+msgstr "Üres kijelölés"
 
 msgid "Freeze reference selection"
-msgstr ""
+msgstr "Referencia kijelölés fagyasztása"
 
 msgid "{0}: {1} / {2}: {3} / {4}: {5}"
-msgstr ""
+msgstr "{0}: {1} / {2}: {3} / {4}: {5}"
 
 msgid "Invalid reference or subject"
-msgstr ""
+msgstr "Érvénytelen referencia vagy cél"
 
 msgid "Download OSM data continuously"
-msgstr ""
+msgstr "OSM adatok folyamatos letöltése"
 
 msgid "Download map data continuously when paning and zooming."
-msgstr ""
+msgstr "Térképadatok letöltése mozgatás és zommolás közben folyamatosan."
 
 msgid "Toggle the continuous download on/off"
-msgstr ""
-
-msgid "Download Settings"
-msgstr ""
-
-msgid "Settings for the continuous download."
-msgstr ""
+msgstr "Folyamatos letöltés ki/be kapcsolása"
 
 msgid "Activate continuous downloads at startup."
-msgstr ""
+msgstr "Folyamatos letöltés aktiválása indításkor"
 
 msgid "Supress the default modal progress monitor when downloading."
-msgstr ""
+msgstr "Letöltés közben ne mutassa a modális állapotjelző ablakot."
+
+msgid "Download Settings"
+msgstr "Letöltési beállítások"
+
+msgid "Settings for the continuous download."
+msgstr "Folyamatos letöltés beállításai"
 
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
 msgstr ""
+"Ha a bővítmény indításkor aktív. Ez az alapértelmezett állapot nem változik, "
+"ha a kapcsolgatod bővítményt a menüben."
 
 msgid ""
 "Maximum number of threads used for downloading, increasing this will cause "
 "the client to send more concurrent queries to the server."
 msgstr ""
+"A letöltéshez használt szálak maximális száma. Növelve a kliens párhuzamosan "
+"több kérést küld a szervernek."
 
 msgid "Requires restart"
-msgstr ""
+msgstr "Újraindítást igényel"
 
 msgid "Max threads"
-msgstr ""
+msgstr "Max szálak"
 
 msgid "Maximum number of boxes to download for each pan/zoom."
 msgstr ""
@@ -29523,6 +29557,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -32064,6 +32101,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -32079,12 +32125,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32094,6 +32155,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32105,6 +32169,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Nem lehet pontot helyezni a világon kívülre."
 
diff --git a/i18n/po/hy.po b/i18n/po/hy.po
index 8fb0305..0332e6c 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:33+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:33+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: hy\n"
 
 msgid "Cancel"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ia.po b/i18n/po/ia.po
index 058fd22..bc00119 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:47+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:47+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ia\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/id.po b/i18n/po/id.po
index b740a9e..b4f94cf 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:48+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:47+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: id\n"
 "X-Language: id_ID\n"
 
@@ -3742,9 +3742,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (pada garis {0}, kolom {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5293,9 +5290,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "Layer tidak terdapat dalam daftar"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Layer ''{0}'' berada dalam daftar layers"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -6040,15 +6034,15 @@ msgstr "Orig. Way/garis"
 msgid "Decision"
 msgstr "Keputusan"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>Mohon pilih value yang akan disimpan berikut tag .</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Hanya menampilkan tag dengan konflik"
 
 msgid "Show tags with multiple values only"
 msgstr "Hanya menunjukkan tag dengan multiple value"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>Mohon pilih value yang akan disimpan berikut tag .</html>"
+
 msgid "Apply?"
 msgstr "Terapkan?"
 
@@ -6356,15 +6350,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Tutup saringan dialog untuk melihat semua objek.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Lanjutan info objek"
-
-msgid "map style"
-msgstr "Model peta"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "Bukan set data"
 
@@ -6453,6 +6438,15 @@ msgstr "Bagian dari: "
 msgid "In conflict with: "
 msgstr "Konflik dengan: "
 
+msgid "Advanced object info"
+msgstr "Lanjutan info objek"
+
+msgid "map style"
+msgstr "Model peta"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "tipe Cache untuk \"{0}\":"
 
@@ -7195,15 +7189,15 @@ msgstr "Query tertutup hanya pada set perubahan"
 msgid "Query both open and closed changesets"
 msgstr "Query baik set perubahan terbuka dan tertutup"
 
+msgid "Only changesets owned by myself"
+msgstr "Hanya set perubahan yang dimiliki sendiri"
+
 msgid "User ID:"
 msgstr "ID pengguna:"
 
 msgid "User name:"
 msgstr "Nama Pengguna:"
 
-msgid "Only changesets owned by myself"
-msgstr "Hanya set perubahan yang dimiliki sendiri"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Hanya set perubahan yang dimiliki pengguna dengan ID pengguna yang mengikuti"
@@ -9393,6 +9387,12 @@ msgstr "Batalkan proses upload"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Mengisi satu changeset dan kembali ke dialog unggah"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Buka dan gunakan sebagai changeset baru sebanyak yang diperlukan"
+
 msgid "Please select the upload strategy:"
 msgstr "Silahkan pilih strategi upload"
 
@@ -9412,12 +9412,6 @@ msgstr ""
 "<html>Ada beberapa <strong>set perubahan</ strong> yang diperlukan untuk "
 "meng-upload {0} obyek. Strategi mana yang ingin Anda gunakan? </ Html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Mengisi satu changeset dan kembali ke dialog unggah"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Buka dan gunakan sebagai changeset baru sebanyak yang diperlukan"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Unggah dalam satu permintaan tidak mungkin (terlalu banyak objek untuk "
@@ -10184,10 +10178,7 @@ msgstr "Disana tidak ada lapisan citra satelit"
 msgid "No imagery layers"
 msgstr "Tidak ada lapisan citra satelit"
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10196,6 +10187,9 @@ msgstr "Waktu"
 msgid "Direction"
 msgstr "Arah"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "titik gps"
 
@@ -10354,15 +10348,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Gagal untuk menemukan gambar \"{0}\""
 
+msgid "Save Access Token in preferences"
+msgstr "Simpan akses token di preferensi"
+
 msgid "Access Token Key:"
 msgstr "Akses Kunci Token:"
 
 msgid "Access Token Secret:"
 msgstr "Akses Rahasia Token:"
 
-msgid "Save Access Token in preferences"
-msgstr "Simpan akses token di preferensi"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12102,6 +12096,10 @@ msgstr "Internal Preset"
 msgid "The default preset for JOSM"
 msgstr "Pengaturan awal preset untuk JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Plugin {0} masih diperlukan oleh plugin {1} ini:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plugin digabungkan dengan JOSM"
 
@@ -12112,10 +12110,6 @@ msgstr ""
 "Mohon klik<strong>Daftar Download </strong> untuk mendownload dan daftar "
 "layar dari plugin yang tersedia."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Plugin {0} masih diperlukan oleh plugin {1} ini:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versi {1} (lokal: {2})"
 
@@ -12203,6 +12197,9 @@ msgstr "mengedit deskripsi URL JOSM plugin"
 msgid "JOSM Plugin description URL"
 msgstr "Deskripsi URL JOSM plugin"
 
+msgid "Update interval (in days):"
+msgstr "Perbarui interval (dalam hari):"
+
 msgid "Ask before updating"
 msgstr "Bertanya sebelum memperbaharui"
 
@@ -12219,9 +12216,6 @@ msgstr ""
 "Silakan memutuskan apakah JOSM otomatis akan mengupdate plugin aktif pada "
 "startup setelah update JOSM sendiri."
 
-msgid "Update interval (in days):"
-msgstr "Perbarui interval (dalam hari):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12337,12 +12331,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Swedia)"
 
-msgid "Projection method"
-msgstr "Metode Proyeksi"
-
 msgid "Projection code"
 msgstr "Kode Proyeksi"
 
+msgid "Projection method"
+msgstr "Metode Proyeksi"
+
 msgid "Display coordinates as"
 msgstr "Tampilan koordinat sebagai"
 
@@ -12584,6 +12578,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "Simpan ke pengaturan"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12596,9 +12593,6 @@ msgid ""
 msgstr ""
 "Anda sudah memiliki akses Token untuk mengakses server OSM menggunakan OAuth."
 
-msgid "Save to preferences"
-msgstr "Simpan ke pengaturan"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Klik untuk melangkah melalui proses otorisasi OAuth"
 
@@ -13796,9 +13790,6 @@ msgstr "Atribut yang dibutuhkan hilang ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "nilai atribut yang panjang ilegal '' {0}''. Memiliki'' {1}''."
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Menyiapkan data OSM..."
 
@@ -13910,6 +13901,9 @@ msgstr "Berkas WMS  (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "tidak mendukung file WMS versi; ditemukan {0}, diharapkan {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15811,6 +15805,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16929,6 +16926,9 @@ msgstr ""
 "membuat, menutup, membatalkan, membuka kembali dan komentar laporan bug "
 "dengan menggunakan plugin ini."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18964,6 +18964,12 @@ msgstr "Serarah jarum jam"
 msgid "Pedestrian Crossing"
 msgstr "Penyebrangan Pedestrian"
 
+msgid "Tactile Paving"
+msgstr "Tactile Paving"
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19152,6 +19158,9 @@ msgstr "Parit"
 msgid "Kerb"
 msgstr "Separator"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -20135,12 +20144,6 @@ msgstr "Terminal Bus"
 msgid "Bus Stop"
 msgstr "Bus Stop"
 
-msgid "Tactile Paving"
-msgstr "Tactile Paving"
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Peron Bus"
 
@@ -24992,6 +24995,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25057,6 +25063,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "mempersingkat nama jalan"
 
@@ -27331,16 +27342,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29099,6 +29110,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31714,6 +31728,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31729,12 +31752,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31744,6 +31782,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31755,6 +31796,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Tidak dapat menempatkan sebuah node/titik di luar permukaan bumi."
 
diff --git a/i18n/po/is.po b/i18n/po/is.po
index cd2a743..3e1b916 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:47+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:46+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: is\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3539,9 +3539,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5049,9 +5046,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5766,15 +5760,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6072,15 +6066,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6170,6 +6155,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6892,13 +6886,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8906,6 +8900,12 @@ msgstr "Hætta við að hlaða upp"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8923,12 +8923,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9670,10 +9664,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9682,6 +9673,9 @@ msgstr ""
 msgid "Direction"
 msgstr "Átt"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9822,13 +9816,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11398,6 +11392,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11408,11 +11407,6 @@ msgstr ""
 "Vinsamlega smelltu á <strong>Sækja lista</strong> til að sækja og sýna lista "
 "af tiltækum íforritum."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11499,6 +11493,9 @@ msgstr "Breyta viðbótarþjóni."
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11513,9 +11510,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11629,12 +11623,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Vörpun"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Vörpun"
+
 msgid "Display coordinates as"
 msgstr "Sýna hnit sem"
 
@@ -11859,6 +11853,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11868,9 +11865,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12992,9 +12986,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Undirbý OSM gögn..."
 
@@ -13106,6 +13097,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14848,6 +14842,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15924,6 +15921,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17909,6 +17909,12 @@ msgstr "réttsælis"
 msgid "Pedestrian Crossing"
 msgstr "Gangbraut"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18097,6 +18103,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19080,12 +19089,6 @@ msgstr "Strætóstöð"
 msgid "Bus Stop"
 msgstr "Strætóstopp"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23935,6 +23938,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24000,6 +24006,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26112,16 +26123,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27786,6 +27797,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30291,6 +30305,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30306,12 +30329,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30321,6 +30359,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30332,6 +30373,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/it.po b/i18n/po/it.po
index c64c127..5362769 100644
--- a/i18n/po/it.po
+++ b/i18n/po/it.po
@@ -4,16 +4,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm 20081003\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 09:28+0000\n"
-"Last-Translator: venerdi <Unknown>\n"
+"POT-Creation-Date: 2016-05-30 03:38+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"
 "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-05-04 04:48+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:48+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: it\n"
 "X-Language: it_IT\n"
 "X-Source-Language: en\n"
@@ -1477,8 +1477,8 @@ msgstr "Divide un percorso in corrispondenza del nodo selezionato."
 
 msgid "Cannot split since another split operation is already in progress"
 msgstr ""
-"Non è possibile dividere finché un'altra operazione di divisione è ancora in "
-"corso"
+"Non è possibile dividere finché un''altra operazione di divisione è ancora "
+"in corso"
 
 msgid ""
 "The current selection cannot be used for splitting - no node is selected."
@@ -1629,10 +1629,10 @@ msgid "Unglue"
 msgstr "Disincollare"
 
 msgid "Where should the tags of the node be put?"
-msgstr ""
+msgstr "Dove dovrebbero essere messe le etichette del nodo?"
 
 msgid "Where should the memberships of this node be put?"
-msgstr ""
+msgstr "Dove dovrebbe essere messa l''appartenenza del nodo?"
 
 msgid "Unglued Node"
 msgstr "Nodo staccato"
@@ -1674,8 +1674,8 @@ msgstr[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] "Assicurarsi che la relazione non sia stata interrotta!"
+msgstr[1] "Assicurarsi che le relazioni non siano state interrotte!"
 
 msgid "Disconnect Node from Way"
 msgstr "Disconnetti nodo da percorso"
@@ -2430,6 +2430,8 @@ msgid ""
 "Are you sure that you want to move elements with attached ways that are "
 "hidden by filters?"
 msgstr ""
+"Si desiderano veramente spostare gli elementi con i relativi tracciati che "
+"sono stati nascosti dai filtri?"
 
 msgid ""
 "You moved more than {0} element. Moving a large number of elements is often "
@@ -2889,8 +2891,8 @@ msgstr "Ricerca in corso"
 
 msgid "Searching in {0} object"
 msgid_plural "Searching in {0} objects"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Ricerca in {0} oggetto"
+msgstr[1] "Ricerca in {0} oggetti"
 
 msgid "No match found for ''{0}''"
 msgstr "Nessuna corrispondenza trovata per ''{0}''"
@@ -3904,14 +3906,11 @@ msgid "areatext"
 msgstr "testo dell''area"
 
 msgid "Expected element ''{0}'', but got ''{1}''"
-msgstr ""
+msgstr "Atteso elemento ''{0}'', ma ottenuto ''{1}''"
 
 msgid "value expected"
 msgstr "valore atteso"
 
-msgid " (at line {0}, column {1})"
-msgstr " (alla linea {0}, colonna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "proiezione UTM (''+proj=utm'') richiede ''+zone=...'' parametro."
 
@@ -3920,7 +3919,7 @@ msgstr ""
 "Richiesto valore intero compreso tra 1-60 per parametro ''+zone=...''"
 
 msgid "No unit found for: {0}"
-msgstr ""
+msgstr "Nessuna unità trovata per: {0}"
 
 msgid "Parameter must begin with a ''+'' character (found ''{0}'')"
 msgstr "Il parametro deve iniziare con un carattere ''+'' (trovato ''{0}'')"
@@ -4039,7 +4038,7 @@ msgid "Illegal value for parameter ''{0}'': {1}"
 msgstr "Valore non ammesso per il parametro ''{0}'': {1}"
 
 msgid "error in initialization"
-msgstr "errore nell'inizializzazione"
+msgstr "errore nell''inizializzazione"
 
 msgid "Polar Stereographic"
 msgstr "Stereografica Polare"
@@ -5531,9 +5530,6 @@ msgstr "Sistema di misurazione modificato in {0}"
 msgid "Layer not in list."
 msgstr "livello non in lista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Il livello ''{0}'' deve essere contenuto in una lista di livelli"
-
 msgid "Default (open, closed, new)"
 msgstr "Predefinito (opri, chiudi, nuovo)"
 
@@ -6345,16 +6341,16 @@ msgstr "Percorso Orig."
 msgid "Decision"
 msgstr "Decisione"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Selezionare i valori da mantenere per le etichette seguenti.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Visualizza solamente le etichette con conflitti"
 
 msgid "Show tags with multiple values only"
 msgstr "Visualizza solamente le etichette con valori multipli"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Selezionare i valori da mantenere per le etichette seguenti.</html>"
+
 msgid "Apply?"
 msgstr "Applicare?"
 
@@ -6547,13 +6543,13 @@ msgstr "Risolvi i conflitti per ''{0}''"
 
 msgid "Please confirm to remove <strong>{0} object</strong>."
 msgid_plural "Please confirm to remove <strong>{0} objects</strong>."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Confermare la rimozione di <strong>{0} oggetto</strong>."
+msgstr[1] "Confermare la rimozione di <strong>{0} oggetti</strong>."
 
 msgid "{0} relation is affected."
 msgid_plural "{0} relations are affected."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{0} relazione coinvolta"
+msgstr[1] "{0} relazioni coinvolte"
 
 msgid "Deleting {0} object"
 msgid_plural "Deleting {0} objects"
@@ -6621,6 +6617,8 @@ msgstr "Filtri nascosti:{0} Disabilitati:{1}"
 
 msgid "<html>Error in filter <code>{0}</code>:<br>{1}"
 msgstr ""
+"Copy text \t\r\n"
+"<html>Errore nel filtro <code>{0}</code>:<br>{1}"
 
 msgid "Error in filter"
 msgstr "Errore nel filtro"
@@ -6678,15 +6676,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Chiudi la finestra di filtro per vedere tutti gli oggetti.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informazioni avanzate sull''oggetto"
-
-msgid "map style"
-msgstr "stile della mappa"
-
-msgid "edit counts"
-msgstr "modifica i conteggi"
-
 msgid "not in data set"
 msgstr "non presente nell''insieme dei dati"
 
@@ -6776,6 +6765,15 @@ msgstr "Parte di: "
 msgid "In conflict with: "
 msgstr "In conflitto con: "
 
+msgid "Advanced object info"
+msgstr "Informazioni avanzate sull''oggetto"
+
+msgid "map style"
+msgstr "stile della mappa"
+
+msgid "edit counts"
+msgstr "modifica i conteggi"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Cache degli stili per \"{0}\":"
 
@@ -6933,14 +6931,16 @@ msgid "this layer is not currently active (click to activate)"
 msgstr "questo livello non è attualmente attivo (clicca per attivare)"
 
 msgid "scale follows native resolution of this layer"
-msgstr ""
+msgstr "la scala segue la risoluzione nativa di questo livello"
 
 msgid ""
 "scale follows native resolution of another layer (click to set this layer)"
 msgstr ""
+"la scala segue la risoluzione nativa di un altro livello (click per "
+"impostarla su questo livello)"
 
 msgid "this layer has no native resolution"
-msgstr ""
+msgstr "questo livello non ha una risoluzione nativa"
 
 msgid "Information about layer"
 msgstr "Informazioni sul livello"
@@ -7404,7 +7404,7 @@ msgid "Download objects"
 msgstr "Scarica oggetti"
 
 msgid "Download the current version of the selected objects"
-msgstr ""
+msgstr "Scaricare la versione corrente degli oggetti selezionati"
 
 msgid "Select in layer"
 msgstr "Seleziona nel livello"
@@ -7564,15 +7564,15 @@ msgstr "Interroga solo i gruppi di modifiche che sono stati chiusi"
 msgid "Query both open and closed changesets"
 msgstr "Interroga i gruppi di modifiche aperti e chiusi"
 
+msgid "Only changesets owned by myself"
+msgstr "Solo i miei changeset"
+
 msgid "User ID:"
 msgstr "ID utente:"
 
 msgid "User name:"
 msgstr "Nome utente:"
 
-msgid "Only changesets owned by myself"
-msgstr "Solo i miei changeset"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Solo i changesets dell''utente con il seguente ID utente"
 
@@ -7837,7 +7837,7 @@ msgid "Copy {1} of {0}"
 msgstr "Copia {1} di {0}"
 
 msgid "Change visibility of the selected layer."
-msgstr ""
+msgstr "Cambia la visibilità del livello selezionato"
 
 msgid "Show layer"
 msgstr "Mostra livello"
@@ -8439,7 +8439,7 @@ msgid "Yes, discard changes and reload"
 msgstr "Si, elimina le modifiche e ricarica"
 
 msgid "Click to discard the changes and reload data from layer"
-msgstr ""
+msgstr "Click per abbandonare le modifiche e ricaricare i dati dal livello"
 
 msgid ""
 "<html>You have unsaved changes in this editor window.<br><br>Do you want to "
@@ -9014,8 +9014,8 @@ msgstr ""
 
 msgid "This changeset has {0} comment"
 msgid_plural "This changeset has {0} comments"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Questo changeset ha {0} commento"
+msgstr[1] "Questo changeset ha {0} commenti"
 
 msgid "Changeset"
 msgstr "Gruppo di modifiche"
@@ -9895,6 +9895,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Valore inatteso per la chiave ''{0}'' nelle preferenze, ottenuto ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Riempi un gruppo di modifiche e ritorna alla finestra di caricamento"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Apri ed utilizza tanti nuovi gruppi di modifiche quanti necessari"
+
 msgid "Please select the upload strategy:"
 msgstr "Si prega di selezionare la strategia di caricamento:"
 
@@ -9916,12 +9922,6 @@ msgstr ""
 "il caricamento di  {0} oggetti. Quale strategia si desidera "
 "utilizzare?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Riempi un gruppo di modifiche e ritorna alla finestra di caricamento"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Apri ed utilizza tanti nuovi gruppi di modifiche quanti necessari"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Non è possibile il caricamento in una singola richiesta (troppi oggetti da "
@@ -10717,11 +10717,8 @@ msgstr "Non c''è alcun livello di immagini aeree."
 msgid "No imagery layers"
 msgstr "Nessun livello di immagini aeree"
 
-msgid "Velocity, km/h"
-msgstr "Velocità, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Tempo"
@@ -10729,6 +10726,9 @@ msgstr "Tempo"
 msgid "Direction"
 msgstr "Direzione"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punto GPS"
 
@@ -10894,15 +10894,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Impossibile trovare l''immagine ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Salva token di accesso nelle preferenze"
+
 msgid "Access Token Key:"
 msgstr "Chiave del token di accesso:"
 
 msgid "Access Token Secret:"
 msgstr "Codice segreto del token di accesso:"
 
-msgid "Save Access Token in preferences"
-msgstr "Salva token di accesso nelle preferenze"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12668,7 +12668,7 @@ msgstr ""
 "width=600>L''errore è: {1}</table></html>"
 
 msgid "Sort presets menu alphabetically"
-msgstr ""
+msgstr "Ordina il menu delle preselezioni in ordine alfabetico"
 
 msgid "Tagging Presets"
 msgstr "Etichette preimpostate"
@@ -12726,6 +12726,11 @@ msgstr "Preimpostazione interna"
 msgid "The default preset for JOSM"
 msgstr "La preimpostazione predefinita per JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "L''estensione {0} è ancora richiesta da questa''estensione:"
+msgstr[1] "L''estensione {0} è ancora richiesta da queste {1} estensioni:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Estensioni fornite con JOSM"
 
@@ -12736,11 +12741,6 @@ msgstr ""
 "Si prega di cliccare su <strong>Scarica lista</strong> per scaricare e "
 "visualizzare una lista delle estensioni disponibili."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "L''estensione {0} è ancora richiesta da questa''estensione:"
-msgstr[1] "L''estensione {0} è ancora richiesta da queste {1} estensioni:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versione {1} (locale: {2})"
 
@@ -12832,6 +12832,9 @@ msgstr "Modifica indirizzo URL di descrizione dell''estensione JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "Indirizzo URL di descrizione dell''estensione JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Intervallo di aggiornamento (in giorni):"
+
 msgid "Ask before updating"
 msgstr "Chiedi prima di aggiornare"
 
@@ -12849,9 +12852,6 @@ msgstr ""
 "estensioni attive durante l''avvio, in seguito all''aggiornamento dello "
 "stesso JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Intervallo di aggiornamento (in giorni):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12967,12 +12967,12 @@ msgstr "Rijksdriehoekscoördinaten (Paesi Bassi)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Svezia)"
 
-msgid "Projection method"
-msgstr "Metodo di proiezione"
-
 msgid "Projection code"
 msgstr "Codice proiezione"
 
+msgid "Projection method"
+msgstr "Metodo di proiezione"
+
 msgid "Display coordinates as"
 msgstr "Visualizza le coordinate come"
 
@@ -13237,6 +13237,9 @@ msgstr ""
 "Fallita la memorizzazione del token di accesso OAuth nel gestore delle "
 "credenziali"
 
+msgid "Save to preferences"
+msgstr "Salva sulle preferenze"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13248,9 +13251,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Si possiede già un token di accesso al server OSM mediante OAuth."
 
-msgid "Save to preferences"
-msgstr "Salva sulle preferenze"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Clicca per seguire i passaggi del processo di autorizzazione OAuth"
 
@@ -13301,7 +13301,7 @@ msgid "Overpass server: "
 msgstr "Server Overpass: "
 
 msgid "Overpass server"
-msgstr ""
+msgstr "Server Overpass"
 
 msgid "Proxy settings"
 msgstr "Impostazioni proxy"
@@ -13703,7 +13703,7 @@ msgstr ""
 "''short_descriptions'' deve essere lo stesso di ''values''"
 
 msgid "This corresponds to the key ''{0}''"
-msgstr ""
+msgstr "Questo corrisponde alla chiave ''{0}''"
 
 msgid "More information about this feature"
 msgstr "Ulteriori informazioni su questa caratteristica"
@@ -13939,7 +13939,7 @@ msgid ""
 msgstr ""
 
 msgid "Adding certificate for TLS connections: {0}"
-msgstr ""
+msgstr "Aggiungere certificato per connessioni TLS: {0}"
 
 msgid "Failed to parse date ''{0}'' replied by server."
 msgstr "Fallita l''analisi della data ''{0}'' restituita dal server."
@@ -14047,7 +14047,7 @@ msgid "GeoJSON Files"
 msgstr "File GeoJSON"
 
 msgid "Projected GeoJSON Files"
-msgstr ""
+msgstr "File con proiezione GeoJSON"
 
 msgid "Layer ''{0}'' not supported"
 msgstr "Livello ''{0}'' non supportato"
@@ -14532,9 +14532,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Valore lungo non valido per l''attributo ''''{0}''''. Ottenuto ''''{1}''''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} byte sono stati letti"
-
 msgid "Prepare OSM data..."
 msgstr "Preparazione dati OSM..."
 
@@ -14651,6 +14648,9 @@ msgstr "File WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versione del file WMS non supportata; trovata {0}, attesa {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} byte sono stati letti"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14854,7 +14854,7 @@ msgid "Include OSM data in the .joz session file."
 msgstr "Includi i dati OSM nel file sessione .joz."
 
 msgid "Link to a GPX data file on your local disk."
-msgstr ""
+msgstr "Collegamento a dati GPS nel propiro disco locale"
 
 msgid "Include GPX data in the .joz session file."
 msgstr "Includi dati GPX nel file di sessione .joz."
@@ -16427,7 +16427,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (livello Standard)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik Bianco & Nero)"
@@ -16523,10 +16523,10 @@ msgid "AGRI black-and-white 2.5m"
 msgstr "AGRI bianco-nero 2.5m"
 
 msgid "LPI NSW Base Map"
-msgstr ""
+msgstr "Mappa basata su LPI NSW"
 
 msgid "LPI NSW Topographic Map"
-msgstr ""
+msgstr "Mappa topografica LPI NSW"
 
 msgid "LPI NSW Imagery"
 msgstr ""
@@ -16705,6 +16705,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -16793,13 +16796,13 @@ msgid "Bavaria (2 m)"
 msgstr "Bavaria (2 m)"
 
 msgid "Berlin aerial photograph 2011"
-msgstr ""
+msgstr "Foto aeree Berlino 2011"
 
 msgid "Berlin aerial photograph 2014"
-msgstr ""
+msgstr "Foto aeree Berlino 2014"
 
 msgid "Berlin aerial photograph 2015"
-msgstr ""
+msgstr "Foto aeree Berlino 2015"
 
 msgid "Stuttgart (aerial imagery)"
 msgstr "Stoccarda (immagini aeree)"
@@ -17788,6 +17791,8 @@ msgid ""
 "Gives assistance for the mapping process of indoor OSM building data. "
 "Includes a validator and a mappaint style for indoor-data."
 msgstr ""
+"Fornisce assistenza al processo di mappatura dei dati all''interno di "
+"edifici. Incluso un validatore e stili di mappa per dati indoor."
 
 msgid ""
 "Extra information about current layer objects pop ups - currently GPX "
@@ -17849,6 +17854,9 @@ msgstr ""
 "possibile creare, chiudere, invalidare, riaprire e commentare i bug report "
 "utilizzando questo plugin."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18066,6 +18074,8 @@ msgid ""
 "Integrate to-fix http://osmlab.github.io/to-fix/ into JOSM to repair errors "
 "in OpenStreetMap"
 msgstr ""
+"Integra to-fix http://osmlab.github.io/to-fix/ in JOSM per correggere errori "
+"in OpenStreetMap"
 
 msgid ""
 "Provides helper buttons to allow working with single button mouse (stylus). "
@@ -18362,7 +18372,7 @@ msgid "spur"
 msgstr "tratto per una società o ente"
 
 msgid "crossover"
-msgstr ""
+msgstr "crossover"
 
 msgid "Electrified"
 msgstr "Elettrificazione"
@@ -19179,7 +19189,7 @@ msgid "ICAO"
 msgstr "ICAO"
 
 msgid "Car brand"
-msgstr "Marca d'auto"
+msgstr "Marca d''auto"
 
 msgid "Motorcycle brand"
 msgstr "Marca di motocicli"
@@ -19926,6 +19936,12 @@ msgstr "senso orario"
 msgid "Pedestrian Crossing"
 msgstr "Attraversamento pedonale"
 
+msgid "Tactile Paving"
+msgstr "Pavimentazione tattile"
+
+msgid "incorrect"
+msgstr "non corretto"
+
 msgid "In case of traffic signals:"
 msgstr "In caso di segnali stradali:"
 
@@ -20116,6 +20132,9 @@ msgstr "Fosso"
 msgid "Kerb"
 msgstr "Cordolo"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Ingresso (apertura barriera)"
 
@@ -21108,12 +21127,6 @@ msgstr "Stazione degli autobus"
 msgid "Bus Stop"
 msgstr "Fermata dell''autobus"
 
-msgid "Tactile Paving"
-msgstr "Pavimentazione tattile"
-
-msgid "incorrect"
-msgstr "non corretto"
-
 msgid "Bus Platform"
 msgstr "Banchina autobus"
 
@@ -21447,7 +21460,7 @@ msgid "Swimming Pool"
 msgstr "Piscina"
 
 msgid "Used for the water area only."
-msgstr "Utilizzato solo per la zona d'acqua."
+msgstr "Utilizzato solo per la zona d''acqua."
 
 msgid "Fitness Station"
 msgstr "Fermata per il Fitness"
@@ -21887,7 +21900,7 @@ msgid "Count"
 msgstr "Numero di idranti"
 
 msgid "Water Tank"
-msgstr "Serbatoio d'acqua"
+msgstr "Serbatoio d''acqua"
 
 msgid "Volume (in liters)"
 msgstr "Volume (in litri)"
@@ -26001,6 +26014,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} in un nodo. Dovrebbe essere usato in un tracciato."
 
@@ -26053,10 +26069,10 @@ msgid "suspicious roundabout direction"
 msgstr "direzione sospetta della rotonda"
 
 msgid "{0} on a large area"
-msgstr "{0} su di un'area vasta"
+msgstr "{0} su di un''area vasta"
 
 msgid "{0} on a small area"
-msgstr "{0}  su di un'area piccola"
+msgstr "{0}  su di un''area piccola"
 
 msgid "Too large building"
 msgstr "Edificio troppo grande"
@@ -26066,6 +26082,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome abbreviato della strada"
 
@@ -28445,18 +28466,18 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
-msgstr "Impostazioni di scaricamento"
-
-msgid "Settings for the continuous download."
-msgstr ""
-
 msgid "Activate continuous downloads at startup."
 msgstr ""
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
+msgid "Download Settings"
+msgstr "Impostazioni di scaricamento"
+
+msgid "Settings for the continuous download."
+msgstr ""
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30217,7 +30238,7 @@ 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"
+msgstr "Mostra l''ora in cui è stata scattata la foto"
 
 msgid "Use 24 hour format"
 msgstr "Utilizza il formato a 24 ore"
@@ -30225,6 +30246,9 @@ msgstr "Utilizza il formato a 24 ore"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31462,7 +31486,7 @@ msgid "Do you want to save current calibration of layer {0}?"
 msgstr "Si desidera salvare la calibrazione corrente del livello {0}?"
 
 msgid "Select an option"
-msgstr "Seleziona un'opzione"
+msgstr "Seleziona un''opzione"
 
 msgid "Load Picture Calibration..."
 msgstr "Carica calibrazione immagine..."
@@ -32446,7 +32470,7 @@ msgid "Failed to open connection to API {0}."
 msgstr "È fallita l''apertura della connessione alle API {0}"
 
 msgid "Proxy Authentication Required"
-msgstr "È richiesta l'autenticazione sul proxy"
+msgstr "È richiesta l''autenticazione sul proxy"
 
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
@@ -32899,6 +32923,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Salta"
 
@@ -32914,12 +32947,27 @@ msgstr "Errore corretto"
 msgid "Not an error"
 msgstr "Non è un errore"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32929,6 +32977,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32940,6 +32991,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Impossibile posizionare un nodo al di fuori dei confini della Terra."
 
diff --git a/i18n/po/ja.po b/i18n/po/ja.po
index 668a8e3..6a8cc1c 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-14 15:14+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-22 08:00+0000\n"
 "Last-Translator: fujimoto <fujimoto at internet.ne.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-05-04 04:49+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:48+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "X-Poedit-Country: JAPAN\n"
 "Language: ja\n"
 "X-Poedit-Language: Japanese\n"
@@ -3549,9 +3549,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (行{0}、コラム{1}で)"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM 投影法 (''+proj=utm'') には ''+zone=...'' パラメーターが必要です。"
 
@@ -5063,9 +5060,6 @@ msgstr "単位系を{0}に変更しました"
 msgid "Layer not in list."
 msgstr "レイヤーがリストにありません。"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "レイヤー ''{0}'' はレイヤーのリスト中になければなりません"
-
 msgid "Default (open, closed, new)"
 msgstr "既定 (開いている、閉じている、新規)"
 
@@ -5783,15 +5777,15 @@ msgstr "元ウェイ"
 msgid "Decision"
 msgstr "判断"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>次のタグに残す値を選択してください。</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "競合のあるタグだけを表示"
 
 msgid "Show tags with multiple values only"
 msgstr "複数の値を持つタグのみを表示"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>次のタグに残す値を選択してください。</html>"
+
 msgid "Apply?"
 msgstr "適用しますか?"
 
@@ -6087,15 +6081,6 @@ msgstr[0] "<b>{0}</b>件のオブジェクトが無効化"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>全オブジェクトを見るにはフィルターのダイアログを閉じてください。<p></html>"
 
-msgid "Advanced object info"
-msgstr "詳細なオブジェクト情報"
-
-msgid "map style"
-msgstr "マップ形式"
-
-msgid "edit counts"
-msgstr "編集回数"
-
 msgid "not in data set"
 msgstr "データセット内にない"
 
@@ -6184,6 +6169,15 @@ msgstr "所属: "
 msgid "In conflict with: "
 msgstr "競合先: "
 
+msgid "Advanced object info"
+msgstr "詳細なオブジェクト情報"
+
+msgid "map style"
+msgstr "マップ形式"
+
+msgid "edit counts"
+msgstr "編集回数"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "\"{0}\"のスタイルキャッシュ:"
 
@@ -6918,15 +6912,15 @@ msgstr "閉じている変更セットだけを問い合わせる"
 msgid "Query both open and closed changesets"
 msgstr "開いている及び閉じている変更セットを両方問い合わせる"
 
+msgid "Only changesets owned by myself"
+msgstr "自分が所有する変更セットのみ"
+
 msgid "User ID:"
 msgstr "ユーザー ID:"
 
 msgid "User name:"
 msgstr "ユーザー名:"
 
-msgid "Only changesets owned by myself"
-msgstr "自分が所有する変更セットのみ"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "次のユーザーIDのユーザーが所有する変更セットのみ"
 
@@ -8984,6 +8978,12 @@ msgstr "アップロードをキャンセル"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "キー''{0}''に想定外の値''{1}''が設定されています"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "1つの変更セットにまとめて、アップロード画面に戻る。"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "新しい変更セットを必要なだけ開いて使用する"
+
 msgid "Please select the upload strategy:"
 msgstr "アップロード方式を選択してください:"
 
@@ -9003,12 +9003,6 @@ msgstr ""
 "<html> "
 "{0}件のオブジェクトをアップロードするには、<strong>複数の変更セット</strong>が必要です。どんな方法をとりますか?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "1つの変更セットにまとめて、アップロード画面に戻る。"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "新しい変更セットを必要なだけ開いて使用する"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "1回のリクエストでアップロードすることはできません(アップロードするオブジェクトが多すぎる)"
 
@@ -9760,11 +9754,8 @@ msgstr "画像レイヤーがありません。"
 msgid "No imagery layers"
 msgstr "画像レイヤーなし"
 
-msgid "Velocity, km/h"
-msgstr "速度, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "時間"
@@ -9772,6 +9763,9 @@ msgstr "時間"
 msgid "Direction"
 msgstr "方向"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "GPSポイント"
 
@@ -9913,15 +9907,15 @@ msgstr "''{0}''から地図描画スタイルの解析に失敗しました。
 msgid "Failed to locate image ''{0}''"
 msgstr "イメージ ''{0}'' が見つかりません"
 
+msgid "Save Access Token in preferences"
+msgstr "設定でアクセストークンを保存"
+
 msgid "Access Token Key:"
 msgstr "アクセストークンキー:"
 
 msgid "Access Token Secret:"
 msgstr "アクセストークン秘密鍵:"
 
-msgid "Save Access Token in preferences"
-msgstr "設定でアクセストークンを保存"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -11546,6 +11540,10 @@ msgstr "内部プリセット"
 msgid "The default preset for JOSM"
 msgstr "JOSM用の既定値のプリセット"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "{0}プラグインは次の{1}件のプラグインから必要とされています。"
+
 msgid "Plugin bundled with JOSM"
 msgstr "JOSMに付属のプラグイン"
 
@@ -11555,10 +11553,6 @@ msgid ""
 msgstr ""
 "利用可能なプラグインのリストをダウンロードして表示するには、<strong>リストのダウンロード</strong>をクリックしてください。"
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "{0}プラグインは次の{1}件のプラグインから必要とされています。"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: バージョン {1} (ローカル: {2})"
 
@@ -11641,6 +11635,9 @@ msgstr "JOSMプラグイン情報のURLを編集します。"
 msgid "JOSM Plugin description URL"
 msgstr "JOSMプラグイン説明URL"
 
+msgid "Update interval (in days):"
+msgstr "更新周期(日数):"
+
 msgid "Ask before updating"
 msgstr "更新の前に問合せる"
 
@@ -11655,9 +11652,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr "JOSMがJOSM自身を更新した後、再起動時にアクティブなプラグインを自動更新するかどうかを決めてください。"
 
-msgid "Update interval (in days):"
-msgstr "更新周期(日数):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11771,12 +11765,12 @@ msgstr "Rijksdriehoekscoördinaten (Netherlands)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 
-msgid "Projection method"
-msgstr "投影法"
-
 msgid "Projection code"
 msgstr "投影法コード"
 
+msgid "Projection method"
+msgstr "投影法"
+
 msgid "Display coordinates as"
 msgstr "座標を表示する単位"
 
@@ -12011,6 +12005,9 @@ msgstr "認証マネージャーからOAuthアクセストークンの取得に
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "OAuthアクセストークンの認証マネージャーへの保存に失敗しました"
 
+msgid "Save to preferences"
+msgstr "プリファレンスに保存"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12020,9 +12017,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "OAuthを使用しているOSMサーバーへのアクセス権を持ったアクセストークンが既にあります。"
 
-msgid "Save to preferences"
-msgstr "プリファレンスに保存"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "クリックしてOAuth 認証プロセスを一歩進む"
 
@@ -13160,9 +13154,6 @@ msgstr "必要な属性 ''{0}'' がありません。"
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "属性 ''{0}'' に不正な長い値。入力値: ''{1}''"
 
-msgid "{0} bytes have been read"
-msgstr "{0}バイトを読み込み"
-
 msgid "Prepare OSM data..."
 msgstr "OSMデータを準備します..."
 
@@ -13271,6 +13262,9 @@ msgstr "WMSファイル(*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "WMSファイルのバージョンが未サポートです。{1}でなければなりませんが、{0}でした。"
 
+msgid "{0} bytes have been read"
+msgstr "{0}バイトを読み込み"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15075,6 +15069,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -16180,6 +16177,9 @@ msgstr ""
 "MapDustプラグインは、MapDustのバグレポートを地図上に表示します。このプラグインを使用して、バグレポートを作成したり、完了させたり、無効化した"
 "り、再オープンしたり、コメントしたりすることができます。"
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18177,6 +18177,12 @@ msgstr "時計回り"
 msgid "Pedestrian Crossing"
 msgstr "横断歩道"
 
+msgid "Tactile Paving"
+msgstr "点字ブロック"
+
+msgid "incorrect"
+msgstr "不正"
+
 msgid "In case of traffic signals:"
 msgstr "信号機の場合:"
 
@@ -18367,6 +18373,9 @@ msgstr "濠"
 msgid "Kerb"
 msgstr "縁石"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "出入口(柵の開口部)"
 
@@ -18553,7 +18562,7 @@ msgid "swamp"
 msgstr "沼地"
 
 msgid "bog"
-msgstr "湿地"
+msgstr "泥炭地"
 
 msgid "marsh"
 msgstr "沼地、湿地"
@@ -18577,7 +18586,7 @@ msgid "string_bog"
 msgstr ""
 
 msgid "saltern"
-msgstr ""
+msgstr "塩田"
 
 msgid "Mud"
 msgstr "泥地"
@@ -19350,12 +19359,6 @@ msgstr "バスターミナル"
 msgid "Bus Stop"
 msgstr "バス停"
 
-msgid "Tactile Paving"
-msgstr "点字ブロック"
-
-msgid "incorrect"
-msgstr "不正"
-
 msgid "Bus Platform"
 msgstr "バス乗り場"
 
@@ -19728,7 +19731,7 @@ msgid "Fishing"
 msgstr "つり場"
 
 msgid "Bird Hide"
-msgstr ""
+msgstr "野鳥観察小屋"
 
 msgid "Night Club"
 msgstr "ナイトクラブ"
@@ -19758,7 +19761,7 @@ msgid "Arts Centre"
 msgstr "アートセンター"
 
 msgid "Artwork"
-msgstr "芸術作品"
+msgstr "美術作品"
 
 msgid "mural"
 msgstr "壁画"
@@ -24206,6 +24209,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0}がノードに設定されています。ウェイに設定するべきです。"
 
@@ -24271,6 +24277,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "通り名が略称になっている"
 
@@ -26511,16 +26522,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28218,6 +28229,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30752,6 +30766,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "スキップ"
 
@@ -30767,12 +30790,27 @@ msgstr "修正されたエラー"
 msgid "Not an error"
 msgstr "エラーではありません"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "ダウンロード範囲を設定 (m²)"
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30782,6 +30820,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "メンテナンスサーバー"
 
@@ -30793,6 +30834,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "失敗しました。もう一度試してください"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "世界地図の範囲外にノードは置けません"
 
diff --git a/i18n/po/ka.po b/i18n/po/ka.po
index 963a83a..23283ab 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:42+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:42+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ka\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3525,9 +3525,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5033,9 +5030,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5750,15 +5744,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6056,15 +6050,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6154,6 +6139,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6872,13 +6866,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8876,6 +8870,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8893,12 +8893,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9640,10 +9634,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9652,6 +9643,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9792,13 +9786,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11362,6 +11356,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11370,11 +11369,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11459,6 +11453,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11473,9 +11470,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11589,10 +11583,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11819,6 +11813,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11828,9 +11825,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12950,9 +12944,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13063,6 +13054,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14802,6 +14796,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15877,6 +15874,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17862,6 +17862,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18050,6 +18056,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19033,12 +19042,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23888,6 +23891,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23953,6 +23959,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26065,16 +26076,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27739,6 +27750,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30244,6 +30258,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30259,12 +30282,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30274,6 +30312,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30285,6 +30326,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/km.po b/i18n/po/km.po
index 6d80b27..84f9183 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:49+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:49+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3747,9 +3747,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (នៅ​បន្ទាត់​ទី {0}, ជួរឈរ {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5321,9 +5318,6 @@ msgstr "បាន​ប្ដូរ​រង្វាស់​ប្រព័ន
 msgid "Layer not in list."
 msgstr "ស្រទាប់​មិន​នៅ​ក្នុង​បញ្ជី។"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "ស្រទាប់ ''{0}'' ត្រូវតែ​នៅ​ក្នុង​បញ្ជី​ស្រទាប់"
-
 msgid "Default (open, closed, new)"
 msgstr "លំនាំដើម (បើក បិទ ថ្មី)"
 
@@ -6112,16 +6106,16 @@ msgstr "Orig. Way"
 msgid "Decision"
 msgstr "សម្រេចចិត្ត"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>សូម​ជ្រើស​តម្លៃ​ដើម្បី​រក្សាទុក​សម្រាប់​ស្លាក​ដូច​ខាងក្រោម។</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "បង្ហាញ​តែ​ស្លាក​ដែល​ប៉ះទង្គិច​ប៉ុណ្ណោះ"
 
 msgid "Show tags with multiple values only"
 msgstr "បង្ហាញ​តែ​ស្លាក​ដែល​មាន​តម្លៃ​ច្រើន​ប៉ុណ្ណោះ"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>សូម​ជ្រើស​តម្លៃ​ដើម្បី​រក្សាទុក​សម្រាប់​ស្លាក​ដូច​ខាងក្រោម។</html>"
+
 msgid "Apply?"
 msgstr "អនុវត្ត?"
 
@@ -6433,15 +6427,6 @@ msgstr[0] "បាន​បិទ​វត្ថុ <b>{0}</b>"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>បិទ​ប្រអប់​តម្រង​ដើម្បី​ឃើញ​វត្ថុ​ទាំងអស់។<p></html>"
 
-msgid "Advanced object info"
-msgstr "ព័ត៌មាន​វត្ថុ​កម្រិត​ខ្ពស់"
-
-msgid "map style"
-msgstr "រចនាប័ទ្ម​ផែនទី"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "មិន​នៅ​ក្នុង​សំណុំ​ទិន្នន័យ"
 
@@ -6530,6 +6515,15 @@ msgstr "ផ្នែក​នៃ៖ "
 msgid "In conflict with: "
 msgstr "ក្នុង​ការ​ប៉ះទង្គិច​ជាមួយ៖ "
 
+msgid "Advanced object info"
+msgstr "ព័ត៌មាន​វត្ថុ​កម្រិត​ខ្ពស់"
+
+msgid "map style"
+msgstr "រចនាប័ទ្ម​ផែនទី"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "ឃ្លាំង​រចនាប័ទ្ម​សម្រាប់ \"{0}\" ៖"
 
@@ -7291,15 +7285,15 @@ msgstr "សំណួរ​បិទ​តែ​សំណុំ​ផ្លាស
 msgid "Query both open and closed changesets"
 msgstr "សំណួរ​ទាំង​និទ និង​បើក​សំណុំ​ផ្លាស់ប្ដូរ"
 
+msgid "Only changesets owned by myself"
+msgstr "តែ​សំណុំ​ផ្លាស់ប្ដូរ​ដែល​ជា​កម្មសិទ្ធិ​របស់​ខ្ញុំ​ប៉ុណ្ណោះ"
+
 msgid "User ID:"
 msgstr "លេខ​សម្គាល់​អ្នកប្រើ៖"
 
 msgid "User name:"
 msgstr "ឈ្មោះ​អ្នកប្រើ៖"
 
-msgid "Only changesets owned by myself"
-msgstr "តែ​សំណុំ​ផ្លាស់ប្ដូរ​ដែល​ជា​កម្មសិទ្ធិ​របស់​ខ្ញុំ​ប៉ុណ្ណោះ"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "តែ​សំណុំ​ផ្លាស់ប្ដូរ​ដែល​ជា​កម្មសិទ្ធិ​របស់​អ្នកប្រើ​ដែល​មាន​លេខ​សម្គាល់​ដូច​"
@@ -9547,6 +9541,12 @@ msgstr ""
 "តម្លៃ​មិន​រំពឹង​ទុក​សម្រាប់​ពាក្យ​គន្លឹះ ''{0}'' នៅ​ក្នុង​ចំណូលចិត្ត "
 "បាន​ទទួល ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "បំពេញ​សំណុំ​ផ្លាស់ប្ដូរ​មួយ រួច​ត្រឡប់​ទៅ​ប្រអប់​ផ្ទុក​ឡើង"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "បើក និង​ប្រើ​សំណុំ​ផ្លាស់ប្ដូរ​ច្រើន​បើ​ចាំបាច់"
+
 msgid "Please select the upload strategy:"
 msgstr "សូម​ជ្រើស​វិធីសាស្ត្រ​ផ្ទុក​ឡើង៖"
 
@@ -9567,12 +9567,6 @@ msgstr ""
 "ដែល​ចាំបាច់​ត្រូវ​ផ្ទុក​ឡើង​វត្ថុ {0} ។ "
 "តើ​អ្នក​ចង់​ប្រើ​វិធី​សាស្ត្រ​ណា?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "បំពេញ​សំណុំ​ផ្លាស់ប្ដូរ​មួយ រួច​ត្រឡប់​ទៅ​ប្រអប់​ផ្ទុក​ឡើង"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "បើក និង​ប្រើ​សំណុំ​ផ្លាស់ប្ដូរ​ច្រើន​បើ​ចាំបាច់"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "ការ​ផ្ទុក​ឡើង​ក្នុង​សំណើ​មួយ​គឺ​មិន​អាច​ទេ (មាន​វត្ថុ​ផ្ទុក​ឡើង​ច្រើន​ពេក)"
@@ -10343,11 +10337,8 @@ msgstr "មិន​មាន​ស្រទាប់​រូបភាព។"
 msgid "No imagery layers"
 msgstr "មិន​មាន​ស្រទាប់​រូបភាព"
 
-msgid "Velocity, km/h"
-msgstr "ល្បឿន, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "ពេលវេលា"
@@ -10355,6 +10346,9 @@ msgstr "ពេលវេលា"
 msgid "Direction"
 msgstr "​ទិស"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "ចំណុច​ជីភីអេស"
 
@@ -10516,15 +10510,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "បាន​បរាជ័យ​កំណត់​ទីតាំង​រូបភាព ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "រក្សាទុក​ថូខឹន​ចូល​ដំណើរការ​ក្នុង​ចំណូលចិត្ត"
+
 msgid "Access Token Key:"
 msgstr "ពាក្យ​គន្លឹះ​ថូខឹន​ចូល​ដំណើរការ៖"
 
 msgid "Access Token Secret:"
 msgstr "ពាក្យសម្ងាត់​ថូខឹន​ចូល​ដំណើរការ៖"
 
-msgid "Save Access Token in preferences"
-msgstr "រក្សាទុក​ថូខឹន​ចូល​ដំណើរការ​ក្នុង​ចំណូលចិត្ត"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12295,6 +12289,10 @@ msgstr "ការ​កំណត់​ស្រេច​ខាងក្នុង
 msgid "The default preset for JOSM"
 msgstr "ការ​កំណត់​ស្រេច​លំនាំដើម​សម្រាប់ JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "កម្មវិធី​ជំនួយ {0} នៅ​បាន​ទាមទារ​ដោយ​កម្មវិធី​ជំនួយ {1} ទាំងនេះ៖"
+
 msgid "Plugin bundled with JOSM"
 msgstr "កញ្ចប់​កម្មវិធី​ជំនួយ​ជាមួយ JOSM"
 
@@ -12305,10 +12303,6 @@ msgstr ""
 "សូម​ចុច <strong>ទាញ​យក​បញ្ជី</strong> ដើម្បី​ទាញ​យក "
 "និង​បង្ហាញ​បញ្ជី​កម្មវិធី​ជំនួយ​ដែល​មាន។"
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "កម្មវិធី​ជំនួយ {0} នៅ​បាន​ទាមទារ​ដោយ​កម្មវិធី​ជំនួយ {1} ទាំងនេះ៖"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: កំណែ {1} (មូលដ្ឋាន៖ {2})"
 
@@ -12396,6 +12390,9 @@ msgstr "កែ URL សេចក្ដី​ពណ៌នា​កម្មវិ
 msgid "JOSM Plugin description URL"
 msgstr "URL សេចក្ដី​ពណ៌នា​កម្មវិធី​ជំនួយ JOSM"
 
+msgid "Update interval (in days):"
+msgstr "ចន្លោះ​ពេល​ធ្វើ​បច្ចុប្បន្នភាព (គិតជា​ថ្ងៃ)៖"
+
 msgid "Ask before updating"
 msgstr "សួរ​មុន​ពេល​ធ្វើ​បច្ចុប្បន្នភាព"
 
@@ -12413,9 +12410,6 @@ msgstr ""
 "គួរ​ធ្វើ​បច្ចុប្បន្នភាព​កម្មវិធី​ជំនួយ​សកម្ម​ដោយ​ស្វ័យប្រវត្តិ​នៅ​ពេល​ចាប់ផ្ដ"
 "ើម ឬ​បន្ទាប់ពី​ការ​ធ្វើ​បច្ចុប្បន្នភាព JOSM ខ្លួន​វា។"
 
-msgid "Update interval (in days):"
-msgstr "ចន្លោះ​ពេល​ធ្វើ​បច្ចុប្បន្នភាព (គិតជា​ថ្ងៃ)៖"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12532,12 +12526,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (ស៊ុយអែត)"
 
-msgid "Projection method"
-msgstr "វិធីសាស្ត្រ​ចំណោល"
-
 msgid "Projection code"
 msgstr "កូដ​ចំណោល"
 
+msgid "Projection method"
+msgstr "វិធីសាស្ត្រ​ចំណោល"
+
 msgid "Display coordinates as"
 msgstr "បង្ហាញ​កូអរដោណេ​ជា"
 
@@ -12794,6 +12788,9 @@ msgstr ""
 "បាន​បរាជ័យ​ក្នុង​ការ​រក្សាទុក​ថូខឹន​ចូល​ដំណើរការ OAuth "
 "ទៅ​កម្មវិធី​គ្រប់គ្រង​ព័ត៌មាន​សម្ងាត់"
 
+msgid "Save to preferences"
+msgstr "រក្សាទុក​ទៅ​ចំណូលចិត្ត"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12807,9 +12804,6 @@ msgstr ""
 "អ្នក​មាន​ថូខឹន​ចូល​ដំណើរការ​ដើម្បី​ចូល​ដំណើរការ​ម៉ាស៊ីន​មេ OSM ដោយ​ប្រើ "
 "OAuth រួចហើយ។"
 
-msgid "Save to preferences"
-msgstr "រក្សាទុក​ទៅ​ចំណូលចិត្ត"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "ចុច​ដើម្បី​បញ្ចប់​ដំណើរការ​ផ្ទៀងផ្ទាត់ OAuth"
 
@@ -14063,9 +14057,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "តម្លៃ long មិន​ត្រឹមត្រូវ​សម្រាប់​គុណ​លក្ខណៈ ''{0}'' ។ បាន​ទទួល ''{1}'' ។"
 
-msgid "{0} bytes have been read"
-msgstr "បាន​អាន {0} បៃ"
-
 msgid "Prepare OSM data..."
 msgstr "កំពុង​រៀបចំ​ទិន្នន័យ OSM..."
 
@@ -14179,6 +14170,9 @@ msgstr "ឯកសារ WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "មិន​គាំទ្រ​កំណែ​ឯកសារ WMS; បាន​រកឃើញ {0}, រំពឹង​ទុក {1}"
 
+msgid "{0} bytes have been read"
+msgstr "បាន​អាន {0} បៃ"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16155,6 +16149,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -17294,6 +17291,9 @@ msgstr ""
 "អ្នក​អាច​បង្កើត បិទ ដក​សុពលភាព បើក​ឡើងវិញ "
 "និង​ផ្ដល់​របាយការណ៍​បំបាត់​កំហុស​ដោយ​ប្រើ​កម្មវិធី​ជំនួយ​នេះ។"
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19303,6 +19303,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19491,6 +19497,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -20474,12 +20483,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -25329,6 +25332,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25394,6 +25400,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -27506,16 +27517,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29180,6 +29191,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31685,6 +31699,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31700,12 +31723,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31715,6 +31753,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31726,6 +31767,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "មិន​អាច​ដាក់​តំណ​នៅ​ក្រៅ​ផែនដី​បានទេ។"
 
diff --git a/i18n/po/ko.po b/i18n/po/ko.po
index 082b26a..3b9e24a 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:50+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:50+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ko\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3504,9 +3504,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5011,9 +5008,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5728,15 +5722,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "적용?"
 
@@ -6034,15 +6028,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6132,6 +6117,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6850,13 +6844,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8859,6 +8853,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8876,12 +8876,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9623,10 +9617,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9635,6 +9626,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9775,13 +9769,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11345,6 +11339,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11353,11 +11352,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11442,6 +11436,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11456,9 +11453,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11572,10 +11566,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11802,6 +11796,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11811,9 +11808,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12933,9 +12927,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13046,6 +13037,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14785,6 +14779,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15860,6 +15857,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17845,6 +17845,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18033,6 +18039,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19016,12 +19025,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23871,6 +23874,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23936,6 +23942,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26048,16 +26059,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27722,6 +27733,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30227,6 +30241,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30242,12 +30265,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30257,6 +30295,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30268,6 +30309,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ky.po b/i18n/po/ky.po
index 5f8ebbd..2a7bb4f 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:50+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:49+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/lb.po b/i18n/po/lb.po
index ae0ed46..221ae16 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:52+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:52+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr "{0}:D''Optioun \"{1}\" ass net eendeiteg"
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/lo.po b/i18n/po/lo.po
index be81aae..6a66546 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:51+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:51+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/lt.po b/i18n/po/lt.po
index aa0db08..19abb81 100644
--- a/i18n/po/lt.po
+++ b/i18n/po/lt.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-28 17:55+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+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"
 "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%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2016-05-04 04:52+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:52+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: lt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3864,9 +3864,6 @@ msgstr "Tikėtąsi elemento ''{0}'', bet gauta ''{1}''"
 msgid "value expected"
 msgstr "tikimasi vertės"
 
-msgid " (at line {0}, column {1})"
-msgstr " (eilutėje {0}, stulpelyje {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM projekcija (''+proj=utm'') reikalauja ''+zona=...'' parametro."
 
@@ -5442,9 +5439,6 @@ msgstr "Matavimo sistema pakeista į {0}"
 msgid "Layer not in list."
 msgstr "Sluoksnis ne sąraše."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Sluoksnis „{0}“ turi būti sluoksnių sąraše"
-
 msgid "Default (open, closed, new)"
 msgstr "Numatytas (atviros, uždarytos, naujos)"
 
@@ -6241,15 +6235,15 @@ msgstr "Prad. kelias"
 msgid "Decision"
 msgstr "Sprendimas"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>Prašome parinkti kurias reikšmes palikti šioms žymoms.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Rodyti tik žymas su konfliktais"
 
 msgid "Show tags with multiple values only"
 msgstr "Rodyti žymas tik su sudėtinėmis reikšmėmis"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>Prašome parinkti kurias reikšmes palikti šioms žymoms.</html>"
+
 msgid "Apply?"
 msgstr "Pritaikyti?"
 
@@ -6566,15 +6560,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Užverkite filtro dialogo langą visiems objektams pamatyti.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Sudėtingesnė objekto info"
-
-msgid "map style"
-msgstr "žemėlapio stilius"
-
-msgid "edit counts"
-msgstr "redaguoti skaičius"
-
 msgid "not in data set"
 msgstr "ne duomenų aibėje"
 
@@ -6665,6 +6650,15 @@ msgstr "Dalis: "
 msgid "In conflict with: "
 msgstr "Konfliktuoja su: "
 
+msgid "Advanced object info"
+msgstr "Sudėtingesnė objekto info"
+
+msgid "map style"
+msgstr "žemėlapio stilius"
+
+msgid "edit counts"
+msgstr "redaguoti skaičius"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "„{0}“ stilių podėlis:"
 
@@ -7437,15 +7431,15 @@ msgstr "Ieškoti tik užvertuose pakeitimuose"
 msgid "Query both open and closed changesets"
 msgstr "Ieškoti ir atvertuose, ir užvertuose pakeitimuose"
 
+msgid "Only changesets owned by myself"
+msgstr "Tik pakeitimuose, priklausančiuose man"
+
 msgid "User ID:"
 msgstr "Naudotojo ID:"
 
 msgid "User name:"
 msgstr "Naudotojo vardas:"
 
-msgid "Only changesets owned by myself"
-msgstr "Tik pakeitimuose, priklausančiuose man"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Tik pakeitimai, priklausantys naudotojui su šiuo naudotojo ID"
 
@@ -9707,6 +9701,12 @@ msgstr "Atsisakyti išsiuntimo"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Netikėta rakto „{0}“ reikšmė nustatymuose, gauta „{1}“"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Užpildyti vieną pakeitimą ir grįžti į išsiuntimo dialogo langą"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Atverti ir naudoti tiek naujų pakeitimų, kiek reikia"
+
 msgid "Please select the upload strategy:"
 msgstr "Prašome parinkti įkėlimo strategiją:"
 
@@ -9726,12 +9726,6 @@ msgstr ""
 "<html>Reikia <strong>kelių pakeitimų</strong>, kad būtų išsiųsti {0} "
 "objektai. Kurią strategiją norite naudoti?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Užpildyti vieną pakeitimą ir grįžti į išsiuntimo dialogo langą"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Atverti ir naudoti tiek naujų pakeitimų, kiek reikia"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Įkelti viena užklausa neįmanoma (per daug įkeliamų objektų)"
 
@@ -10534,11 +10528,8 @@ msgstr "Nėra vaizdų sluoksnių."
 msgid "No imagery layers"
 msgstr "Nėra vaizdų sluoksnių"
 
-msgid "Velocity, km/h"
-msgstr "Greitis, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Laikas"
@@ -10546,6 +10537,9 @@ msgstr "Laikas"
 msgid "Direction"
 msgstr "Kryptis"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps taškas"
 
@@ -10713,15 +10707,15 @@ msgstr "Nepavyko išnagrinėti žemėlapio paišymo stilių iš „{0}“. Klaid
 msgid "Failed to locate image ''{0}''"
 msgstr "Nepavyko lokalizuoti piešinio ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Išsaugoti prieigos raktą nustatymuose"
+
 msgid "Access Token Key:"
 msgstr "Prieigos raktas:"
 
 msgid "Access Token Secret:"
 msgstr "Prieigos rakto paslaptis:"
 
-msgid "Save Access Token in preferences"
-msgstr "Išsaugoti prieigos raktą nustatymuose"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12457,6 +12451,12 @@ msgstr "Vidiniai ruošiniai"
 msgid "The default preset for JOSM"
 msgstr "Numatytieji JOSM ruošiniai"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Papildinys {0} dar reikalingas šiam papildiniui:"
+msgstr[1] "Papildinys {0} dar reikalingas šiems {1} papildiniams:"
+msgstr[2] "Papildinys {0} dar reikalingas šiems {1} papildinių:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Papildinys pridėtas kartu su JOSM"
 
@@ -12467,12 +12467,6 @@ msgstr ""
 "Spauskite <strong>Atsiųsti sąrašą</strong> prieinamų papildinių sąrašui "
 "atsiųsti ir parodyti."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Papildinys {0} dar reikalingas šiam papildiniui:"
-msgstr[1] "Papildinys {0} dar reikalingas šiems {1} papildiniams:"
-msgstr[2] "Papildinys {0} dar reikalingas šiems {1} papildinių:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: versija {1} (vietinė: {2})"
 
@@ -12561,6 +12555,9 @@ msgstr "Taisykite JOSM papildinių aprašo URL."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM papildinių aprašo URL"
 
+msgid "Update interval (in days):"
+msgstr "Atnaujinimo intervalas (dienomis):"
+
 msgid "Ask before updating"
 msgstr "Klausti prieš atnaujinant"
 
@@ -12577,9 +12574,6 @@ msgstr ""
 "Nuspręskite, ar JOSM automatiškai atnaujins aktyvius papildinius paleidimo "
 "metu po JOSM atnaujinimo."
 
-msgid "Update interval (in days):"
-msgstr "Atnaujinimo intervalas (dienomis):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12695,12 +12689,12 @@ msgstr "Rijksdriehoekscoördinaten (Nyderlandai)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Švedija)"
 
-msgid "Projection method"
-msgstr "Projekcijos metodas"
-
 msgid "Projection code"
 msgstr "Projekcijos kodas"
 
+msgid "Projection method"
+msgstr "Projekcijos metodas"
+
 msgid "Display coordinates as"
 msgstr "Rodyti koordinates kaip"
 
@@ -12956,6 +12950,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Nepavyko išsaugoti OAuth prieigos rakto į prisijungimo duomenų tvarkytuvę"
 
+msgid "Save to preferences"
+msgstr "Išsaugoti į nustatymus"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12968,9 +12965,6 @@ msgid ""
 msgstr ""
 "Jau turite prieigos raktą prieigai prie OSM serverio naudojant OAuth."
 
-msgid "Save to preferences"
-msgstr "Išsaugoti į nustatymus"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Spauskite OAuth prieigos suteikimo proceso įvykdymui"
 
@@ -14165,9 +14159,6 @@ msgstr "Trūksta reikalaujamo atributo ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr "{0} baitai (-ų/as) buvo perskaityti (-as)"
-
 msgid "Prepare OSM data..."
 msgstr "Paruošti OSM duomenis..."
 
@@ -14282,6 +14273,9 @@ msgstr "WMS failai (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nepalaikoma WMS failo versija; rasta {0}, tikėtasi {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} baitai (-ų/as) buvo perskaityti (-as)"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16232,6 +16226,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordo, Prancūzija - 2012"
 
@@ -17317,6 +17314,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18735,7 +18735,7 @@ msgstr "Greitkelio tipas"
 
 msgctxt "Highway"
 msgid "residential"
-msgstr ""
+msgstr "gyvenamasis"
 
 msgctxt "Highway"
 msgid "service"
@@ -19312,6 +19312,12 @@ msgstr "pagal laikrodžio rodyklę"
 msgid "Pedestrian Crossing"
 msgstr "Pėsčiųjų perėja"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -19500,6 +19506,9 @@ msgstr "Griovys"
 msgid "Kerb"
 msgstr "Bordiūras"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Įėjimas (barjero atidarymas)"
 
@@ -20483,12 +20492,6 @@ msgstr "Autobusų stotis"
 msgid "Bus Stop"
 msgstr "Autobusų stotelė"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Autobusų platforma"
 
@@ -22143,7 +22146,7 @@ msgstr "Gyvenamasis pastatas"
 
 msgctxt "building"
 msgid "residential"
-msgstr ""
+msgstr "gyvenamasis"
 
 msgctxt "building"
 msgid "apartments"
@@ -25349,6 +25352,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25414,6 +25420,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "sutrumpintas gatvės pavadinimas"
 
@@ -27553,16 +27564,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29244,6 +29255,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31766,6 +31780,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31781,12 +31804,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31796,6 +31834,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31807,6 +31848,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Negalima padėti tašką už pasaulio ribų."
 
diff --git a/i18n/po/lv.po b/i18n/po/lv.po
index 4bebfaa..e36b551 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:51+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:51+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: lv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3531,9 +3531,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5038,9 +5035,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5755,15 +5749,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6061,15 +6055,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6159,6 +6144,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6877,13 +6871,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8881,6 +8875,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8898,12 +8898,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9645,10 +9639,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9657,6 +9648,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9797,13 +9791,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11367,6 +11361,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11375,11 +11374,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11464,6 +11458,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11478,9 +11475,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11594,10 +11588,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11824,6 +11818,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11833,9 +11830,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12959,9 +12953,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13072,6 +13063,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14811,6 +14805,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15886,6 +15883,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17871,6 +17871,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18059,6 +18065,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19042,12 +19051,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23897,6 +23900,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23962,6 +23968,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26074,16 +26085,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27748,6 +27759,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30253,6 +30267,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30268,12 +30291,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30283,6 +30321,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30294,6 +30335,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/mk.po b/i18n/po/mk.po
index d2d04fd..0a6512b 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:53+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:53+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: mk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3523,9 +3523,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5031,9 +5028,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5748,15 +5742,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6054,15 +6048,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6152,6 +6137,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6870,13 +6864,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8874,6 +8868,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8891,12 +8891,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9638,10 +9632,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9650,6 +9641,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9790,13 +9784,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11360,6 +11354,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11368,11 +11367,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11457,6 +11451,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11471,9 +11468,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11587,10 +11581,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11818,6 +11812,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11827,9 +11824,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12949,9 +12943,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13062,6 +13053,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14801,6 +14795,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15876,6 +15873,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17861,6 +17861,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18049,6 +18055,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19032,12 +19041,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23887,6 +23890,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23952,6 +23958,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26064,16 +26075,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27738,6 +27749,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30243,6 +30257,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30258,12 +30281,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30273,6 +30311,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30284,6 +30325,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/mr.po b/i18n/po/mr.po
index 84feb01..befd6ee 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:53+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:53+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: mr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3551,9 +3551,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5059,9 +5056,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "थर यादीत नाही."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "थर ''{0}'' थरांच्या यादीत असला पाहिजे"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5776,15 +5770,15 @@ msgstr "मूळ मार्ग"
 msgid "Decision"
 msgstr "निर्णय"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6082,15 +6076,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr "नकाशा शैली"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6180,6 +6165,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr "नकाशा शैली"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "\"{0}\"साठी शैली सय:"
 
@@ -6898,15 +6892,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr "केवळ माझ्या मालकीचे बदलसंच"
+
 msgid "User ID:"
 msgstr ""
 
 msgid "User name:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
-msgstr "केवळ माझ्या मालकीचे बदलसंच"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -8902,6 +8896,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8919,12 +8919,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9676,10 +9670,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9688,6 +9679,9 @@ msgstr "वेळ"
 msgid "Direction"
 msgstr "दिशा"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9828,13 +9822,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11399,6 +11393,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11407,11 +11406,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11496,6 +11490,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11510,9 +11507,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11626,10 +11620,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11856,6 +11850,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11865,9 +11862,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12987,9 +12981,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13100,6 +13091,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14839,6 +14833,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15914,6 +15911,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17899,6 +17899,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18087,6 +18093,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19070,12 +19079,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23925,6 +23928,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23990,6 +23996,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26102,16 +26113,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27776,6 +27787,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30281,6 +30295,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30296,12 +30319,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30311,6 +30349,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30322,6 +30363,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ms.po b/i18n/po/ms.po
index 6ca1513..3ab7b6c 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:54+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:54+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ms\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/nb.po b/i18n/po/nb.po
index fe71345..9cfd0f7 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:55+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:55+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: nb\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3577,9 +3577,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5094,9 +5091,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "Laget er ikke i lista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5839,15 +5833,15 @@ msgstr "Orig. linje"
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Gjennomføre?"
 
@@ -6145,15 +6139,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6243,6 +6228,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6961,13 +6955,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8993,6 +8987,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -9010,12 +9010,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9771,10 +9765,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9783,6 +9774,9 @@ msgstr ""
 msgid "Direction"
 msgstr "Retning"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps-punkt"
 
@@ -9931,13 +9925,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11523,6 +11517,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Programtillegg inkludert i JOSM"
 
@@ -11531,11 +11530,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11620,6 +11614,9 @@ msgstr "Rediger URL for liste over programtillegg."
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11634,9 +11631,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11750,12 +11744,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Projeksjonsmetode"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Projeksjonsmetode"
+
 msgid "Display coordinates as"
 msgstr "Vis koordinater som"
 
@@ -11980,6 +11974,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11989,9 +11986,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13129,9 +13123,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Klargjør OSM-data …"
 
@@ -13243,6 +13234,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Støtter ikke WMS fil versjon;fant {0}, ønsker {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14992,6 +14986,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16075,6 +16072,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18067,6 +18067,12 @@ msgstr "med_klokka"
 msgid "Pedestrian Crossing"
 msgstr "Fotgjengerfelt"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18255,6 +18261,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19238,12 +19247,6 @@ msgstr "Busstasjon"
 msgid "Bus Stop"
 msgstr "Bussholdeplass"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Bussplatform"
 
@@ -24099,6 +24102,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} på en node. Bør brukes på linje."
 
@@ -24164,6 +24170,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26299,16 +26310,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27986,6 +27997,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30496,6 +30510,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30511,12 +30534,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30526,6 +30564,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30537,6 +30578,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/nds.po b/i18n/po/nds.po
index 5b01418..54060d3 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:54+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:54+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/nl.po b/i18n/po/nl.po
index ae210d1..c432332 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-16 11:44+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-08 14:17+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-05-04 04:39+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:39+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: nl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3901,9 +3901,6 @@ msgstr "Verwacht element ''{0}'', maar kreeg ''{1}''"
 msgid "value expected"
 msgstr "waarde verwacht"
 
-msgid " (at line {0}, column {1})"
-msgstr " (op regel {0}, kolom {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Projectie UTM (''+proj=utm'') vereist parameter ''+zone=...''."
 
@@ -5500,9 +5497,6 @@ msgstr "Stelsel van maten ingesteld op {0}"
 msgid "Layer not in list."
 msgstr "Laag niet in lijst."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "De laag ''{0}'' moet in de lijst beschikbare lagen staan"
-
 msgid "Default (open, closed, new)"
 msgstr "Standaard (open, closed, new)"
 
@@ -6310,17 +6304,17 @@ msgstr "Orig. weg"
 msgid "Decision"
 msgstr "Beslissing"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Selecteer de waarden die moeten worden behouden voor de volgende "
-"tags.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Toon alleen de tags met conflicten"
 
 msgid "Show tags with multiple values only"
 msgstr "Toon alleen de tags met meerdere waarden"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Selecteer de waarden die moeten worden behouden voor de volgende "
+"tags.</html>"
+
 msgid "Apply?"
 msgstr "Toepassen?"
 
@@ -6644,15 +6638,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Dialoogvenster Filter afsluiten om alle objecten te zien.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Geavanceerde objectinformatie"
-
-msgid "map style"
-msgstr "kaartstijl"
-
-msgid "edit counts"
-msgstr "tellingen bewerken"
-
 msgid "not in data set"
 msgstr "niet in gegevensset"
 
@@ -6742,6 +6727,15 @@ msgstr "Deel van: "
 msgid "In conflict with: "
 msgstr "In conflict met: "
 
+msgid "Advanced object info"
+msgstr "Geavanceerde objectinformatie"
+
+msgid "map style"
+msgstr "kaartstijl"
+
+msgid "edit counts"
+msgstr "tellingen bewerken"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Cache voor stijlen voor \"{0}\":"
 
@@ -7534,15 +7528,15 @@ msgstr "Zoek alleen in afgesloten wijzigingensets"
 msgid "Query both open and closed changesets"
 msgstr "Zoek zowel in geopende als afgesloten wijzigingensets"
 
+msgid "Only changesets owned by myself"
+msgstr "Alleen wijzigingensets waarvan ikzelf eigenaar ben"
+
 msgid "User ID:"
 msgstr "Gebruikers-ID:"
 
 msgid "User name:"
 msgstr "Gebruikersnaam:"
 
-msgid "Only changesets owned by myself"
-msgstr "Alleen wijzigingensets waarvan ikzelf eigenaar ben"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Alleen wijzigingensets waarvan de gebruiker met het opgegeven gebruikers-ID "
@@ -9851,6 +9845,13 @@ msgstr "Uploaden annuleren"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Onverwachte waarde voor sleutel ''{0}'' in voorkeuren, kreeg ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+"Vul een wijzigingenset op en keer terug naar het dialoogvenster Uploaden"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Open en gebruik zoveel nieuwe wijzigingensets als nodig zijn"
+
 msgid "Please select the upload strategy:"
 msgstr "Selecteer de strategie voor het uploaden:"
 
@@ -9870,13 +9871,6 @@ msgstr ""
 "<html>Er zijn <strong>meerdere wijzigingensets</strong> in volgorde nodig om "
 "{0} objecten te uploaden. Welke strategie wilt u gebruiken?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-"Vul een wijzigingenset op en keer terug naar het dialoogvenster Uploaden"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Open en gebruik zoveel nieuwe wijzigingensets als nodig zijn"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Uploaden in één verzoek niet mogelijk (te veel objecten te uploaden)"
 
@@ -10668,11 +10662,8 @@ msgstr "Er zijn geen lagen met afbeeldingen."
 msgid "No imagery layers"
 msgstr "Geen lagen met afbeeldingen"
 
-msgid "Velocity, km/h"
-msgstr "Snelheid, km/u"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Tijd"
@@ -10680,6 +10671,9 @@ msgstr "Tijd"
 msgid "Direction"
 msgstr "Richting"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "GPS-punt"
 
@@ -10848,15 +10842,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Lokaliseren van afbeelding ''{0}'' mislukt"
 
+msgid "Save Access Token in preferences"
+msgstr "Sla Toegangstoken op in voorkeuren"
+
 msgid "Access Token Key:"
 msgstr "Sleutel voor Toegangstoken:"
 
 msgid "Access Token Secret:"
 msgstr "Geheime code voor Toegangstoken:"
 
-msgid "Save Access Token in preferences"
-msgstr "Sla Toegangstoken op in voorkeuren"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12662,6 +12656,11 @@ msgstr "Interne voorkeuze"
 msgid "The default preset for JOSM"
 msgstr "De standaard voorkeuze voor JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Plugin {0} is nog steeds vereist bij deze plugin:"
+msgstr[1] "Plugin {0} is nog steeds vereist bij deze {1} plugins:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plug-in gebundeld met JOSM"
 
@@ -12672,11 +12671,6 @@ msgstr ""
 "Klik op <strong>Lijst downloaden</strong> om een lijst van beschikbare plug-"
 "ins te downloaden en weer te geven."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Plugin {0} is nog steeds vereist bij deze plugin:"
-msgstr[1] "Plugin {0} is nog steeds vereist bij deze {1} plugins:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versie {1} (lokaal: {2})"
 
@@ -12766,6 +12760,9 @@ msgstr "Wijzig URL voor de beschrijving van de JOSM plug-in"
 msgid "JOSM Plugin description URL"
 msgstr "URL voor de beschrijving van de JOSM plug-in"
 
+msgid "Update interval (in days):"
+msgstr "Tijdsperiode voor bijwerken (in dagen):"
+
 msgid "Ask before updating"
 msgstr "Vragen vóór bijwerken"
 
@@ -12782,9 +12779,6 @@ msgstr ""
 "Bepaal of JOSM, nadat het zelf bijgewerkt werd, bij het opstarten "
 "automatisch de actieve plug-ins moet bijwerken."
 
-msgid "Update interval (in days):"
-msgstr "Tijdsperiode voor bijwerken (in dagen):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12900,12 +12894,12 @@ msgstr "Rijksdriehoekscoördinaten (Nederland)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Zweden)"
 
-msgid "Projection method"
-msgstr "Projectiemethode"
-
 msgid "Projection code"
 msgstr "Projectiecode"
 
+msgid "Projection method"
+msgstr "Projectiemethode"
+
 msgid "Display coordinates as"
 msgstr "Coördinaten weergeven als"
 
@@ -13164,6 +13158,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Opslaan van toegangstoken voor OAuth naar beheerder van inloggegevens mislukt"
 
+msgid "Save to preferences"
+msgstr "Opslaan naar voorkeuren"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13177,9 +13174,6 @@ msgstr ""
 "U heeft al een Toegangstoken om toegang te krijgen tot de server van OSM met "
 "behulp van OAuth."
 
-msgid "Save to preferences"
-msgstr "Opslaan naar voorkeuren"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Klik om door het autorisatieproces van OAuth te gaan"
 
@@ -14431,9 +14425,6 @@ msgstr "Ontbrekend vereist attribuut ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Ongeldige long-waarde voor attribuut ''{0}''. Kreeg ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bytes zijn gelezen"
-
 msgid "Prepare OSM data..."
 msgstr "Gegevens van OSM voorbereiden..."
 
@@ -14547,6 +14538,9 @@ msgstr "WMS-bestanden (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Niet-ondersteunde versie WMS-bestand; gevonden {0}, verwachtte {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bytes zijn gelezen"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16294,7 +16288,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (Standaardlaag)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik zwart-wit)"
@@ -16572,6 +16566,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -16833,7 +16830,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Litouwen)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Luxemburg Inspire spoorwegen"
@@ -17735,6 +17732,9 @@ msgstr ""
 "kunt foutenrapporten maken, sluiten, ongeldig verklaren, opnieuw openen en "
 "opmerkingen plaatsen door deze plug-in te gebruiken."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19822,6 +19822,12 @@ msgstr "met de klok mee"
 msgid "Pedestrian Crossing"
 msgstr "Voetgangersoversteekplaats"
 
+msgid "Tactile Paving"
+msgstr "Tactiele tegels"
+
+msgid "incorrect"
+msgstr "onjuist"
+
 msgid "In case of traffic signals:"
 msgstr "In het geval van verkeerstekens:"
 
@@ -20012,6 +20018,9 @@ msgstr "Gracht"
 msgid "Kerb"
 msgstr "Berm"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Ingang (opening met barrière)"
 
@@ -21002,12 +21011,6 @@ msgstr "Busstation"
 msgid "Bus Stop"
 msgstr "Bushalte"
 
-msgid "Tactile Paving"
-msgstr "Tactiele tegels"
-
-msgid "incorrect"
-msgstr "onjuist"
-
 msgid "Bus Platform"
 msgstr "Busperron"
 
@@ -24246,7 +24249,7 @@ msgid "food"
 msgstr "voedsel"
 
 msgid "newspapers"
-msgstr ""
+msgstr "kranten"
 
 msgid "parking_tickets"
 msgstr "parkeerkaartjes"
@@ -24261,7 +24264,7 @@ msgid "public_transport_tickets"
 msgstr "openbaar vervoersbewijzen"
 
 msgid "SIM_cards"
-msgstr ""
+msgstr "SIM-kaarten"
 
 msgid "stamps"
 msgstr "postzegels"
@@ -25730,13 +25733,13 @@ msgid "Test"
 msgstr "Test"
 
 msgid "Even housenumber in odd address interpolation."
-msgstr ""
+msgstr "Even huisnummer in interpolatie voor oneven adressen."
 
 msgid "Odd housenumber in even address interpolation."
-msgstr ""
+msgstr "Oneven huisnummer in interpolatie voor even adressen."
 
 msgid "Way with {0}. Tag each housenumber separately if possible."
-msgstr ""
+msgstr "Weg met {0}. Tag, indien mogelijk, elk huisnummer afzonderlijk."
 
 msgid "{0} without {1}"
 msgstr "{0} zonder {1}"
@@ -25897,6 +25900,9 @@ msgstr ""
 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 ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} op een knoop. Zou moeten wordne gebruikt op een weg."
 
@@ -25943,7 +25949,7 @@ msgid "node connects waterway and bridge"
 msgstr "knoop verbindt waterweg en brug"
 
 msgid "{0} node connected to a highway"
-msgstr ""
+msgstr "{0} knoop verbonden met een highway"
 
 msgid "suspicious roundabout direction"
 msgstr "verdachte richting rotonde"
@@ -25964,6 +25970,11 @@ msgstr ""
 "Knoop verbindt een elektriciteitslijn of kabel met een object dat niet is "
 "gerelateerd aan de infrastructuur voor elektriciteit."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "afgekorte straatnaam"
 
@@ -28327,18 +28338,18 @@ msgstr "Doorlopend kaartgegevens downloaden bij pannen en zoomen."
 msgid "Toggle the continuous download on/off"
 msgstr "Doorlopend downloaden in-/uitschakelen"
 
-msgid "Download Settings"
-msgstr "Instellingen voor downloaden"
-
-msgid "Settings for the continuous download."
-msgstr "Instellingen voor het doorlopend downloaden."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Doorlopend downloaden activeren bij opstarten."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Onderdruk de standaard modale voortgangsmonitor bij het downloaden."
 
+msgid "Download Settings"
+msgstr "Instellingen voor downloaden"
+
+msgid "Settings for the continuous download."
+msgstr "Instellingen voor het doorlopend downloaden."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30122,6 +30133,9 @@ msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 "Naar locatie van afbeeldingen verplaatsen met knoppen Volgende/Vorige"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Modus Downloaden"
 
@@ -32781,6 +32795,15 @@ msgstr "Venster Te repareren openen"
 msgid "Tool:To-fix"
 msgstr "Programma:Te repareren"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Overslaan"
 
@@ -32796,12 +32819,27 @@ msgstr "Gerepareerde fout"
 msgid "Not an error"
 msgstr "Geen fout"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Downloadgebied instellen (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "tofix:Item overslaan"
 
@@ -32811,6 +32849,9 @@ msgstr "tofix:Gerepareerd item"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Item Geen fout"
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Onderhoudsserver"
 
@@ -32824,6 +32865,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Er ging iets mis, probeer opnieuw"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Kan geen knoop buiten de wereld plaatsen."
 
diff --git a/i18n/po/nn.po b/i18n/po/nn.po
index ca2c5a4..51ae4eb 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:55+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:55+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: nn\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/oc.po b/i18n/po/oc.po
index a9d620f..22a030c 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:56+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:56+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3527,9 +3527,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5035,9 +5032,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5752,15 +5746,15 @@ msgstr ""
 msgid "Decision"
 msgstr "Decision"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Aplicar ?"
 
@@ -6058,15 +6052,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6156,6 +6141,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6874,15 +6868,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr ""
+
 msgid "User ID:"
 msgstr "Identificant de l'utilizaire :"
 
 msgid "User name:"
 msgstr "Nom d'utilizaire :"
 
-msgid "Only changesets owned by myself"
-msgstr ""
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -8878,6 +8872,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8895,12 +8895,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9644,10 +9638,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9656,6 +9647,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punt GPS"
 
@@ -9796,13 +9790,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11366,6 +11360,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11374,11 +11373,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11463,6 +11457,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11477,9 +11474,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11593,10 +11587,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11823,6 +11817,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11832,9 +11829,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12954,9 +12948,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13067,6 +13058,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14806,6 +14800,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15881,6 +15878,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17866,6 +17866,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18054,6 +18060,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19037,12 +19046,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23892,6 +23895,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23957,6 +23963,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26069,16 +26080,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27743,6 +27754,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30248,6 +30262,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30263,12 +30286,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30278,6 +30316,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30289,6 +30330,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/pa.po b/i18n/po/pa.po
index d0cbebc..173d5f8 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:56+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:56+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: pa\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/pl.po b/i18n/po/pl.po
index 05e68c6..79dda45 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 14:11+0000\n"
-"Last-Translator: Daniel Koć <daniel at xn--ko-wla.pl>\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-24 13:02+0000\n"
+"Last-Translator: Teiron <mmok444 at gmail.com>\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-05-04 04:57+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:57+0000\n"
+"X-Generator: Launchpad (build 18053)\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"
@@ -3881,9 +3881,6 @@ msgstr "Oczekiwany element ''{0}'',ale otrzymano ''{1}''"
 msgid "value expected"
 msgstr "spodziewana wartość"
 
-msgid " (at line {0}, column {1})"
-msgstr " (linia {0}, kolumna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Projekcja UTM (''+proj=utm'') wymaga parametru ''+zone=...''."
 
@@ -5459,9 +5456,6 @@ msgstr "Zmieniono system miar na {0}"
 msgid "Layer not in list."
 msgstr "warstwa nie jest na liście."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Warstwa ''{0}'' musi być na liście warstw"
-
 msgid "Default (open, closed, new)"
 msgstr "Domyślnie (otwarte, zamknięte, nowe)"
 
@@ -6237,15 +6231,15 @@ msgstr "Oryg. linia"
 msgid "Decision"
 msgstr "Decyzja"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>Wybierz wartości odpowiadające tagom.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Pokaż tylko tagi z konfliktami"
 
 msgid "Show tags with multiple values only"
 msgstr "Pokaż tylko tagi z różnymi wartościami"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>Wybierz wartości odpowiadające tagom.</html>"
+
 msgid "Apply?"
 msgstr "Zastosować?"
 
@@ -6554,15 +6548,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Zamknij okno filtrów aby zobaczyć wszystkie obiekty.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Szczegółowe informacje o obiekcie"
-
-msgid "map style"
-msgstr "styl mapy"
-
-msgid "edit counts"
-msgstr "liczba edycji"
-
 msgid "not in data set"
 msgstr "nie w zestawie"
 
@@ -6653,6 +6638,15 @@ msgstr "Część: "
 msgid "In conflict with: "
 msgstr "W konflikcie z: "
 
+msgid "Advanced object info"
+msgstr "Szczegółowe informacje o obiekcie"
+
+msgid "map style"
+msgstr "styl mapy"
+
+msgid "edit counts"
+msgstr "liczba edycji"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Cache stylu dla \"{0}\":"
 
@@ -7411,15 +7405,15 @@ msgstr "Zapytanie tylko o zaknięte zestawy zmian"
 msgid "Query both open and closed changesets"
 msgstr "Zapytanie o otwarte i zamknięte zestawy zmian"
 
+msgid "Only changesets owned by myself"
+msgstr "Tylko własne zestawy zmian"
+
 msgid "User ID:"
 msgstr "ID użytkownika:"
 
 msgid "User name:"
 msgstr "Nazwa użytkownika:"
 
-msgid "Only changesets owned by myself"
-msgstr "Tylko własne zestawy zmian"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Tylko zestawy zmian użytkownika o następującym ID"
 
@@ -9631,6 +9625,13 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Nieoczekiwana wartość klucza ''{0}'' w preferencjach, otrzymano ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Wypełnij jeden zestaw zmian i powróć do dialogu wysyłki."
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+"Otwórz i użyj tak wielu nowych zestawów zmian jak to tylko konieczne."
+
 msgid "Please select the upload strategy:"
 msgstr "Wybierz metodę przesyłania:"
 
@@ -9650,13 +9651,6 @@ msgstr ""
 "<html>Potrzeba <strong>wielu zestawów zmian</strong> by wysłać {0} obiektów. "
 "Którą strategię chcesz użyć?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Wypełnij jeden zestaw zmian i powróć do dialogu wysyłki."
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-"Otwórz i użyj tak wielu nowych zestawów zmian jak to tylko konieczne."
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Wysłanie danych w jednym zapytaniem (zbyt wiele obiektów do wysłania)"
@@ -10456,10 +10450,7 @@ msgstr "Brak dostępnych podkładów mapy."
 msgid "No imagery layers"
 msgstr "Brak podkładów mapy"
 
-msgid "Velocity, km/h"
-msgstr "Prędkość, km/h"
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10468,6 +10459,9 @@ msgstr "Czas"
 msgid "Direction"
 msgstr "Kierunek"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punkt GPS"
 
@@ -10630,15 +10624,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Nie udało się zlokalizować obraz ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Zapisz klucz dostępu w ustawieniach"
+
 msgid "Access Token Key:"
 msgstr "Klucz dostępu:"
 
 msgid "Access Token Secret:"
 msgstr "Sekretny klucz dostępu:"
 
-msgid "Save Access Token in preferences"
-msgstr "Zapisz klucz dostępu w ustawieniach"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12325,6 +12319,12 @@ msgstr "Wewętrzne szablony"
 msgid "The default preset for JOSM"
 msgstr "Domyślne szablony JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Wtyczka {0} jest wciąż wymagana przez tę wtyczkę:"
+msgstr[1] "Wtyczka {0} jest wciąż wymagana przez te {1} wtyczki:"
+msgstr[2] "Wtyczka {0} jest wciąż wymagana przez te {1} wtyczek:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Wtyczka dostarczana wraz z JOSM"
 
@@ -12335,12 +12335,6 @@ msgstr ""
 "Proszę kliknąć <strong>Pobierz listę</strong> aby pobrać i wyświetlić listę "
 "dostępnych wtyczek."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Wtyczka {0} jest wciąż wymagana przez tę wtyczkę:"
-msgstr[1] "Wtyczka {0} jest wciąż wymagana przez te {1} wtyczki:"
-msgstr[2] "Wtyczka {0} jest wciąż wymagana przez te {1} wtyczek:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Wersja {1} (lokalna: {2})"
 
@@ -12435,6 +12429,9 @@ msgstr "Edytuj adres URL listy wtyczek dla JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "Adres URL listy wtyczek dla JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Czas pomiędzy aktualizacjami (w dniach):"
+
 msgid "Ask before updating"
 msgstr "Pytaj przed aktualizacją"
 
@@ -12451,9 +12448,6 @@ msgstr ""
 "Zdecyduj, czy JOSM może automatycznie aktualizować wtyczki po własnej "
 "aktualizacji"
 
-msgid "Update interval (in days):"
-msgstr "Czas pomiędzy aktualizacjami (w dniach):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12567,12 +12561,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Szwecja)"
 
-msgid "Projection method"
-msgstr "Rodzaj odwzorowania kartograficznego"
-
 msgid "Projection code"
 msgstr "Kod odwzorowania"
 
+msgid "Projection method"
+msgstr "Rodzaj odwzorowania kartograficznego"
+
 msgid "Display coordinates as"
 msgstr "Wyświetlaj współrzędne jako"
 
@@ -12812,6 +12806,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "Zapisz do ustawień"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12821,9 +12818,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr "Zapisz do ustawień"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13983,9 +13977,6 @@ msgstr "Brakuje wymaganego atrybutu ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr "odczytano {0} bajtów"
-
 msgid "Prepare OSM data..."
 msgstr "Przygotowywanie danych OSM..."
 
@@ -14099,6 +14090,9 @@ msgstr "Pliki WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nieosługiwana wersja pliku WMS; znaleziono {0}, oczekiwano {1}"
 
+msgid "{0} bytes have been read"
+msgstr "odczytano {0} bajtów"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15931,6 +15925,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -17016,6 +17013,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19016,6 +19016,12 @@ msgstr "zgodnie z ruchem wskazówek zegara"
 msgid "Pedestrian Crossing"
 msgstr "Przejście dla pieszych"
 
+msgid "Tactile Paving"
+msgstr "Nawierzchnia dla niewidomych"
+
+msgid "incorrect"
+msgstr "nieprawidłowa"
+
 msgid "In case of traffic signals:"
 msgstr "W przypadku sygnalizacji świetlnej:"
 
@@ -19122,7 +19128,7 @@ msgid "rising"
 msgstr ""
 
 msgid "removable"
-msgstr ""
+msgstr "możliwe do usunięcia"
 
 msgid "plastic"
 msgstr "plastik"
@@ -19206,6 +19212,9 @@ msgstr "Rów"
 msgid "Kerb"
 msgstr "Krawężnik"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Przejście przez ogrodzenie"
 
@@ -20189,12 +20198,6 @@ msgstr "Dworzec autobusowy"
 msgid "Bus Stop"
 msgstr "Przystanek autobusowy"
 
-msgid "Tactile Paving"
-msgstr "Nawierzchnia dla niewidomych"
-
-msgid "incorrect"
-msgstr "nieprawidłowa"
-
 msgid "Bus Platform"
 msgstr "Peron autobusowy"
 
@@ -23867,22 +23870,22 @@ msgid "Volcano"
 msgstr "Wulkan"
 
 msgid "A volcano, either dormant, extinct or active."
-msgstr ""
+msgstr "Wulkan, zrówno wygasły, uśpiony lub aktywny."
 
 msgid "Current Status"
 msgstr "Stan obecny"
 
 msgid "dormant"
-msgstr ""
+msgstr "uśpiony"
 
 msgid "extinct"
-msgstr ""
+msgstr "wygasły"
 
 msgid "stratovolcano"
-msgstr ""
+msgstr "Stratowulkan"
 
 msgid "shield"
-msgstr ""
+msgstr "Wulkan tarczowy"
 
 msgid "scoria"
 msgstr ""
@@ -24040,7 +24043,7 @@ msgid "Sand"
 msgstr "Piach"
 
 msgid "Large area covered with sand."
-msgstr ""
+msgstr "Duży obszar pokryty piaskiem."
 
 msgid "Bare Rock"
 msgstr "Lita skała"
@@ -25050,6 +25053,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -25115,6 +25121,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -27239,18 +27250,18 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
-msgstr "Pobierz ustawienia"
-
-msgid "Settings for the continuous download."
-msgstr ""
-
 msgid "Activate continuous downloads at startup."
 msgstr ""
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
+msgid "Download Settings"
+msgstr "Pobierz ustawienia"
+
+msgid "Settings for the continuous download."
+msgstr ""
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -28920,6 +28931,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31443,6 +31457,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31458,12 +31481,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31473,6 +31511,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -31484,6 +31525,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Nie mogę umieścić węzła poza obszarem świata."
 
diff --git a/i18n/po/pt.po b/i18n/po/pt.po
index 08afaa6..0508851 100644
--- a/i18n/po/pt.po
+++ b/i18n/po/pt.po
@@ -7,16 +7,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-01 17:05+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+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"
 "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-05-04 04:58+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:58+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: pt\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3901,9 +3901,6 @@ msgstr "Era esperado o elemento ''{0}'', mas foi obtido ''{1}''"
 msgid "value expected"
 msgstr "valor esperado"
 
-msgid " (at line {0}, column {1})"
-msgstr " (na linha {0}, coluna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "A projeção UTM (''+proj=utm'') requer o parâmetro ''+zone=...''"
 
@@ -5531,9 +5528,6 @@ msgstr "Sistema de medidas alterado para {0}"
 msgid "Layer not in list."
 msgstr "A camada não existe na lista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "A camada ''{0}'' tem de existir na lista de camadas"
-
 msgid "Default (open, closed, new)"
 msgstr "Padrão (aberto, fechado, novo)"
 
@@ -6322,16 +6316,16 @@ msgstr "Linha Orig."
 msgid "Decision"
 msgstr "Decisão"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Por favor selecione os valores a manter nas seguintes etiquetas.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Mostrar apenas etiquetas com conflitos"
 
 msgid "Show tags with multiple values only"
 msgstr "Mostrar apenas etiquetas com vários valores"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Por favor selecione os valores a manter nas seguintes etiquetas.</html>"
+
 msgid "Apply?"
 msgstr "Aplicar?"
 
@@ -6651,15 +6645,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Fechar o painel dos Filtros para ver todos os objetos.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informações detalhadas dos objetos selecionados"
-
-msgid "map style"
-msgstr "estilo de mapa"
-
-msgid "edit counts"
-msgstr "número de alterações"
-
 msgid "not in data set"
 msgstr "não está no conjunto de dados"
 
@@ -6749,6 +6734,15 @@ msgstr "Parte de: "
 msgid "In conflict with: "
 msgstr "Em conflito com: "
 
+msgid "Advanced object info"
+msgstr "Informações detalhadas dos objetos selecionados"
+
+msgid "map style"
+msgstr "estilo de mapa"
+
+msgid "edit counts"
+msgstr "número de alterações"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Cache de Estilos para \"{0}\":"
 
@@ -7538,15 +7532,15 @@ msgstr "Obter apenas conjuntos de alterações fechados"
 msgid "Query both open and closed changesets"
 msgstr "Obter conjuntos de alterações abertos e fechados"
 
+msgid "Only changesets owned by myself"
+msgstr "Apenas conjuntos de alterações da minha autoria"
+
 msgid "User ID:"
 msgstr "Identificador de utilizador:"
 
 msgid "User name:"
 msgstr "Nome de utilizador:"
 
-msgid "Only changesets owned by myself"
-msgstr "Apenas conjuntos de alterações da minha autoria"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Apenas conjuntos de alterações da autoria do seguinte utilizador com o "
@@ -7830,16 +7824,16 @@ msgid "Gamma"
 msgstr "Gama"
 
 msgid "Adjust sharpness/blur value of the layer."
-msgstr ""
+msgstr "Ajustar a nitidez da camada"
 
 msgid "Sharpness"
-msgstr ""
+msgstr "Nitidez"
 
 msgid "Adjust colorfulness of the layer."
-msgstr ""
+msgstr "Ajustar a saturação da cor da camada."
 
 msgid "Colorfulness"
-msgstr ""
+msgstr "Saturação das cores"
 
 msgid "Merge this layer into another layer"
 msgstr "Fundir esta camada noutra camada"
@@ -9846,6 +9840,12 @@ msgstr "Cancelar envio"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Valor inesperado da chave ''{0}'' nas preferências. Obtido ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Encher um conjunto de alterações e voltar à Janela de Envios"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Abrir e usar novos conjuntos de alterações conforme necessário"
+
 msgid "Please select the upload strategy:"
 msgstr "Escolha a forma como quer enviar os dados:"
 
@@ -9865,12 +9865,6 @@ msgstr ""
 "<html>É necessário utilizar <strong>vários conjuntos de alterações</strong> "
 "para enviar {0} objetos. Que método quer utilizar?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Encher um conjunto de alterações e voltar à Janela de Envios"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Abrir e usar novos conjuntos de alterações conforme necessário"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Impossível enviar apenas num só pacote (demasiados objetos a enviar)"
 
@@ -10659,11 +10653,8 @@ msgstr "Não existe nenhuma cada de imagem de fundo."
 msgid "No imagery layers"
 msgstr "Nenhuma camada de imagens de fundo"
 
-msgid "Velocity, km/h"
-msgstr "Velocidade, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Tempo"
@@ -10671,6 +10662,9 @@ msgstr "Tempo"
 msgid "Direction"
 msgstr "Sentido do trânsito"
 
+msgid "Velocity, {0}"
+msgstr "Velocidade, {0}"
+
 msgid "gps point"
 msgstr "ponto gps"
 
@@ -10836,15 +10830,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Não foi possível localizar a imagem ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Gravar o Token de Acesso nas preferências"
+
 msgid "Access Token Key:"
 msgstr "Token de Acesso:"
 
 msgid "Access Token Secret:"
 msgstr "Token de Acesso Secreto:"
 
-msgid "Save Access Token in preferences"
-msgstr "Gravar o Token de Acesso nas preferências"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12150,10 +12144,10 @@ msgstr ""
 "os ficheiros que o JOSM pode abrir, mas sim todos)"
 
 msgid "Reverse zoom with mouse wheel"
-msgstr ""
+msgstr "Enquadramento invertido com a roda do rato"
 
 msgid "Intermediate steps between native resolutions"
-msgstr ""
+msgstr "Passos intermédios entre resoluções nativas"
 
 msgid "Show localized name in selection lists, if available"
 msgstr ""
@@ -12197,7 +12191,7 @@ msgid ""
 msgstr ""
 
 msgid "Zoom steps to get double scale"
-msgstr ""
+msgstr "Passos de enquadramento para obter escala dupla"
 
 msgid ""
 "Higher value means more steps needed, therefore zoom steps will be smaller"
@@ -12653,6 +12647,11 @@ msgstr "Modelo de Etiquetas JOSM"
 msgid "The default preset for JOSM"
 msgstr "Os modelos de etiquetas originais do JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "O módulo {0} é utilizado pelo módulo:"
+msgstr[1] "O módulo {0} é utilizado por {1} módulos:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Módulo incluído no JOSM"
 
@@ -12663,11 +12662,6 @@ msgstr ""
 "Por favor clique em <strong>Descarregar lista</strong> para descarregar e "
 "mostrar uma lista de módulos para o JOSM disponíveis."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "O módulo {0} é utilizado pelo módulo:"
-msgstr[1] "O módulo {0} é utilizado por {1} módulos:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versão {1} (local: {2})"
 
@@ -12755,6 +12749,9 @@ msgstr "Editar o endereço web de descrição do módulo do JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "Endereço web de descrição do módulo do JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Intervalo de atualização (dias):"
+
 msgid "Ask before updating"
 msgstr "Perguntar antes de atualizar"
 
@@ -12771,9 +12768,6 @@ msgstr ""
 "Indique se o JOSM deve atualizar automaticamente os módulos ativos ao "
 "iniciar o JOSM após uma atualização da versão do JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Intervalo de atualização (dias):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12889,12 +12883,12 @@ msgstr "Rijksdriehoekscoördinaten (Países Baixos)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suécia)"
 
-msgid "Projection method"
-msgstr "Método de projeção"
-
 msgid "Projection code"
 msgstr "Código de projeção"
 
+msgid "Projection method"
+msgstr "Método de projeção"
+
 msgid "Display coordinates as"
 msgstr "Mostrar coordenadas como"
 
@@ -13158,6 +13152,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Não foi possível gravar o Token de Acesso OAuth no gestor de credenciais."
 
+msgid "Save to preferences"
+msgstr "Gravar nas preferências"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13169,9 +13166,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Já tem um Token de Acesso para aceder ao servidor OSM usando OAuth."
 
-msgid "Save to preferences"
-msgstr "Gravar nas preferências"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Clique para seguir os passos do processo de autorização OAuth"
 
@@ -14443,9 +14437,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "O valor longo do atributo ''{0}'' está errado . Atualmente é ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "foram lidos {0} bytes"
-
 msgid "Prepare OSM data..."
 msgstr "A preparar dados OSM..."
 
@@ -14558,6 +14549,9 @@ msgstr "Ficheiros WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versão de ficheiro WMS não suportada; encontrada {0}, esperada {1}"
 
+msgid "{0} bytes have been read"
+msgstr "foram lidos {0} bytes"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16308,7 +16302,7 @@ msgid "OpenSeaMap"
 msgstr "OpenSeaMap"
 
 msgid "OpenStreetMap Carto (Standard layer)"
-msgstr ""
+msgstr "OpenStreetMap Carto (camada padrão)"
 
 msgid "OpenStreetMap (Mapnik Black & White)"
 msgstr "OpenStreetMap (Mapnik Preto e Branco)"
@@ -16586,6 +16580,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordéus - 2012"
 
@@ -16617,10 +16614,10 @@ msgid "Géolittoral - Sentiers"
 msgstr "Géolittoral - Sentiers"
 
 msgid "Lyon - Orthophoto 2012-03 10cm - EPSG:3946"
-msgstr ""
+msgstr "Lyon - Orthophoto 2012-03 10cm - EPSG:3946"
 
 msgid "Lyon - Orthophoto 2015-05 8cm - EPSG:3946"
-msgstr ""
+msgstr "Lyon - Orthophoto 2015-05 8cm - EPSG:3946"
 
 msgid "Loire-Atlantique - Orthophotos 2012 - 20 cm"
 msgstr "Loire-Atlantique - Ortofotos 2012 - 20 cm"
@@ -16675,13 +16672,13 @@ msgid "Bavaria (2 m)"
 msgstr "Baviera (2 m)"
 
 msgid "Berlin aerial photograph 2011"
-msgstr ""
+msgstr "Berlim aerial photograph 2011"
 
 msgid "Berlin aerial photograph 2014"
-msgstr ""
+msgstr "Berlim aerial photograph 2014"
 
 msgid "Berlin aerial photograph 2015"
-msgstr ""
+msgstr "Berlim aerial photograph 2015"
 
 msgid "Stuttgart (aerial imagery)"
 msgstr "Estugarda (imagens aéreas)"
@@ -16730,31 +16727,32 @@ msgid "FÖMI ortophoto 2000"
 msgstr "FÖMI ortofoto 2000"
 
 msgid "FÖMI ortophoto 2005"
-msgstr ""
+msgstr "FÖMI ortophoto 2005"
 
 msgid "Szeged ortophoto 2011"
-msgstr ""
+msgstr "Szeged ortophoto 2011"
 
 msgid "Inner part of Szeged"
-msgstr ""
+msgstr "Inner part of Szeged"
 
 msgid "Törökbálint ortophoto 2013"
-msgstr ""
+msgstr "Törökbálint ortophoto 2013"
 
 msgid "5 cm resolution bald image"
-msgstr ""
+msgstr "5 cm resolution bald image"
 
 msgid "Törökbálint ortophoto 2015"
-msgstr ""
+msgstr "Törökbálint ortophoto 2015"
 
 msgid "Danube flood ortophoto 2013"
-msgstr ""
+msgstr "Danube flood ortophoto 2013"
 
 msgid "Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"
 msgstr ""
+"Bacia hidrográfica do Danúbio emBudapeste, Szentendre e Szigetmonostor"
 
 msgid "Budapest district XII ortophoto 2013"
-msgstr ""
+msgstr "Budapeste distritoXII ortofoto 2013"
 
 msgid "Interspect Budapest ortophoto 2014"
 msgstr "Interspect Budapeste ortofoto2014"
@@ -16763,10 +16761,10 @@ msgid "Five districts of Budapest: III, IV, XIII, XIV, XV"
 msgstr "5 distritos de Budapeste: III, IV, XIII, XIV, XV"
 
 msgid "OpenStreetMap Hungary (hiking routes)"
-msgstr ""
+msgstr "OpenStreetMap Hungria (rotas pedestres)"
 
 msgid "Hillshade Hungary"
-msgstr ""
+msgstr "Hillshade Hungria"
 
 msgid "Ireland British War Office 1:25k GSGS 3906"
 msgstr "Departamento de Guerra da Irlanda Britânica 1:25k GSGS 3906"
@@ -16809,7 +16807,7 @@ msgid "Lodi - Italy"
 msgstr "Lodi - Itália"
 
 msgid "Lombardia - Italy (CTR)"
-msgstr ""
+msgstr "Lombardia - Itália(CTR)"
 
 msgid "Lombardia - Italy (CTR DBT)"
 msgstr "Lombardia - Itália (CTR DBT)"
@@ -16848,7 +16846,7 @@ msgid "ORT10LT (Lithuania)"
 msgstr "ORT10LT (Lituânia)"
 
 msgid "geoportail.lu"
-msgstr ""
+msgstr "geoportail.lu"
 
 msgid "Luxembourg Inspire Railway"
 msgstr "Luxemburgo Inspire - Caminho de Ferro"
@@ -16950,7 +16948,7 @@ msgid "Powiat poznański: Ortofotomapa (Aerial image)"
 msgstr "Powiat poznański: Ortofotomapa (imagens aéreas)"
 
 msgid "Powiat ropczycko-sędziszowski: Budynki (buildings)"
-msgstr ""
+msgstr "Powiat ropczycko-sędziszowski: Budynki (edifícios)"
 
 msgid "Powiat rzeszowski: Budynki (buildings)"
 msgstr "Polónia, Condado de Rzeszów: Edifícios"
@@ -16962,7 +16960,7 @@ msgid "Powiat stalowowolski: Budynki (buildings)"
 msgstr "Polónia, Condado de Stalowa Wola: Edifícios"
 
 msgid "Poznań: Ortofotomapa 2014 (aerial image)"
-msgstr ""
+msgstr "Poznań: Ortofotomapa 2014 (imagens aéreas)"
 
 msgid "Przemyśl: Budynki (buildings)"
 msgstr "Polónia, Przemyśl: Edifícios"
@@ -17073,7 +17071,7 @@ msgid "Kanton Aargau 25cm (AGIS 2014)"
 msgstr "Cantão da Argóvia 25cm (AGIS 2014)"
 
 msgid "Kanton Zürich Orthophotos 2014/2015 10cm"
-msgstr ""
+msgstr "Kanton Zürich Orthophotos 2014/2015 10cm"
 
 msgid "Stadt Uster Orthophoto 2008 10cm"
 msgstr "Stadt Uster Ortofoto 2008 10cm"
@@ -17733,6 +17731,9 @@ msgstr ""
 "reportar novos erros, fechá-los, invalidá-los, reabri-los e comentá-los "
 "utilizando este módulo."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19169,7 +19170,7 @@ msgid "Destination"
 msgstr "Destino"
 
 msgid "Destination reference"
-msgstr ""
+msgstr "Referência do destino"
 
 msgid "Placement"
 msgstr "Posicionamento"
@@ -19779,7 +19780,7 @@ msgid "Optional crossing attributes:"
 msgstr "Atributos de passagem opcionais:"
 
 msgid "Pedestrian crossing type"
-msgstr "Tipo de Passagem de Peões"
+msgstr "Tipo de passagem de peões rodoviária"
 
 msgid "uncontrolled"
 msgstr "sem semáforos (apenas a zebra caso exista)"
@@ -19845,7 +19846,13 @@ msgid "clockwise"
 msgstr "dos ponteiros do relógio"
 
 msgid "Pedestrian Crossing"
-msgstr "Passagem de Peões (normalmente c/ passadeira)"
+msgstr "Passagem de Peões Rodoviária (normalmente c/ passadeira)"
+
+msgid "Tactile Paving"
+msgstr "Pavimento Táctil"
+
+msgid "incorrect"
+msgstr "incorreto ou mal aplicado"
 
 msgid "In case of traffic signals:"
 msgstr "No caso de semáforos:"
@@ -20036,6 +20043,9 @@ msgstr "Fosso / Vala / Trincheira"
 msgid "Kerb"
 msgstr "Lancil (passeio desnivelado sem rampa)"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrada (ponto de passagem aberta sem barreiras)"
 
@@ -20544,10 +20554,10 @@ msgid "double_half"
 msgstr "ocupa toda a estrada c/1 cancela de cada lado"
 
 msgid "Crossing"
-msgstr "Passagem de Peões"
+msgstr "Passagem de Peões Ferroviária"
 
 msgid "Crossing type"
-msgstr "Tipo de passagem de peões"
+msgstr "Tipo de passagem de peões ferroviária"
 
 msgid "Turntable"
 msgstr "Rotunda ferroviária"
@@ -21024,12 +21034,6 @@ msgstr "Estação de Autocarros"
 msgid "Bus Stop"
 msgstr "Paragem de Autocarro"
 
-msgid "Tactile Paving"
-msgstr "Pavimento Táctil"
-
-msgid "incorrect"
-msgstr "incorreto ou mal aplicado"
-
 msgid "Bus Platform"
 msgstr "Plataforma Rodoviária"
 
@@ -22678,7 +22682,7 @@ msgstr "torre de transformador de energia elétrica"
 
 msgctxt "building"
 msgid "public"
-msgstr ""
+msgstr "público"
 
 msgctxt "building"
 msgid "Levels"
@@ -24270,7 +24274,7 @@ msgid "food"
 msgstr "alimentos"
 
 msgid "newspapers"
-msgstr ""
+msgstr "Jornais"
 
 msgid "parking_tickets"
 msgstr "bilhetes de estacionamento"
@@ -24285,7 +24289,7 @@ msgid "public_transport_tickets"
 msgstr "bilhetes de transporte público"
 
 msgid "SIM_cards"
-msgstr ""
+msgstr "Cartões de telemóveis"
 
 msgid "stamps"
 msgstr "selos de correio"
@@ -25767,6 +25771,7 @@ msgstr ""
 
 msgid "Way with {0}. Tag each housenumber separately if possible."
 msgstr ""
+"Via com {0}. Etiquetar cada número de porta separadamente se possível."
 
 msgid "{0} without {1}"
 msgstr "{0} sem {1}"
@@ -25916,6 +25921,9 @@ msgstr "{0} está em desuso. Usar a chave de prefixo {1}:"
 msgid "questionable key (ending with a number): {0}"
 msgstr "chave questionável (termina com um número): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "A chave {0} tem um valor incomum."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} num nó. Deve ser usado numa linha."
 
@@ -25981,6 +25989,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome abreviado da rua"
 
@@ -26009,10 +26022,10 @@ msgstr ""
 "O valor de ''{0}'' deve ser ''{1}'' ou ''{2}''. Para passeios use ''{3}''."
 
 msgid "pedestrian railway crossing without {0}"
-msgstr ""
+msgstr "passagem de peões ferroviária sem {0}"
 
 msgid "railway crossing without {0}"
-msgstr ""
+msgstr "passagem de nível ferroviária sem {0}"
 
 msgid "{0} with multiple values"
 msgstr "{0} com vários valores"
@@ -28336,18 +28349,18 @@ msgstr "Descarrega dados do OpenStreetMap à medida que muda de vista"
 msgid "Toggle the continuous download on/off"
 msgstr "Alternar descarregamento continuado ativado/desativado"
 
-msgid "Download Settings"
-msgstr "Definições de Descarregamento"
-
-msgid "Settings for the continuous download."
-msgstr "Definições para o descarregamento contínuo"
-
 msgid "Activate continuous downloads at startup."
 msgstr "Ativar descarregamento contínuo ao iniciar."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
+msgid "Download Settings"
+msgstr "Definições de Descarregamento"
+
+msgid "Settings for the continuous download."
+msgstr "Definições para o descarregamento contínuo"
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30107,6 +30120,9 @@ msgstr "Usar formato 24 horas"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Ver a localização da imagem seguinte com os botões seguinte/anterior"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Modo de descarregamento"
 
@@ -32786,6 +32802,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Ignorar"
 
@@ -32801,12 +32826,27 @@ msgstr "Erro Corrigido"
 msgid "Not an error"
 msgstr "Não é um erro"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Dfinir área a descarregar (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32816,6 +32856,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Servidor de manutenção"
 
@@ -32829,6 +32872,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Algo correu mal, tente de novo"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Não é possível colocar um nó fora do mundo."
 
@@ -34260,20 +34306,21 @@ msgid "Replace geometry for way {0}"
 msgstr "Substituída geometria da linha {0}"
 
 msgid "Replace Membership"
-msgstr ""
+msgstr "Substituir Pertença a Relações"
 
 msgid ""
 "In relations where the selected object is member of, replace it with a new "
 "one"
-msgstr ""
+msgstr "Substitui as relações a que um objeto pertence"
 
 msgid "Replaced ''{0}'' by ''{1}'' in {2} relation"
 msgid_plural "Replaced ''{0}'' by ''{1}'' in {2} relations"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Substituído ''{0}'' por ''{1}'' em {2} relação"
+msgstr[1] "Substituído ''{0}'' por ''{1}'' em {2} relações"
 
 msgid "The first selected object ''{0}'' is not part of any relation"
 msgstr ""
+"O primeiro objeto selecionado ''{0}'' não faz parte de nenhuma relação"
 
 msgid "Range of child primitives count"
 msgstr ""
diff --git a/i18n/po/pt_BR.po b/i18n/po/pt_BR.po
index 483ee48..10e4128 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 12:40+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-23 20:33+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-05-04 05:07+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:08+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: pt_BR\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -1548,7 +1548,7 @@ msgid "Toggles the global setting ''{0}''."
 msgstr "Mudar a configuração global ''{0}''."
 
 msgid "Encourage/discourage upload"
-msgstr "Estimular/desestimular envio"
+msgstr "Encorajar/desencorajar envio"
 
 msgid "UnGlue Ways"
 msgstr "Desgrudar caminhos"
@@ -3854,9 +3854,6 @@ msgstr "Elemento esperado ''{0}'', mas obteve ''{1}''"
 msgid "value expected"
 msgstr "valor esperado"
 
-msgid " (at line {0}, column {1})"
-msgstr " (na linha {0}, coluna {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Projeção UTM (\"+proj=utm\") requer parâmetro \"+zone=...\"."
 
@@ -4604,7 +4601,7 @@ msgid "Property values start or end with white space"
 msgstr "Valores de propriedade começam ou terminam com espaço em branco"
 
 msgid "Property values contain multiple white spaces"
-msgstr "Os valores da propriedade contém vários espaços em brnaco"
+msgstr "Valor do atributo contém múltiplos espaços em branco"
 
 msgid "Property values contain HTML entity"
 msgstr "Valores de propriedade contêm entidade HTML"
@@ -5446,9 +5443,6 @@ msgstr "Sistema de medidas mudado para {0}"
 msgid "Layer not in list."
 msgstr "camada não está na lista."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Camada ''{0}'' precisa estar na lista de camadas"
-
 msgid "Default (open, closed, new)"
 msgstr "Padrão (aberto, fechado, novo)"
 
@@ -6243,17 +6237,17 @@ msgstr "Caminho Original"
 msgid "Decision"
 msgstr "Decisão"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Por favor selecione os valores para manter as seguintes "
-"etiquetas.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Mostra somente tags com conflito"
 
 msgid "Show tags with multiple values only"
 msgstr "Mostra somente tags com valores múltiplos"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Por favor selecione os valores para manter as seguintes "
+"etiquetas.</html>"
+
 msgid "Apply?"
 msgstr "Aplicar?"
 
@@ -6570,15 +6564,6 @@ msgstr[1] "<b>{0}</b> objetos desabilitados"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Feche a janela de filtros para ver todos objetos.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Informação avançada de objeto"
-
-msgid "map style"
-msgstr "estilo de mapa"
-
-msgid "edit counts"
-msgstr "contagem de edições"
-
 msgid "not in data set"
 msgstr "não no conjunto de dados"
 
@@ -6668,6 +6653,15 @@ msgstr "Parte de: "
 msgid "In conflict with: "
 msgstr "Em conflito com: "
 
+msgid "Advanced object info"
+msgstr "Informação avançada de objeto"
+
+msgid "map style"
+msgstr "estilo de mapa"
+
+msgid "edit counts"
+msgstr "contagem de edições"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Estilos de cache para \"{0} \":"
 
@@ -7447,15 +7441,15 @@ msgstr "Buscar somente conjuntos de alterações fechados"
 msgid "Query both open and closed changesets"
 msgstr "Buscar conjuntos de alterações abertos e fechados"
 
+msgid "Only changesets owned by myself"
+msgstr "Somente conjuntos de alterações que pertencem a mim"
+
 msgid "User ID:"
 msgstr "ID do usuário:"
 
 msgid "User name:"
 msgstr "Nome do usuário:"
 
-msgid "Only changesets owned by myself"
-msgstr "Somente conjuntos de alterações que pertencem a mim"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Somente conjuntos de alterações do usuário com o seguinte ID"
 
@@ -7716,10 +7710,10 @@ msgid "Copy {1} of {0}"
 msgstr "Cópia {1} de {0}"
 
 msgid "Change visibility of the selected layer."
-msgstr ""
+msgstr "Muda a visibilidade da camada selecionada"
 
 msgid "Show layer"
-msgstr ""
+msgstr "Exibir a camada"
 
 msgid "Adjust opacity of the layer."
 msgstr "Ajusta a opacidade da camada."
@@ -7734,16 +7728,16 @@ msgid "Gamma"
 msgstr "Gama"
 
 msgid "Adjust sharpness/blur value of the layer."
-msgstr ""
+msgstr "Ajusta o valor da nitidez da camada"
 
 msgid "Sharpness"
-msgstr ""
+msgstr "Nitidez"
 
 msgid "Adjust colorfulness of the layer."
-msgstr ""
+msgstr "Ajusta a saturação da camada"
 
 msgid "Colorfulness"
-msgstr ""
+msgstr "Saturação"
 
 msgid "Merge this layer into another layer"
 msgstr "Combinar esta camada em outra camada"
@@ -9724,6 +9718,13 @@ msgstr "Cancelar envio"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Valor inesperado para a chave ''{0}'' nas preferências, tem ''{1} ''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Encher um conjunto de dados e retornar para o Diálogo de Envio"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+"Abrir e usar tantos conjuntos de alterações quantos forem necessários"
+
 msgid "Please select the upload strategy:"
 msgstr "Por favor, selecione a estratégia de envio:"
 
@@ -9743,13 +9744,6 @@ msgstr ""
 "<html>Será necessário <strong>múltiplos conjuntos de alterações</strong> "
 "para poder enviar {0} objetos. Qual estratégia você deseja utilizar?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Encher um conjunto de dados e retornar para o Diálogo de Envio"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-"Abrir e usar tantos conjuntos de alterações quantos forem necessários"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Envio em apenas uma requisição não foi possível (muitos objetos a serem "
@@ -10543,11 +10537,8 @@ msgstr "Não há camada de imagens."
 msgid "No imagery layers"
 msgstr "Nenhuma camada de imagens"
 
-msgid "Velocity, km/h"
-msgstr "Velocidade, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Tempo"
@@ -10555,6 +10546,9 @@ msgstr "Tempo"
 msgid "Direction"
 msgstr "Direção"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "ponto GPS"
 
@@ -10715,15 +10709,15 @@ msgstr "Falha ao analisar estilos Mappaint de ''{0}''. Erro foi: {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Falha ao localizar imagem ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Salvar o Token de Acesso nas preferẽncias"
+
 msgid "Access Token Key:"
 msgstr "Chave do Token de Acesso:"
 
 msgid "Access Token Secret:"
 msgstr "Chave secreta do Token de Acesso:"
 
-msgid "Save Access Token in preferences"
-msgstr "Salvar o Token de Acesso nas preferẽncias"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12495,6 +12489,11 @@ msgstr "Predefinição interna"
 msgid "The default preset for JOSM"
 msgstr "A predefinição padrão do JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "O plugin {0} ainda é exigido por este plugin:"
+msgstr[1] "O plugin {0} ainda é exigido por estes {1} plugins:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plugin que vem junto com o JOSM"
 
@@ -12505,11 +12504,6 @@ msgstr ""
 "Por favor clique em <strong>Baixar Lista</strong> para baixar e mostrar a "
 "lista de plugins disponíveis."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "O plugin {0} ainda é exigido por este plugin:"
-msgstr[1] "O plugin {0} ainda é exigido por estes {1} plugins:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Versão {1} (versão instalada: {2})"
 
@@ -12596,6 +12590,9 @@ msgstr "Editar a URL de descrição do Plugin do JOSM."
 msgid "JOSM Plugin description URL"
 msgstr "URL de descrição do plugin do JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Intervalo de atualização (em dias):"
+
 msgid "Ask before updating"
 msgstr "Perguntar antes de atualizar"
 
@@ -12612,9 +12609,6 @@ msgstr ""
 "Por favor, decida se o JOSM deve atualizar automaticamente os plugins ativos "
 "no início do programa depois de uma atualização do próprio JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Intervalo de atualização (em dias):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12707,7 +12701,7 @@ msgid "Lambert 4 Zones (France)"
 msgstr "Zonas Lambert 4 (França)"
 
 msgid "WGS84 Geographic"
-msgstr "Geografia WGS84"
+msgstr "WGS84 Geográfico"
 
 msgid "Belgian Lambert 1972"
 msgstr "Belgian Lambert 1972"
@@ -12730,12 +12724,12 @@ msgstr "Rijksdriehoekscoördinaten (Netherlands)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Suécia)"
 
-msgid "Projection method"
-msgstr "Método de Projeção"
-
 msgid "Projection code"
 msgstr "Código de Projeção"
 
+msgid "Projection method"
+msgstr "Método de Projeção"
+
 msgid "Display coordinates as"
 msgstr "Mostra coordenadas como"
 
@@ -12989,6 +12983,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Falha ao armazenar OAuth token de acesso no gerenciador de credenciais"
 
+msgid "Save to preferences"
+msgstr "Salvar para Preferências"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13001,9 +12998,6 @@ msgid ""
 msgstr ""
 "Você já tem um token de acesso para acessar o servidor do OSM usando OAuth."
 
-msgid "Save to preferences"
-msgstr "Salvar para Preferências"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Clique para avançar o processo de autorização OAuth"
 
@@ -14245,9 +14239,6 @@ msgstr "Faltando atributo necessário ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Valor long ilegal para o atributo ''{0}''. Recuperado ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} bytes lidos"
-
 msgid "Prepare OSM data..."
 msgstr "Preparando dados OSM..."
 
@@ -14361,6 +14352,9 @@ msgstr "Arquivos WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Versão do arquivo WMS sem suporte; encontrado {0}, esperado {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bytes lidos"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16371,6 +16365,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17513,6 +17510,9 @@ msgstr ""
 "criar, fechar, invalidar, reabrir e comentar relatórios de bugs usando este "
 "plugin."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19585,6 +19585,12 @@ msgstr "sentido horário"
 msgid "Pedestrian Crossing"
 msgstr "Faixa de pedestres"
 
+msgid "Tactile Paving"
+msgstr "Piso Tátil"
+
+msgid "incorrect"
+msgstr "incorreto"
+
 msgid "In case of traffic signals:"
 msgstr "Em caso de sinais de trânsito"
 
@@ -19775,6 +19781,9 @@ msgstr "Trincheira"
 msgid "Kerb"
 msgstr "Meio-fio"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrada (Barreira de Abertura)"
 
@@ -20590,7 +20599,7 @@ msgid "Public Transport"
 msgstr "Transporte Público"
 
 msgid "Public Transport Route (Rail)"
-msgstr ""
+msgstr "Rota de Transporte Público (Ferrovia)"
 
 msgid "Route type"
 msgstr "Tipo de rota"
@@ -20626,7 +20635,7 @@ msgid "route segment"
 msgstr "segmento de rota"
 
 msgid "Public Transport Route (Bus)"
-msgstr ""
+msgstr "Rota de Transporte Público (Ônibus)"
 
 msgid "trolleybus"
 msgstr "trólebus"
@@ -20723,10 +20732,10 @@ msgid "Reference Number"
 msgstr "Número de Referência"
 
 msgid "Public Transport (Legacy)"
-msgstr "Rota de transporte público (legado)"
+msgstr "Transporte Público (Legado)"
 
 msgid "Public transport route (Legacy)"
-msgstr "Rota de transporte público (legado)"
+msgstr "Rota de transporte público (Legado)"
 
 msgid "forward segment"
 msgstr "segmento em frente"
@@ -20764,12 +20773,6 @@ msgstr "Terminal de Ônibus"
 msgid "Bus Stop"
 msgstr "Ponto de Ônibus"
 
-msgid "Tactile Paving"
-msgstr "Piso Tátil"
-
-msgid "incorrect"
-msgstr "incorreto"
-
 msgid "Bus Platform"
 msgstr "Plataforma de Ônibus"
 
@@ -22416,7 +22419,7 @@ msgstr "torre transformadora"
 
 msgctxt "building"
 msgid "public"
-msgstr ""
+msgstr "público"
 
 msgctxt "building"
 msgid "Levels"
@@ -25660,6 +25663,9 @@ msgstr "{0} é depreciado. Use o prefixo-chave: {1} em vez disso."
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} em um nó. Deveria ser usado em uma via."
 
@@ -25725,6 +25731,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "nome da rua abreviado"
 
@@ -28072,18 +28083,18 @@ msgstr "Baixar dados do mapa continuamente quando deslocandar e ampliar."
 msgid "Toggle the continuous download on/off"
 msgstr "Alterne entre o download contínuo on/off"
 
-msgid "Download Settings"
-msgstr "Configurações de download"
-
-msgid "Settings for the continuous download."
-msgstr "Definições para a transferência contínua."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Ativar transferências contínuas na inicialização."
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Suprimir o monitor de progresso modal padrão quando está baixando."
 
+msgid "Download Settings"
+msgstr "Configurações de download"
+
+msgid "Settings for the continuous download."
+msgstr "Definições para a transferência contínua."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29848,6 +29859,9 @@ msgstr "Usar formuto de 24 horas"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Move para a localização de fotos com os botões próximo/anterior"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Modo de download"
 
@@ -32501,6 +32515,15 @@ msgstr "Abrir janela to-fix"
 msgid "Tool:To-fix"
 msgstr "Ferramenta:To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr "Pular"
 
@@ -32516,12 +32539,27 @@ msgstr "Erro Corrigido"
 msgid "Not an error"
 msgstr "Não é um erro"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Definir área download (m²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "tofix:Pular este"
 
@@ -32531,6 +32569,9 @@ msgstr "tofix:Item corrigido"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Não é um item de Erro"
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr "Servidor de manutenção"
 
@@ -32544,6 +32585,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Algo deu errado, tente novamente"
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Não é possível colocar um nó fora do mundo."
 
diff --git a/i18n/po/rm.po b/i18n/po/rm.po
index c0269e0..c0ae53b 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:58+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:58+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ro.po b/i18n/po/ro.po
index e51bf9e..9450710 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:58+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:59+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "X-Poedit-Country: ROMANIA\n"
 "Language: ro\n"
 "X-Poedit-Language: Romanian\n"
@@ -3578,9 +3578,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5086,9 +5083,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "stratul nu este în listă."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5803,15 +5797,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6111,15 +6105,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6209,6 +6194,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6927,13 +6921,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8931,6 +8925,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8948,12 +8948,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9697,10 +9691,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9709,6 +9700,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "punct gps"
 
@@ -9849,13 +9843,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11423,6 +11417,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11431,11 +11430,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11520,6 +11514,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11534,9 +11531,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11650,12 +11644,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Metodă de proiecţie"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Metodă de proiecţie"
+
 msgid "Display coordinates as"
 msgstr ""
 
@@ -11880,6 +11874,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11889,9 +11886,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13012,9 +13006,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13125,6 +13116,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14864,6 +14858,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15939,6 +15936,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17924,6 +17924,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18112,6 +18118,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19095,12 +19104,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23950,6 +23953,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24015,6 +24021,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26127,16 +26138,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27801,6 +27812,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30306,6 +30320,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30321,12 +30344,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30336,6 +30374,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30347,6 +30388,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ru.po b/i18n/po/ru.po
index 0713b64..17c81a0 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-28 05:48+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-29 21:14+0000\n"
 "Last-Translator: Aleksey Kabanov <Unknown>\n"
 "Language-Team: Koptev Oleg <koptev.oleg at gmail.com>\n"
 "MIME-Version: 1.0\n"
@@ -16,8 +16,8 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2016-05-04 04:59+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:59+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ru_RU\n"
 
 msgid "Use OAuth"
@@ -835,7 +835,7 @@ msgid "Download Rectified Images From Various Services"
 msgstr "Скачать выпрямленные изображения с различных служб"
 
 msgid "Imagery: {0}"
-msgstr "Подложка: {0}"
+msgstr "Слой: {0}"
 
 msgid "Custom WMS Link"
 msgstr "Пользовательская ссылка WMS"
@@ -3912,9 +3912,6 @@ msgstr "Ожидался элемент ''{0}'', а получен ''{1}''"
 msgid "value expected"
 msgstr "ожидалось значение"
 
-msgid " (at line {0}, column {1})"
-msgstr " (в строке {0}, столбец {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Проекции UTM (''+proj=utm'') требуется параметр ''+zone=...''."
 
@@ -5080,7 +5077,7 @@ msgstr "Смещение снимка"
 
 msgctxt "menu"
 msgid "Imagery"
-msgstr "Подложка"
+msgstr "Слои"
 
 msgctxt "layer"
 msgid "Offset"
@@ -5509,9 +5506,6 @@ msgstr "Система измерений изменена на {0}"
 msgid "Layer not in list."
 msgstr "слоя нет в списке."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Слой ''{0}'' должен быть в списке слоёв"
-
 msgid "Default (open, closed, new)"
 msgstr "По умолчанию (открытые, закрытые, новые)"
 
@@ -6320,16 +6314,16 @@ msgstr "Исх. линия"
 msgid "Decision"
 msgstr "Решение"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Пожалуйста, выберите, какие значения сохранить для новых тегов.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Показать только теги с конфликтами"
 
 msgid "Show tags with multiple values only"
 msgstr "Показать только теги с несколькими значениями"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Пожалуйста, выберите, какие значения сохранить для новых тегов.</html>"
+
 msgid "Apply?"
 msgstr "Применить?"
 
@@ -6647,15 +6641,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Закройте диалог фильтра, если хотите увидеть все объекты.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Подробная информация"
-
-msgid "map style"
-msgstr "стиль карты"
-
-msgid "edit counts"
-msgstr "число правок"
-
 msgid "not in data set"
 msgstr "отсутствует в наборе данных"
 
@@ -6746,6 +6731,15 @@ msgstr "Входит в: "
 msgid "In conflict with: "
 msgstr "Конфликтует с: "
 
+msgid "Advanced object info"
+msgstr "Подробная информация"
+
+msgid "map style"
+msgstr "стиль карты"
+
+msgid "edit counts"
+msgstr "число правок"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Кэш стилей для \"{0}\":"
 
@@ -7522,15 +7516,15 @@ msgstr "Запросить только закрытые пакеты право
 msgid "Query both open and closed changesets"
 msgstr "Запросить открытые и закрытые пакеты правок"
 
+msgid "Only changesets owned by myself"
+msgstr "Только мои пакеты правок"
+
 msgid "User ID:"
 msgstr "ID пользователя:"
 
 msgid "User name:"
 msgstr "Имя пользователя:"
 
-msgid "Only changesets owned by myself"
-msgstr "Только мои пакеты правок"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Только пакеты правок пользователя с идентификатором"
 
@@ -9849,6 +9843,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Непредвиденное значение для ключа ''{0}'' в настройках, получено ''{1}''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Заполнить один пакет правок и вернуться к Диалогу передачи на сервер"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Открыть и использовать столько пакетов правок, сколько необходимо"
+
 msgid "Please select the upload strategy:"
 msgstr "Пожалуйста, выберите стратегию передачи на сервер:"
 
@@ -9868,12 +9868,6 @@ msgstr ""
 "<html>Потребуется <strong>несколько пакетов правок</strong>, чтобы передать "
 "{0} объектов. Какую стратегию вы хотите применить?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Заполнить один пакет правок и вернуться к Диалогу передачи на сервер"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Открыть и использовать столько пакетов правок, сколько необходимо"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Передача на сервер за один запрос невозможна (слишком много объектов)"
@@ -10099,7 +10093,7 @@ msgid "Save GPX file"
 msgstr "Сохранить файл GPX"
 
 msgid "Imagery fade"
-msgstr "Подложка: угасание к"
+msgstr ""
 
 msgid "Unsupported imagery type: {0}"
 msgstr "Неподдерживаемый тип подложки: {0}"
@@ -10680,11 +10674,8 @@ msgstr "Здесь нет слоёв снимков."
 msgid "No imagery layers"
 msgstr "Нет слоёв снимков"
 
-msgid "Velocity, km/h"
-msgstr "Скорость, км/ч"
-
-msgid "HDOP, m"
-msgstr "HDOP, м"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Время"
@@ -10692,6 +10683,9 @@ msgstr "Время"
 msgid "Direction"
 msgstr "Направление"
 
+msgid "Velocity, {0}"
+msgstr "Скорость, {0}"
+
 msgid "gps point"
 msgstr "точка GPS"
 
@@ -10863,15 +10857,15 @@ msgstr "Не удалось выполнить разбор стилей Mappain
 msgid "Failed to locate image ''{0}''"
 msgstr "Не удалось найти изображение «{0}»"
 
+msgid "Save Access Token in preferences"
+msgstr "Сохранить маркер доступа в настройках"
+
 msgid "Access Token Key:"
 msgstr "Ключ маркера доступа:"
 
 msgid "Access Token Secret:"
 msgstr "Крипто-ключ маркера доступа:"
 
-msgid "Save Access Token in preferences"
-msgstr "Сохранить маркер доступа в настройках"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12311,7 +12305,7 @@ msgid "Tiles zoom offset:"
 msgstr "Смещение масштаба квадратов:"
 
 msgid "Imagery Preferences"
-msgstr "Установки Снимка"
+msgstr "Настройки слоёв"
 
 msgid "Modify list of imagery layers displayed in the Imagery menu"
 msgstr "Настроить список слоёв, отображаемых в меню «Слои»"
@@ -12335,7 +12329,7 @@ msgid "Cache contents"
 msgstr "Содержимое кэша"
 
 msgid "Imagery Background: Default"
-msgstr "Подложка: по умолчанию"
+msgstr "Слой: по умолчанию"
 
 msgid "Available default entries:"
 msgstr "Доступные по умолчанию:"
@@ -12623,6 +12617,12 @@ msgstr "Встроенная заготовка"
 msgid "The default preset for JOSM"
 msgstr "Заготовка по умолчанию для JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Модуль  {0} используется этим модулем:"
+msgstr[1] "Модуль  {0} используется этими {1}-мя модулями:"
+msgstr[2] "Модуль  {0} используется этими {1}-ю модулями:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Модуль из поставки JOSM"
 
@@ -12633,12 +12633,6 @@ msgstr ""
 "Нажмите на кнопку <strong>Скачать список</strong>, чтобы скачать и "
 "посмотреть список доступных модулей."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Модуль  {0} используется этим модулем:"
-msgstr[1] "Модуль  {0} используется этими {1}-мя модулями:"
-msgstr[2] "Модуль  {0} используется этими {1}-ю модулями:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Версия {1} (установлена: {2})"
 
@@ -12733,6 +12727,9 @@ msgstr "Редактировать ссылку на описание модул
 msgid "JOSM Plugin description URL"
 msgstr "Ссылка на описание модуля JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Интервал обновления (в днях):"
+
 msgid "Ask before updating"
 msgstr "Спрашивать перед обновлением"
 
@@ -12749,9 +12746,6 @@ msgstr ""
 "Пожалуйста, решите, нужно ли автоматически обновлять установленные модули, "
 "после загрузки новой версии JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Интервал обновления (в днях):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12867,12 +12861,12 @@ msgstr "Rijksdriehoekscoördinaten (Нидерланды)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Швеция)"
 
-msgid "Projection method"
-msgstr "Тип проекции"
-
 msgid "Projection code"
 msgstr "Код проекции"
 
+msgid "Projection method"
+msgstr "Тип проекции"
+
 msgid "Display coordinates as"
 msgstr "Отображать координаты как"
 
@@ -13115,6 +13109,9 @@ msgstr "Не удалось получить токен доступа OAuth и
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "Не удалось сохранить токен доступа OAuth в менеджере учётных данных"
 
+msgid "Save to preferences"
+msgstr "Сохранить в настройках"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13127,9 +13124,6 @@ msgid ""
 msgstr ""
 "У Вас уже есть маркер доступа для доступа к серверу OSM с помощью OAuth."
 
-msgid "Save to preferences"
-msgstr "Сохранить в настройках"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Нажмите, чтобы пройти пошаговый процесс авторизации OAuth"
 
@@ -14374,9 +14368,6 @@ msgstr "Отсутствует нужный атрибут ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Неверная длина значения атрибута ''{0}''. Получено ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} байт прочитано"
-
 msgid "Prepare OSM data..."
 msgstr "Подготовка данных..."
 
@@ -14495,6 +14486,9 @@ msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 "Неподдерживаемый формат версии WMS файла; обнаружено {0}, ожидалось {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} байт прочитано"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16538,6 +16532,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Бордо - 2012"
 
@@ -17682,6 +17679,11 @@ 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 "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19750,6 +19752,12 @@ msgstr "по часовой стрелке"
 msgid "Pedestrian Crossing"
 msgstr "Пешеходный переход"
 
+msgid "Tactile Paving"
+msgstr "Тактильное мощение"
+
+msgid "incorrect"
+msgstr "неправильное"
+
 msgid "In case of traffic signals:"
 msgstr "При наличии светофора:"
 
@@ -19940,6 +19948,9 @@ msgstr "Канава"
 msgid "Kerb"
 msgstr "Бордюр"
 
+msgid "Tactile paving"
+msgstr "Тактильное мощение"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Проход или проезд (проём в преграде)"
 
@@ -20930,12 +20941,6 @@ msgstr "Автобусная станция"
 msgid "Bus Stop"
 msgstr "Автобусная остановка"
 
-msgid "Tactile Paving"
-msgstr "Тактильное мощение"
-
-msgid "incorrect"
-msgstr "неправильное"
-
 msgid "Bus Platform"
 msgstr "Автобусная платформа"
 
@@ -24778,7 +24783,7 @@ msgid ""
 msgstr "Невозделываемая земля, заросшая кустарником. Деревьев нет или мало."
 
 msgid "Heath"
-msgstr "Пустырь"
+msgstr "Вереск"
 
 msgid ""
 "Bare lower lying uncultivated land with a shrubland habitat found mainly on "
@@ -25826,6 +25831,9 @@ msgstr "{0} применять не рекомендуется. Использу
 msgid "questionable key (ending with a number): {0}"
 msgstr "вызывающий сомнения ключ (заканчивается числом): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Ключ {0} имеет необычное значение."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} на точке. Должен использоваться на линии."
 
@@ -25893,6 +25901,13 @@ msgstr ""
 "Точка соединяет линию электропередачи или кабель с объектом, не относящимся "
 "к энергетической инфраструктуре."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Водный путь заканчивается без соединения с другим водным путём или у него "
+"неправильное направление."
+
 msgid "abbreviated street name"
 msgstr "сокращённое обозначение улицы"
 
@@ -28234,12 +28249,6 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr "Включить/отключить непрерывное скачивание"
 
-msgid "Download Settings"
-msgstr "Параметры загрузки"
-
-msgid "Settings for the continuous download."
-msgstr "Настройки постоянного скачивания."
-
 msgid "Activate continuous downloads at startup."
 msgstr "Активировать постоянное скачивание при запуске."
 
@@ -28247,6 +28256,12 @@ msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 "Не показывать стандартный модальный индикатор прогресса при скачивании."
 
+msgid "Download Settings"
+msgstr "Параметры загрузки"
+
+msgid "Settings for the continuous download."
+msgstr "Настройки постоянного скачивания."
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -30014,6 +30029,9 @@ msgstr ""
 "Перемещаться к местоположению снимка по кнопкам ''Предыдущий/Следующий "
 "снимок''"
 
+msgid "Preview images when hovering its icon"
+msgstr "Предпросмотр изображения при наведении на его значок"
+
 msgid "Download mode"
 msgstr "Режим скачивания"
 
@@ -32652,6 +32670,15 @@ msgstr "Открыть окно to-fix."
 msgid "Tool:To-fix"
 msgstr "Инструмент:To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr "Включить модуль Tofix"
+
+msgid "Auto delete layer"
+msgstr "Автоматическое удаление слоя"
+
+msgid "Select the checkbox to:"
+msgstr "Отметьте необходимые опции:"
+
 msgid "Skip"
 msgstr "Пропустить"
 
@@ -32667,12 +32694,27 @@ msgstr "Ошибка исправлена"
 msgid "Not an error"
 msgstr "Не ошибка"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr "<html><a href=\"\">Список заданий</a></html>"
+
+msgid "Select a task ..."
+msgstr "Выберите задание..."
+
 msgid "Set download area (m²)"
 msgstr "Задайте область скачивания (м²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr "Задания"
+
+msgid "Config"
+msgstr "Настройка"
+
+msgid "Activation"
+msgstr "Активация"
+
 msgid "tofix:Skip item"
 msgstr "tofix:Пропустить элемент"
 
@@ -32682,6 +32724,9 @@ msgstr "tofix:Исправленный элемент"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Не ошибочный элемент"
 
+msgid "Activate to-fix plugin."
+msgstr "Включить модуль to-fix"
+
 msgid "Maintenance server"
 msgstr "Сервер на обслуживании"
 
@@ -32695,6 +32740,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Что-то пошло не так, попробуйте ещё раз"
 
+msgid "No change to upload!"
+msgstr "Нет изменений для передачи на сервер!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Не удается поместить точку за пределами мира"
 
@@ -34505,8 +34553,9 @@ msgstr "Добавить Викиданные для языка ''{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] "Перезаписать тег ''{0}''  {1} из {2} новым значением ''{3}''?"
+msgstr[1] "Перезаписать теги ''{0}''  {1} из {2} новым значением ''{3}''?"
+msgstr[2] "Перезаписать теги ''{0}''  {1} из {2} новым значением ''{3}''?"
 
 msgid "Add names from Wikipedia"
 msgstr "Добавить названия из Википедии"
diff --git a/i18n/po/sk.po b/i18n/po/sk.po
index cb05549..7162b1c 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-29 23:14+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-19 19:43+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-05-04 05:01+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:01+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: sk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3879,9 +3879,6 @@ msgstr "Očakával sa prvok \"{0}\", ale našiel sa \"{1}\""
 msgid "value expected"
 msgstr "očakávala sa hodnota"
 
-msgid " (at line {0}, column {1})"
-msgstr " (na riadku {0}, stĺpec {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Projekcia UTM (\"+proj=utm\") vyžaduje parameter \"+zone=...\"."
 
@@ -5461,9 +5458,6 @@ msgstr "Systém merania sa zmenil na {0}"
 msgid "Layer not in list."
 msgstr "Vrstva nie je v zozname."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Vrstva ''{0}'' musí byť v zozname vrstiev"
-
 msgid "Default (open, closed, new)"
 msgstr "Predvolené (otvorené, uzavreté, nové)"
 
@@ -6266,17 +6260,17 @@ msgstr "Orig. cesta"
 msgid "Decision"
 msgstr "Rozhodnutie"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Prosím, vyberte ktoré hodnoty ponechať pre nasledujúce značky "
-"(tagy).</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Zobraziť iba značky (tagy) s konfliktmi"
 
 msgid "Show tags with multiple values only"
 msgstr "Zobraziť iba značky s rôznymi hodnotami"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Prosím, vyberte ktoré hodnoty ponechať pre nasledujúce značky "
+"(tagy).</html>"
+
 msgid "Apply?"
 msgstr "Použiť?"
 
@@ -6598,15 +6592,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</p><p>Zatvorte dialóg filtra, aby sa zobrazili všetky objekty.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Rozšírené info objektov"
-
-msgid "map style"
-msgstr "štýl mapy"
-
-msgid "edit counts"
-msgstr "počet zmien"
-
 msgid "not in data set"
 msgstr "nie je v súbore dát"
 
@@ -6697,6 +6682,15 @@ msgstr "Časť z: "
 msgid "In conflict with: "
 msgstr "V rozpore s: "
 
+msgid "Advanced object info"
+msgstr "Rozšírené info objektov"
+
+msgid "map style"
+msgstr "štýl mapy"
+
+msgid "edit counts"
+msgstr "počet zmien"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Štýly Ukladania pre \"{0}\":"
 
@@ -7476,15 +7470,15 @@ msgstr "Vyžiadať iba zatvorené zmenové súbory"
 msgid "Query both open and closed changesets"
 msgstr "Vyžiadať otvorené aj zatvorené zmenové súbory"
 
+msgid "Only changesets owned by myself"
+msgstr "Iba moje zmenové súbory"
+
 msgid "User ID:"
 msgstr "ID používateľa:"
 
 msgid "User name:"
 msgstr "Používateľské meno:"
 
-msgid "Only changesets owned by myself"
-msgstr "Iba moje zmenové súbory"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Iba zmenové súbory vyhotovené používateľom s nasledujúcim ID používateľa"
@@ -9759,6 +9753,12 @@ msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 "Neočakávaná hodnota pre kľúč \"{0}\" v nastavení, obdržaná hodnota je \"{1}\""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Naplniť jeden zmenový súbor a vrátiť sa do dialógu nahrávania"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Použiť toľko nových zmenových súborov, koľko je potrebné"
+
 msgid "Please select the upload strategy:"
 msgstr "Prosím vyberte stratégiu nahrávania:"
 
@@ -9778,12 +9778,6 @@ msgstr ""
 "<html>Je potrebné použiť <strong>viaceré zmenové súbory</strong> pre "
 "nahratie {0} objektov. Ktorú stratégiu chcete použiť?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Naplniť jeden zmenový súbor a vrátiť sa do dialógu nahrávania"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Použiť toľko nových zmenových súborov, koľko je potrebné"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 "Nedá sa nahrať v jednej požiadavke (príliš veľa objektov na nahratie)"
@@ -10589,11 +10583,8 @@ msgstr "Nie sú žiadne vrstvy s mapovými podkladmi."
 msgid "No imagery layers"
 msgstr "Žiadne vrstvy s mapovými podkladmi"
 
-msgid "Velocity, km/h"
-msgstr "Rýchlosť, km/h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Čas"
@@ -10601,6 +10592,9 @@ msgstr "Čas"
 msgid "Direction"
 msgstr "Smer"
 
+msgid "Velocity, {0}"
+msgstr "Rýchlosť, {0}"
+
 msgid "gps point"
 msgstr "gps poloha bodu"
 
@@ -10772,15 +10766,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr "Zlyhala lokalizácia obrázku ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Uložiť autorizačný prístup v nastaveniach"
+
 msgid "Access Token Key:"
 msgstr "Kľúč autorizačného prístupu:"
 
 msgid "Access Token Secret:"
 msgstr "Heslo autorizačného prístupu:"
 
-msgid "Save Access Token in preferences"
-msgstr "Uložiť autorizačný prístup v nastaveniach"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12527,6 +12521,12 @@ msgstr "Základné interné predvoľby"
 msgid "The default preset for JOSM"
 msgstr "Východiskové nastavenie pre JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Plugin {0} je stále používaný týmito {1} pluginmi:"
+msgstr[1] "Plugin {0} je stále používaný týmto {1} pluginom:"
+msgstr[2] "Plugin {0} je stále používaný týmito {1} pluginmi:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plugin je zahrnutý v JOSM"
 
@@ -12537,12 +12537,6 @@ msgstr ""
 "Prosím kliknite na <strong>Stiahnuť zoznam</strong> pre stiahnutie a "
 "zobrazenie zoznamu dostupných pluginov."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Plugin {0} je stále používaný týmito {1} pluginmi:"
-msgstr[1] "Plugin {0} je stále používaný týmto {1} pluginom:"
-msgstr[2] "Plugin {0} je stále používaný týmito {1} pluginmi:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Verzia {1} (súčasná: {2})"
 
@@ -12635,6 +12629,9 @@ msgstr "Upraviť URL s popismi pre JOSM pluginy."
 msgid "JOSM Plugin description URL"
 msgstr "URL s popismi pre JOSM pluginy"
 
+msgid "Update interval (in days):"
+msgstr "Aktualizovať v intervale (v dňoch):"
+
 msgid "Ask before updating"
 msgstr "Spýtať sa pred aktualizáciou"
 
@@ -12651,9 +12648,6 @@ msgstr ""
 "Prosím rozhodnite, či JOSM má automaticky aktualizovať aktívne pluginy pri "
 "štarte, po aktualizácii programu JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Aktualizovať v intervale (v dňoch):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12769,12 +12763,12 @@ msgstr "Rijksdriehoekscoördinaten (Holandsko)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Švédsko)"
 
-msgid "Projection method"
-msgstr "Metóda projekcie"
-
 msgid "Projection code"
 msgstr "Kód projekcie"
 
+msgid "Projection method"
+msgstr "Metóda projekcie"
+
 msgid "Display coordinates as"
 msgstr "Zobrazovať súradnice ako"
 
@@ -13032,6 +13026,9 @@ msgstr ""
 "Nepodarilo sa uložiť OAuth autorizačný prístup do správcu prihlasovacích "
 "údajov"
 
+msgid "Save to preferences"
+msgstr "Uložiť do nastavení"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13043,9 +13040,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "Už máte autorizačný prístup pre prístup k OSM serveru pomocou OAuth."
 
-msgid "Save to preferences"
-msgstr "Uložiť do nastavení"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Kliknite pre krokovanie celým procesom schvaľovania OAuth"
 
@@ -14302,9 +14296,6 @@ msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 "Neplatná dlhá hodnota pre vlastnosť \"{0}\". Obdržaná hodnota je \"{1}\""
 
-msgid "{0} bytes have been read"
-msgstr "{0} bajtov prečítaných"
-
 msgid "Prepare OSM data..."
 msgstr "Pripravujem OSM údaje..."
 
@@ -14422,6 +14413,9 @@ msgstr "WMS Súbory (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nepodporovaná verzia WMS súboru; nájdené {0}, očakávané {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} bajtov prečítaných"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16463,6 +16457,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17596,6 +17593,9 @@ msgstr ""
 "Plugin MapDust zobrazuje na mape hlásenia o chybách z MapDust. Môžete "
 "vytvoriť, uzavrieť, zamietnuť, znovu otvoriť a komentovať chybové hlásenia."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19662,6 +19662,12 @@ msgstr "v smere hodinových ručičiek (pravotočivý)"
 msgid "Pedestrian Crossing"
 msgstr "Priechod pre chodcov"
 
+msgid "Tactile Paving"
+msgstr "Dlažba pre nevidiacich"
+
+msgid "incorrect"
+msgstr "nesprávne"
+
 msgid "In case of traffic signals:"
 msgstr "Ak ide o semafory:"
 
@@ -19854,6 +19860,9 @@ msgstr "Priekopa (ditch)"
 msgid "Kerb"
 msgstr "Obrubník"
 
+msgid "Tactile paving"
+msgstr "Dlažba pre nevidiacich"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Vstup (otvor v prekážke)"
 
@@ -20840,12 +20849,6 @@ msgstr "Autobusová stanica"
 msgid "Bus Stop"
 msgstr "Autobusová zastávka"
 
-msgid "Tactile Paving"
-msgstr "Dlažba pre nevidiacich"
-
-msgid "incorrect"
-msgstr "nesprávne"
-
 msgid "Bus Platform"
 msgstr "Autobusové nástupište"
 
@@ -24821,7 +24824,7 @@ msgid "Vineyard"
 msgstr "Vinica"
 
 msgid "Greenhouse Horticulture"
-msgstr "Skleník Záhradníctvo"
+msgstr "Skleníková zóna"
 
 msgid "Plant Nursery"
 msgstr "Škôlka pre rastliny"
@@ -25728,6 +25731,9 @@ msgstr "{0} je zastaralé. Použite namiesto toho predponu kľúča {1}: ."
 msgid "questionable key (ending with a number): {0}"
 msgstr "podozrivý kľúč (končí na číslo): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Kľúč {0} má nezvyčajnú hodnotu."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} na bode. Malo by byť použité na ceste."
 
@@ -25794,6 +25800,12 @@ msgid ""
 msgstr ""
 "Bod spája elektrické vedenie s objektom, ktorý nepatrí do elektrickej siete."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Vodný tok bez pripojenia na iný vodný tok alebo je nesprávny smer toku."
+
 msgid "abbreviated street name"
 msgstr "skrátený názov ulice"
 
@@ -28000,16 +28012,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29712,6 +29724,9 @@ msgstr "Použiť 24-hodinový formát"
 msgid "Move to picture''s location with next/previous buttons"
 msgstr "Tlačidlom nasledujúci/predchádzajúci sa presunúť na pozíciu obrázka"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -32248,6 +32263,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -32263,12 +32287,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -32278,6 +32317,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32289,6 +32331,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Nedá sa umiestniť bod mimo sveta."
 
diff --git a/i18n/po/sl.po b/i18n/po/sl.po
index 39531ef..8a20762 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:01+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:01+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: sl\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3542,9 +3542,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5058,9 +5055,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "Plasti ni na seznamu."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5775,15 +5769,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Uveljavim?"
 
@@ -6081,15 +6075,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6179,6 +6164,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6897,13 +6891,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8917,6 +8911,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8934,12 +8934,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9685,10 +9679,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9697,6 +9688,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "točka GPS"
 
@@ -9837,13 +9831,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11409,6 +11403,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11417,11 +11416,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11506,6 +11500,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11520,9 +11517,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11636,12 +11630,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
-msgstr "Geografska projekcija"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Geografska projekcija"
+
 msgid "Display coordinates as"
 msgstr "Oblika prikaza koordinat"
 
@@ -11866,6 +11860,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11875,9 +11872,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13003,9 +12997,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Priprava podatkov OSM..."
 
@@ -13118,6 +13109,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Nepodprta različica datoteke WMS; našel {0}, pričakoval {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14861,6 +14855,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15936,6 +15933,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17921,6 +17921,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18109,6 +18115,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19092,12 +19101,6 @@ msgstr "Avtobusna postaja"
 msgid "Bus Stop"
 msgstr "Avtobusno postajališče"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Avtobusni peron"
 
@@ -23947,6 +23950,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24012,6 +24018,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26124,16 +26135,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27800,6 +27811,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30305,6 +30319,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30320,12 +30343,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30335,6 +30373,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30346,6 +30387,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/sq.po b/i18n/po/sq.po
index 34e5bf6..e8c8248 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:31+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 04:31+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/sr.po b/i18n/po/sr.po
index df61ac1..9db7cfd 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 04:59+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:00+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: sr\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3521,9 +3521,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5029,9 +5026,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5746,15 +5740,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6052,15 +6046,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6150,6 +6135,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6868,13 +6862,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8873,6 +8867,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8890,12 +8890,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9637,10 +9631,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9649,6 +9640,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9789,13 +9783,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11359,6 +11353,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11367,11 +11366,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11456,6 +11450,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11470,9 +11467,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11586,10 +11580,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11816,6 +11810,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11825,9 +11822,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12947,9 +12941,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13060,6 +13051,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14799,6 +14793,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15874,6 +15871,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17859,6 +17859,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18047,6 +18053,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19030,12 +19039,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23885,6 +23888,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23950,6 +23956,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26062,16 +26073,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27736,6 +27747,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30241,6 +30255,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30256,12 +30279,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30271,6 +30309,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30282,6 +30323,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/sv.po b/i18n/po/sv.po
index 1958763..7c5351c 100644
--- a/i18n/po/sv.po
+++ b/i18n/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
 "PO-Revision-Date: 2016-02-08 15:05+0000\n"
 "Last-Translator: Andreas Vilén <andreas.vilen at gmail.com>\n"
 "Language-Team: Swedish <sv at li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Launchpad-Export-Date: 2016-05-04 05:02+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:03+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: sv\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3782,9 +3782,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (vid rad {0}, kolumn {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5330,9 +5327,6 @@ msgstr "Måttsystem ändrat till {0}"
 msgid "Layer not in list."
 msgstr "lagret finns inte i listan."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -6053,15 +6047,15 @@ msgstr "Urspr. sträcka"
 msgid "Decision"
 msgstr "Beslut"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr "Visa enbart taggar med konflikter"
 
 msgid "Show tags with multiple values only"
 msgstr "Visa taggar med enbart flera värden"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Tillämpa?"
 
@@ -6370,15 +6364,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr "Avancerad objektinformation"
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6468,6 +6453,15 @@ msgstr "Del av: "
 msgid "In conflict with: "
 msgstr "I konflikt med: "
 
+msgid "Advanced object info"
+msgstr "Avancerad objektinformation"
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -7193,15 +7187,15 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
+msgid "Only changesets owned by myself"
+msgstr ""
+
 msgid "User ID:"
 msgstr "Användar-id:"
 
 msgid "User name:"
 msgstr "Användarnamn:"
 
-msgid "Only changesets owned by myself"
-msgstr ""
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 
@@ -9272,6 +9266,12 @@ msgstr "Avbryt uppladdning"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Öppna och använd så många nya ändringsuppsättningar som behövs"
+
 msgid "Please select the upload strategy:"
 msgstr "Välj strategi för uppladdning:"
 
@@ -9289,12 +9289,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Öppna och använd så många nya ändringsuppsättningar som behövs"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -10056,10 +10050,7 @@ msgstr "Det finns inga bildlager."
 msgid "No imagery layers"
 msgstr "Inga bildlager"
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -10068,6 +10059,9 @@ msgstr ""
 msgid "Direction"
 msgstr "Riktning"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps-punkt"
 
@@ -10216,13 +10210,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11825,6 +11819,12 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Insticksmodulen {0} krävs fortfarande av denna insticksmodul:"
+msgstr[1] ""
+"Insticksmodulen {0} krävs fortfarande av dessa {1} insticksmoduler:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Insticksmodul som medföljer JOSM"
 
@@ -11835,12 +11835,6 @@ msgstr ""
 "Klicka på <strong>Hämta lista</strong> för hämta och visa en lista över "
 "tillgängliga insticksmoduler."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Insticksmodulen {0} krävs fortfarande av denna insticksmodul:"
-msgstr[1] ""
-"Insticksmodulen {0} krävs fortfarande av dessa {1} insticksmoduler:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11931,6 +11925,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr "Uppdateringsintervall (i dagar):"
+
 msgid "Ask before updating"
 msgstr "Fråga före uppdatering"
 
@@ -11947,9 +11944,6 @@ msgstr ""
 "Avgör huruvida JOSM ska uppdatera aktiva insticksmoduler vid uppstart efter "
 "en uppdatering av JOSM själv."
 
-msgid "Update interval (in days):"
-msgstr "Uppdateringsintervall (i dagar):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12065,12 +12059,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Sverige)"
 
-msgid "Projection method"
-msgstr "Projektionsmetod"
-
 msgid "Projection code"
 msgstr "Projektionskod"
 
+msgid "Projection method"
+msgstr "Projektionsmetod"
+
 msgid "Display coordinates as"
 msgstr "Visa koordinater som"
 
@@ -12299,6 +12293,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "Spara till inställningar"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12308,9 +12305,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr "Spara till inställningar"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13445,9 +13439,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "Förbereder OSM-data..."
 
@@ -13559,6 +13550,9 @@ msgstr "WMS-filer (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "WMS-filversion som ej stöds; funnen {0}, förväntad {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15398,6 +15392,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -16475,6 +16472,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -18482,6 +18482,12 @@ msgstr "medurs"
 msgid "Pedestrian Crossing"
 msgstr "Övergångsställe för fotgängare"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18670,6 +18676,9 @@ msgstr "Dike"
 msgid "Kerb"
 msgstr "Trottoarkant"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19653,12 +19662,6 @@ msgstr "Bussterminal"
 msgid "Bus Stop"
 msgstr "Busshållplats"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "Bussplattform"
 
@@ -24517,6 +24520,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24582,6 +24588,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "förkortat gatunamn"
 
@@ -26705,16 +26716,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -28400,6 +28411,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30918,6 +30932,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30933,12 +30956,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30948,6 +30986,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30959,6 +31000,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Kan inte placera en nod utanför världen."
 
diff --git a/i18n/po/ta.po b/i18n/po/ta.po
index fa5ce68..a431ac8 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:03+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:03+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "X-Poedit-Country: INDIA\n"
 "Language: ta\n"
 "X-Poedit-Language: Tamil\n"
@@ -3556,9 +3556,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5064,9 +5061,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5781,15 +5775,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6087,15 +6081,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6185,6 +6170,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6903,13 +6897,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8908,6 +8902,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8925,12 +8925,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9674,10 +9668,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9686,6 +9677,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9826,13 +9820,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11396,6 +11390,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11404,11 +11403,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11493,6 +11487,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11507,9 +11504,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11623,10 +11617,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11853,6 +11847,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11862,9 +11859,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12984,9 +12978,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13097,6 +13088,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14836,6 +14830,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15911,6 +15908,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17896,6 +17896,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18084,6 +18090,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19067,12 +19076,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23922,6 +23925,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23987,6 +23993,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26099,16 +26110,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27773,6 +27784,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30284,6 +30298,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30299,12 +30322,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30314,6 +30352,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30325,6 +30366,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/te.po b/i18n/po/te.po
index 6a64544..7d0b3dd 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:03+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:04+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: te\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/th.po b/i18n/po/th.po
index 0ac3bf6..d8415e4 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:04+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:04+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: th\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/tr.po b/i18n/po/tr.po
index c1f1ab6..eb3992e 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:04+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:05+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3574,9 +3574,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5094,9 +5091,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "tabaka listede yok."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5809,15 +5803,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr "Uygula?"
 
@@ -6115,15 +6109,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6213,6 +6198,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6931,13 +6925,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8937,6 +8931,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8954,12 +8954,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9712,10 +9706,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9724,6 +9715,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps noktası"
 
@@ -9867,13 +9861,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11448,6 +11442,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "Eklenti JOSM ile beraber geliyor."
 
@@ -11456,11 +11455,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11545,6 +11539,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11559,9 +11556,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11675,12 +11669,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (İsveç)"
 
-msgid "Projection method"
-msgstr "Projeksiyon türü"
-
 msgid "Projection code"
 msgstr ""
 
+msgid "Projection method"
+msgstr "Projeksiyon türü"
+
 msgid "Display coordinates as"
 msgstr "koordinatları şu şekilde göster"
 
@@ -11905,6 +11899,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11914,9 +11911,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -13041,9 +13035,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13156,6 +13147,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Desteklenmeyen WMS versiyonu; bulunan {0}, istenen {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14902,6 +14896,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15977,6 +15974,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17962,6 +17962,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18150,6 +18156,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19133,12 +19142,6 @@ msgstr "otogar"
 msgid "Bus Stop"
 msgstr "otobüs durağı"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "otobüs platformu"
 
@@ -23988,6 +23991,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24053,6 +24059,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26165,16 +26176,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27851,6 +27862,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30358,6 +30372,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30373,12 +30396,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30388,6 +30426,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30399,6 +30440,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/ug.po b/i18n/po/ug.po
index dd1ef26..444ca5e 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:05+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:05+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: \n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/uk.po b/i18n/po/uk.po
index 869febb..6e6e362 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-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-05-03 07:57+0000\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-23 19:37+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-05-04 05:05+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:06+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: uk\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3908,9 +3908,6 @@ msgstr "Очікувався елемент ''{0}'', але отриманий '
 msgid "value expected"
 msgstr "очікувалось значення"
 
-msgid " (at line {0}, column {1})"
-msgstr " (рядок {0}, ствопчик {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "Проекції UTM (''+proj=utm'') потрібен параметр ''+zone=…''."
 
@@ -5507,9 +5504,6 @@ msgstr "Систему вимірювання змінено на {0}"
 msgid "Layer not in list."
 msgstr "Шару немає в списку."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Шар ''{0}'' повинен бути в списку шарів"
-
 msgid "Default (open, closed, new)"
 msgstr "Типово (відкриті, закриті, нові)"
 
@@ -6315,16 +6309,16 @@ msgstr "Ориг. лінія"
 msgid "Decision"
 msgstr "Рішення"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-"<html>Будь ласка, виберіть, які значення зберегти для нових теґів.</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Показати тільки теґи з конфліктами"
 
 msgid "Show tags with multiple values only"
 msgstr "Показати тільки теґи з кількома значеннями"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+"<html>Будь ласка, виберіть, які значення зберегти для нових теґів.</html>"
+
 msgid "Apply?"
 msgstr "Застосувати?"
 
@@ -6642,15 +6636,6 @@ msgstr[2] "<p><b>{0}</b> об’єкти виключено"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>Закрийте діалог фільтра, щоб побачити всі об’єкти.<p></html>"
 
-msgid "Advanced object info"
-msgstr "Розширена інформація про об’єкт"
-
-msgid "map style"
-msgstr "стиль мапи"
-
-msgid "edit counts"
-msgstr "кількість правок"
-
 msgid "not in data set"
 msgstr "не в наборі даних"
 
@@ -6741,6 +6726,15 @@ msgstr "Частина: "
 msgid "In conflict with: "
 msgstr "Конфліктує з: "
 
+msgid "Advanced object info"
+msgstr "Розширена інформація про об’єкт"
+
+msgid "map style"
+msgstr "стиль мапи"
+
+msgid "edit counts"
+msgstr "кількість правок"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Кеш стилів для \"{0}\":"
 
@@ -7518,15 +7512,15 @@ msgstr "Отримати тільки закриті набори змін"
 msgid "Query both open and closed changesets"
 msgstr "Отримати відкриті та закриті набори змін"
 
+msgid "Only changesets owned by myself"
+msgstr "Тільки мої набори змін"
+
 msgid "User ID:"
 msgstr "Ід. учасника:"
 
 msgid "User name:"
 msgstr "Ім’я користувача:"
 
-msgid "Only changesets owned by myself"
-msgstr "Тільки мої набори змін"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "Тільки набори змін учасника з ідентифікатором"
 
@@ -7800,10 +7794,10 @@ msgid "Sharpness"
 msgstr "Різкість"
 
 msgid "Adjust colorfulness of the layer."
-msgstr "Регулювання барвистосі шару"
+msgstr "Регулювання барвистості шару"
 
 msgid "Colorfulness"
-msgstr "Барвистисть"
+msgstr "Барвистість"
 
 msgid "Merge this layer into another layer"
 msgstr "Об’єднати цей шар з іншим шаром"
@@ -9815,6 +9809,13 @@ msgstr "Скасувати надсилання"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "Неочікуване значення ''{1}'' для ключа ''{0}'' у налаштуваннях"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+"Заповнити один набір змін і повернутися до діалогу надсилання даних на сервер"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Відкрити і використовувати стільки наборів змін, скільки треба"
+
 msgid "Please select the upload strategy:"
 msgstr "Будь ласка, виберіть стратегію надсилання:"
 
@@ -9834,13 +9835,6 @@ msgstr ""
 "<html>Потрібно використати<strong>кілька наборів змін</strong>, щоб "
 "надіслати {0} об’єктів. Яку стратегію ви бажаєте застосувати?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-"Заповнити один набір змін і повернутися до діалогу надсилання даних на сервер"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Відкрити і використовувати стільки наборів змін, скільки треба"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Надсилання одним запитом не можливе (занадто багато об’єктів)"
 
@@ -10644,11 +10638,8 @@ msgstr "Шари з фоновим зображенням відсутні."
 msgid "No imagery layers"
 msgstr "Немає шарів з фоновим зображенням"
 
-msgid "Velocity, km/h"
-msgstr "Швидкість, км/год"
-
-msgid "HDOP, m"
-msgstr "HDOP, м"
+msgid "HDOP"
+msgstr "HDOP"
 
 msgid "Time"
 msgstr "Час"
@@ -10656,6 +10647,9 @@ msgstr "Час"
 msgid "Direction"
 msgstr "Напрямок"
 
+msgid "Velocity, {0}"
+msgstr "Швидкість, {0}"
+
 msgid "gps point"
 msgstr "точка GPS"
 
@@ -10826,15 +10820,15 @@ msgstr "Не вдалось розібрати стилі кольорів ма
 msgid "Failed to locate image ''{0}''"
 msgstr "Збій пошуку зображення ''{0}''"
 
+msgid "Save Access Token in preferences"
+msgstr "Зберегти мітку доступу у налаштуваннях"
+
 msgid "Access Token Key:"
 msgstr "Ключ мітки доступу:"
 
 msgid "Access Token Secret:"
 msgstr "Таємний ключ мітки доступу:"
 
-msgid "Save Access Token in preferences"
-msgstr "Зберегти мітку доступу у налаштуваннях"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12582,6 +12576,12 @@ msgstr "Внутрішній шаблон"
 msgid "The default preset for JOSM"
 msgstr "Типові шаблони JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Втулок {0} все ще використовується втулком:"
+msgstr[1] "Втулок {0} все ще використовується {1} втулками:"
+msgstr[2] "Втулок {0} все ще використовується {1} втулками:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Втулок, що постачається з JOSM"
 
@@ -12592,12 +12592,6 @@ msgstr ""
 "Натисніть на кнопку <strong>Завантажити список</strong>, щоб отримати список "
 "доступних втулків."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Втулок {0} все ще використовується втулком:"
-msgstr[1] "Втулок {0} все ще використовується {1} втулками:"
-msgstr[2] "Втулок {0} все ще використовується {1} втулками:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Версія {1} (встановлено: {2})"
 
@@ -12688,6 +12682,9 @@ msgstr "Редагувати посилання на опис втулка JOSM.
 msgid "JOSM Plugin description URL"
 msgstr "Посилання на опис втулка JOSM"
 
+msgid "Update interval (in days):"
+msgstr "Інтервал оновлення (у днях):"
+
 msgid "Ask before updating"
 msgstr "Питати перед оновленням"
 
@@ -12704,9 +12701,6 @@ msgstr ""
 "Будь ласка, вирішіть, чи потрібно автоматично оновлювати встановлені втулки "
 "після завантаження нової версії JOSM."
 
-msgid "Update interval (in days):"
-msgstr "Інтервал оновлення (у днях):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12822,12 +12816,12 @@ msgstr "Rijksdriehoekscoördinaten (Нідерланди)"
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (Швеція)"
 
-msgid "Projection method"
-msgstr "Тип проекції"
-
 msgid "Projection code"
 msgstr "Код проекції"
 
+msgid "Projection method"
+msgstr "Тип проекції"
+
 msgid "Display coordinates as"
 msgstr "Показувати координати як"
 
@@ -13075,6 +13069,9 @@ msgstr "Не вдалось отримати Мітку доступу OAuth з
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "Не вдалось зберегти Мітку доступу OAuth в менеджері облікових даних"
 
+msgid "Save to preferences"
+msgstr "Зберегти в налаштуваннях"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -13087,9 +13084,6 @@ msgid ""
 msgstr ""
 "Ви вже маєте Мітку доступу для доступу до сервера OSM за допомогою OAuth."
 
-msgid "Save to preferences"
-msgstr "Зберегти в налаштуваннях"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Натисніть, щоб крок за кроком пройти процес авторизації OAuth"
 
@@ -14335,9 +14329,6 @@ msgstr "Відсутній обов’язковий атрибут ''{0}''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "Неприпустима довжина значення атрибуту ''{0}''. Отримано ''{1}''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} байт було прочитано"
-
 msgid "Prepare OSM data..."
 msgstr "Підготовка OSM-даних…"
 
@@ -14454,6 +14445,9 @@ msgstr "Файли WMS (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "Непідтримувана версія файлу WMS; знайдено {0}, очікувалось {1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} байт було прочитано"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -16502,6 +16496,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr "BD Carthage"
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Бордо - 2012"
 
@@ -17652,6 +17649,9 @@ msgstr ""
 "За допомогою цього втулка ви можете створювати, закривати, знов відкривати "
 "та коментувати повідомлення про помилки."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19722,6 +19722,12 @@ msgstr "за годинниковою стрілкою"
 msgid "Pedestrian Crossing"
 msgstr "Пішохідний перехід"
 
+msgid "Tactile Paving"
+msgstr "Тактильне мощення"
+
+msgid "incorrect"
+msgstr "неправильне"
+
 msgid "In case of traffic signals:"
 msgstr "У разі наявності світлофора"
 
@@ -19910,6 +19916,9 @@ msgstr "Канава"
 msgid "Kerb"
 msgstr "Бордюр"
 
+msgid "Tactile paving"
+msgstr "Тактильне мощення"
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Прохід/проїзд в огорожі"
 
@@ -20897,12 +20906,6 @@ msgstr "Автобусна станція"
 msgid "Bus Stop"
 msgstr "Автобусна зупинка"
 
-msgid "Tactile Paving"
-msgstr "Тактильне мощення"
-
-msgid "incorrect"
-msgstr "неправильне"
-
 msgid "Bus Platform"
 msgstr "Автобусна платформа"
 
@@ -25799,6 +25802,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr "сумнівний ключ (закінчується числом): {0}"
 
+msgid "The key {0} has an uncommon value."
+msgstr "Ключ {0} має дивне значення."
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} на точці. Слід застосовувати до лінії."
 
@@ -25866,6 +25872,13 @@ msgstr ""
 "Точка зʼєднує лінію електромереж або кабель з обʼєктом, який не повʼязаний є "
 "електроенергетикою."
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+"Кінець водного шляху не зʼєднується з іншим водним шляхом, або його напрямок "
+"помилковий"
+
 msgid "abbreviated street name"
 msgstr "скорочене позначення вулиці"
 
@@ -28212,18 +28225,18 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr "Включити/Виключити безперервне завантаження даних"
 
-msgid "Download Settings"
-msgstr "Налаштування завантаженя"
-
-msgid "Settings for the continuous download."
-msgstr "Параметри безперервного завантаження"
-
 msgid "Activate continuous downloads at startup."
 msgstr "Активувати під час запуску JOSM"
 
 msgid "Supress the default modal progress monitor when downloading."
 msgstr "Не показувати діалог з прогресом завантаження даних"
 
+msgid "Download Settings"
+msgstr "Налаштування завантаженя"
+
+msgid "Settings for the continuous download."
+msgstr "Параметри безперервного завантаження"
+
 msgid ""
 "If this plugin is active at startup. This default state will not change when "
 "you are toggeling the plugin with the menu option."
@@ -29984,6 +29997,9 @@ msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 "Пересуватись до місця де був зроблений знімок кнопками Наступний/Попередній"
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr "Режим завантаження"
 
@@ -32627,6 +32643,15 @@ msgstr "Відкрити панель to-fix."
 msgid "Tool:To-fix"
 msgstr "Інструментl:To-fix"
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr "Поставте позначку для:"
+
 msgid "Skip"
 msgstr "Пропустити"
 
@@ -32642,12 +32667,27 @@ msgstr "Виправлена помилка"
 msgid "Not an error"
 msgstr "Не помилка"
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr "Ділянка для завантаження (м²)"
 
 msgid "~.02"
 msgstr "~.02"
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr "tofix:Пропустити"
 
@@ -32657,6 +32697,9 @@ msgstr "tofix:Виправлено"
 msgid "tofix:Not a Error item"
 msgstr "tofix:Не помилка"
 
+msgid "Activate to-fix plugin."
+msgstr "Активації втулка to-fix"
+
 msgid "Maintenance server"
 msgstr "Обслуговування сервера"
 
@@ -32670,6 +32713,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr "Здається щось не так, спробуйте ще раз"
 
+msgid "No change to upload!"
+msgstr "Зміни для завантаження відсутні!"
+
 msgid "Cannot place a node outside of the world."
 msgstr "Неможливо помістити точку за межі світу."
 
diff --git a/i18n/po/ur.po b/i18n/po/ur.po
index 75016b9..805d8b1 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:06+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:06+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: ur\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3520,9 +3520,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5028,9 +5025,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5745,15 +5739,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6051,15 +6045,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6149,6 +6134,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6867,13 +6861,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8871,6 +8865,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8888,12 +8888,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9635,10 +9629,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9647,6 +9638,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9787,13 +9781,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11357,6 +11351,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11365,11 +11364,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11454,6 +11448,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11468,9 +11465,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11584,10 +11578,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11814,6 +11808,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11823,9 +11820,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12945,9 +12939,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13058,6 +13049,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14797,6 +14791,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15872,6 +15869,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17857,6 +17857,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18045,6 +18051,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19028,12 +19037,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23883,6 +23886,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23948,6 +23954,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26060,16 +26071,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27734,6 +27745,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30239,6 +30253,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30254,12 +30277,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30269,6 +30307,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30280,6 +30321,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/vi.po b/i18n/po/vi.po
index b48a863..fc1a6ca 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:06+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:07+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: vi\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3754,9 +3754,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (ở dòng {0}, cột {1})"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5324,9 +5321,6 @@ msgstr "Hệ thống đo lường thay đổi để {0}"
 msgid "Layer not in list."
 msgstr "layer không có trong danh sách."
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "Layer '' {0} '' phải có trong danh sách các lớp"
-
 msgid "Default (open, closed, new)"
 msgstr "Default (mở, đóng mới)"
 
@@ -6095,15 +6089,15 @@ msgstr "Orig. Way"
 msgid "Decision"
 msgstr "Quyết định"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html> Hãy chọn các giá trị để giữ cho các thẻ sau đây. </ html>"
-
 msgid "Show tags with conflicts only"
 msgstr "Hiển thị các thẻ chỉ có xung đột"
 
 msgid "Show tags with multiple values only"
 msgstr "Hiển thị các thẻ với nhiều giá trị duy nhất"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html> Hãy chọn các giá trị để giữ cho các thẻ sau đây. </ html>"
+
 msgid "Apply?"
 msgstr "Áp dụng?"
 
@@ -6409,15 +6403,6 @@ msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 "</ p> <p> Đóng hộp thoại bộ lọc để xem tất cả các đối tượng. <p> </ html>"
 
-msgid "Advanced object info"
-msgstr "Nâng cao Thông tin đối tượng"
-
-msgid "map style"
-msgstr "bản đồ theo phong cách"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "không trong tập dữ liệu"
 
@@ -6506,6 +6491,15 @@ msgstr "Một phần của: "
 msgid "In conflict with: "
 msgstr "Trong cuộc xung đột với: "
 
+msgid "Advanced object info"
+msgstr "Nâng cao Thông tin đối tượng"
+
+msgid "map style"
+msgstr "bản đồ theo phong cách"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "Styles Cache \" {0} \":"
 
@@ -7258,15 +7252,15 @@ msgstr "Query đóng changesets chỉ"
 msgid "Query both open and closed changesets"
 msgstr "Query cả hai mở và đóng cửa changesets"
 
+msgid "Only changesets owned by myself"
+msgstr "Chỉ changesets thuộc sở hữu của bản thân mình"
+
 msgid "User ID:"
 msgstr "User ID:"
 
 msgid "User name:"
 msgstr "Tên người dùng:"
 
-msgid "Only changesets owned by myself"
-msgstr "Chỉ changesets thuộc sở hữu của bản thân mình"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr ""
 "Chỉ changesets thuộc sở hữu của người sử dụng với các ID người dùng sau"
@@ -9475,6 +9469,12 @@ msgstr "Hủy upload"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "giá trị bất ngờ cho chính '' {0} '' trong sở thích, có '' {1} ''"
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "Đổ đầy một changeset và trở về Tải lên Dialog"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "Mở và sử dụng như nhiều changesets mới khi cần thiết"
+
 msgid "Please select the upload strategy:"
 msgstr "Hãy chọn các chiến lược upload:"
 
@@ -9494,12 +9494,6 @@ msgstr ""
 "<Html> Có <strong> nhiều changesets </ strong> cần thiết đểTải lên {0} đối "
 "tượng. Chiến lược Mà bạn có muốn sử dụng? </ Html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "Đổ đầy một changeset và trở về Tải lên Dialog"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "Mở và sử dụng như nhiều changesets mới khi cần thiết"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "Tải lên trong một yêu cầu không thể (quá nhiều đối tượng để tải lên)"
 
@@ -10266,11 +10260,8 @@ msgstr "Không có các lớp hình ảnh."
 msgid "No imagery layers"
 msgstr "Không có các lớp hình ảnh"
 
-msgid "Velocity, km/h"
-msgstr "Velocity, km / h"
-
-msgid "HDOP, m"
-msgstr "HDOP, m"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "Thời gian"
@@ -10278,6 +10269,9 @@ msgstr "Thời gian"
 msgid "Direction"
 msgstr "Direction"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps điểm"
 
@@ -10435,15 +10429,15 @@ msgstr "Không phân tích Mappaint phong cách từ '' {0} '' Lỗi là:. {1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "Không thể xác định vị trí hình ảnh '' {0} ''"
 
+msgid "Save Access Token in preferences"
+msgstr "Save truy cập token trong tùy chọn"
+
 msgid "Access Token Key:"
 msgstr "Access token Key:"
 
 msgid "Access Token Secret:"
 msgstr "Access token Secret:"
 
-msgid "Save Access Token in preferences"
-msgstr "Save truy cập token trong tùy chọn"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -12171,6 +12165,10 @@ msgstr "nội bộ Preset"
 msgid "The default preset for JOSM"
 msgstr "cài sẵn mặc định cho JOSM"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "Plugin {0} vẫn yêu cầu của plugin này:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "Plugin kèm với JOSM"
 
@@ -12181,10 +12179,6 @@ msgstr ""
 "Vui lòng click vào <strong> Tải về danh sách </ strong> để tải về và hiển "
 "thị mộtDanh sách các plugin có sẵn."
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "Plugin {0} vẫn yêu cầu của plugin này:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}: Phiên bản {1} (địa phương: {2})"
 
@@ -12269,6 +12263,9 @@ msgstr "Edit JOSM Plugin mô tả URL."
 msgid "JOSM Plugin description URL"
 msgstr "JOSM Plugin mô tả URL"
 
+msgid "Update interval (in days):"
+msgstr "Cập nhật khoảng thời gian (ngày):"
+
 msgid "Ask before updating"
 msgstr "Hỏi trước khi cập nhật"
 
@@ -12285,9 +12282,6 @@ msgstr ""
 "Hãy quyết định xem liệu JOSM sẽ tự động cập nhật các plugin đang hoạt động "
 "tạiKhởi động sau khi một bản cập nhật của JOSM bản thân."
 
-msgid "Update interval (in days):"
-msgstr "Cập nhật khoảng thời gian (ngày):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -12403,12 +12397,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG: 3008 (Thụy Điển)"
 
-msgid "Projection method"
-msgstr "phương pháp chiếu"
-
 msgid "Projection code"
 msgstr "mã chiếu"
 
+msgid "Projection method"
+msgstr "phương pháp chiếu"
+
 msgid "Display coordinates as"
 msgstr "Hiển thị tọa độ như"
 
@@ -12658,6 +12652,9 @@ msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 "Không thể truy cập cửa hàng OAuth mã tự động cho các thông tin quản lý"
 
+msgid "Save to preferences"
+msgstr "Lưu vào sở thích"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -12670,9 +12667,6 @@ msgid ""
 msgstr ""
 "Bạn đã có một thẻ truy cập để truy cập vào máy chủ OSM sử dụng OAuth."
 
-msgid "Save to preferences"
-msgstr "Lưu vào sở thích"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "Click để bước qua quá trình cấp phép OAuth"
 
@@ -13901,9 +13895,6 @@ msgstr "Thiếu thuộc tính cần thiết '' {0} ''."
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "giá trị lâu bất hợp pháp cho thuộc tính '' {0} ''. Chấn '' {1} ''."
 
-msgid "{0} bytes have been read"
-msgstr "{0} byte đã được đọc"
-
 msgid "Prepare OSM data..."
 msgstr "Chuẩn bị dữ liệu OSM ..."
 
@@ -14015,6 +14006,9 @@ msgstr "WMS Files (* .wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "không được hỗ trợ phiên bản WMS file; tìm thấy {0}, dự kiến ​​{1}"
 
+msgid "{0} bytes have been read"
+msgstr "{0} byte đã được đọc"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -15954,6 +15948,9 @@ msgstr "Bano"
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr "Bordeaux - 2012"
 
@@ -17086,6 +17083,9 @@ msgstr ""
 "thểTạo ra, gần gũi, làm mất hiệu lực, mở lại và nhận xét các báo cáo lỗi này "
 "bằng cách sử dụngCắm vào."
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -19146,6 +19146,12 @@ msgstr "chiều kim đồng hồ"
 msgid "Pedestrian Crossing"
 msgstr "Pedestrian Crossing"
 
+msgid "Tactile Paving"
+msgstr "Tactile lát"
+
+msgid "incorrect"
+msgstr "không chính xác"
+
 msgid "In case of traffic signals:"
 msgstr "Trong trường hợp của các tín hiệu giao thông:"
 
@@ -19336,6 +19342,9 @@ msgstr "Mương"
 msgid "Kerb"
 msgstr "Kerb"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "Entrance (Barrier Opening)"
 
@@ -20323,12 +20332,6 @@ msgstr "Bus Station"
 msgid "Bus Stop"
 msgstr "Bus Stop"
 
-msgid "Tactile Paving"
-msgstr "Tactile lát"
-
-msgid "incorrect"
-msgstr "không chính xác"
-
 msgid "Bus Platform"
 msgstr "Bus Platform"
 
@@ -25217,6 +25220,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr "{0} trên một nút. Nên được sử dụng trên một con đường."
 
@@ -25282,6 +25288,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "tên đường tắt"
 
@@ -27596,16 +27607,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -29347,6 +29358,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -31963,6 +31977,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -31978,12 +32001,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -31993,6 +32031,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -32004,6 +32045,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "Không thể đặt một nút bên ngoài của thế giới."
 
diff --git a/i18n/po/wae.po b/i18n/po/wae.po
index b4045e2..175562e 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-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+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-05-04 05:11+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:12+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
 msgstr ""
@@ -3519,9 +3519,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr ""
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -5027,9 +5024,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr ""
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr ""
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5744,15 +5738,15 @@ msgstr ""
 msgid "Decision"
 msgstr ""
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr ""
-
 msgid "Show tags with conflicts only"
 msgstr ""
 
 msgid "Show tags with multiple values only"
 msgstr ""
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr ""
+
 msgid "Apply?"
 msgstr ""
 
@@ -6050,15 +6044,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr ""
 
-msgid "Advanced object info"
-msgstr ""
-
-msgid "map style"
-msgstr ""
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr ""
 
@@ -6148,6 +6133,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr ""
+
+msgid "map style"
+msgstr ""
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6866,13 +6860,13 @@ msgstr ""
 msgid "Query both open and closed changesets"
 msgstr ""
 
-msgid "User ID:"
+msgid "Only changesets owned by myself"
 msgstr ""
 
-msgid "User name:"
+msgid "User ID:"
 msgstr ""
 
-msgid "Only changesets owned by myself"
+msgid "User name:"
 msgstr ""
 
 msgid "Only changesets owned by the user with the following user ID"
@@ -8870,6 +8864,12 @@ msgstr ""
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr ""
+
+msgid "Open and use as many new changesets as necessary"
+msgstr ""
+
 msgid "Please select the upload strategy:"
 msgstr ""
 
@@ -8887,12 +8887,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr ""
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr ""
-
-msgid "Open and use as many new changesets as necessary"
-msgstr ""
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr ""
 
@@ -9634,10 +9628,7 @@ msgstr ""
 msgid "No imagery layers"
 msgstr ""
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9646,6 +9637,9 @@ msgstr ""
 msgid "Direction"
 msgstr ""
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr ""
 
@@ -9786,13 +9780,13 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
-msgid "Access Token Key:"
+msgid "Save Access Token in preferences"
 msgstr ""
 
-msgid "Access Token Secret:"
+msgid "Access Token Key:"
 msgstr ""
 
-msgid "Save Access Token in preferences"
+msgid "Access Token Secret:"
 msgstr ""
 
 msgid ""
@@ -11356,6 +11350,11 @@ msgstr ""
 msgid "The default preset for JOSM"
 msgstr ""
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr ""
 
@@ -11364,11 +11363,6 @@ msgid ""
 "list of available plugins."
 msgstr ""
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr ""
 
@@ -11453,6 +11447,9 @@ msgstr ""
 msgid "JOSM Plugin description URL"
 msgstr ""
 
+msgid "Update interval (in days):"
+msgstr ""
+
 msgid "Ask before updating"
 msgstr ""
 
@@ -11467,9 +11464,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr ""
 
-msgid "Update interval (in days):"
-msgstr ""
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11583,10 +11577,10 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr ""
 
-msgid "Projection method"
+msgid "Projection code"
 msgstr ""
 
-msgid "Projection code"
+msgid "Projection method"
 msgstr ""
 
 msgid "Display coordinates as"
@@ -11813,6 +11807,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr ""
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11822,9 +11819,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr ""
 
-msgid "Save to preferences"
-msgstr ""
-
 msgid "Click to step through the OAuth authorization process"
 msgstr ""
 
@@ -12944,9 +12938,6 @@ msgstr ""
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr ""
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr ""
 
@@ -13057,6 +13048,9 @@ msgstr ""
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr ""
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14796,6 +14790,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15871,6 +15868,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17856,6 +17856,12 @@ msgstr ""
 msgid "Pedestrian Crossing"
 msgstr ""
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18044,6 +18050,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19027,12 +19036,6 @@ msgstr ""
 msgid "Bus Stop"
 msgstr ""
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr ""
 
@@ -23882,6 +23885,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -23947,6 +23953,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26059,16 +26070,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27733,6 +27744,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30238,6 +30252,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30253,12 +30276,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30268,6 +30306,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30279,6 +30320,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr ""
 
diff --git a/i18n/po/zh_CN.po b/i18n/po/zh_CN.po
index 98302a7..8d3bfb2 100644
--- a/i18n/po/zh_CN.po
+++ b/i18n/po/zh_CN.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
 "PO-Revision-Date: 2016-03-03 01:46+0000\n"
 "Last-Translator: sinopitt <Unknown>\n"
 "Language-Team: 汉语 <>\n"
@@ -18,8 +18,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Launchpad-Export-Date: 2016-05-04 05:09+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:10+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: zh_CN\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
@@ -3513,9 +3513,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (在 {0} 行,{1} 列)"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr "UTM 投影(''+proj=utm'')需要“+zone=...”参数。"
 
@@ -5025,9 +5022,6 @@ msgstr "测量系统更改为 {0}"
 msgid "Layer not in list."
 msgstr "图层不在列表中。"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "图层“{0}”必须在图层列表中"
-
 msgid "Default (open, closed, new)"
 msgstr "默认(开启,关闭,新建)"
 
@@ -5744,15 +5738,15 @@ msgstr "原路径"
 msgid "Decision"
 msgstr "决定"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>请选择下列标签要保留的数值。</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "只显示有冲突的标签"
 
 msgid "Show tags with multiple values only"
 msgstr "只显示有多个数值的标签"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>请选择下列标签要保留的数值。</html>"
+
 msgid "Apply?"
 msgstr "应用?"
 
@@ -6046,15 +6040,6 @@ msgstr[0] "已禁用 <b>{0}</b> 个对象"
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>关闭过滤器对话框,以查看所有的对象。<p></html>"
 
-msgid "Advanced object info"
-msgstr "高级的对象信息"
-
-msgid "map style"
-msgstr "地图样式"
-
-msgid "edit counts"
-msgstr "编辑计数"
-
 msgid "not in data set"
 msgstr "不在数据集合中"
 
@@ -6143,6 +6128,15 @@ msgstr "部分: "
 msgid "In conflict with: "
 msgstr "冲突: "
 
+msgid "Advanced object info"
+msgstr "高级的对象信息"
+
+msgid "map style"
+msgstr "地图样式"
+
+msgid "edit counts"
+msgstr "编辑计数"
+
 msgid "Styles Cache for \"{0}\":"
 msgstr "“{0}”的样式缓存:"
 
@@ -6879,15 +6873,15 @@ msgstr "只查询关闭的修改集合"
 msgid "Query both open and closed changesets"
 msgstr "查询开放与关闭的修改集合"
 
+msgid "Only changesets owned by myself"
+msgstr "只是我自己拥有的修改集合"
+
 msgid "User ID:"
 msgstr "用户 ID:"
 
 msgid "User name:"
 msgstr "用户名:"
 
-msgid "Only changesets owned by myself"
-msgstr "只是我自己拥有的修改集合"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "只是下列用户 ID 拥有的修改集合"
 
@@ -8906,6 +8900,12 @@ msgstr "正在取消上传"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr "首选项中意外的键\"{0}\"值\"{1}\""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "填满一个修改集合并回到上传对话框"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "打开并依需要使用新的修改集合"
+
 msgid "Please select the upload strategy:"
 msgstr "请选择上传的方式:"
 
@@ -8923,12 +8923,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr "<html>需要<strong>多个修改集合</strong>才能上传 {0} 个对象。您想要使用哪种方式?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "填满一个修改集合并回到上传对话框"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "打开并依需要使用新的修改集合"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "以一次要求上传是不可能的(太多对象要上传)"
 
@@ -9679,11 +9673,8 @@ msgstr "没有图像图层。"
 msgid "No imagery layers"
 msgstr "没有图像图层"
 
-msgid "Velocity, km/h"
-msgstr "速度,千米/小时"
-
-msgid "HDOP, m"
-msgstr "水平精度因子,米"
+msgid "HDOP"
+msgstr ""
 
 msgid "Time"
 msgstr "时间"
@@ -9691,6 +9682,9 @@ msgstr "时间"
 msgid "Direction"
 msgstr "方向"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps 点"
 
@@ -9829,15 +9823,15 @@ msgstr "从“{0}”解析地图绘画风格失败。错误为:{1}"
 msgid "Failed to locate image ''{0}''"
 msgstr "定位图像“{0}”时失败"
 
+msgid "Save Access Token in preferences"
+msgstr "在首选项中保存访问令牌"
+
 msgid "Access Token Key:"
 msgstr "访问令牌键:"
 
 msgid "Access Token Secret:"
 msgstr "访问令牌密码:"
 
-msgid "Save Access Token in preferences"
-msgstr "在首选项中保存访问令牌"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -11446,6 +11440,10 @@ msgstr "内部预设组合"
 msgid "The default preset for JOSM"
 msgstr "JOSM 的预设组合"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] "插件 {0} 仍需要这 {1} 个插件:"
+
 msgid "Plugin bundled with JOSM"
 msgstr "JOSM 随附插件"
 
@@ -11454,10 +11452,6 @@ msgid ""
 "list of available plugins."
 msgstr "请点击<strong>下载列表</strong>,来下载并显示可用插件的列表。"
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] "插件 {0} 仍需要这 {1} 个插件:"
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}:版本 {1}(本地:{2})"
 
@@ -11540,6 +11534,9 @@ msgstr "编辑 JOSM 插件描述 URL。"
 msgid "JOSM Plugin description URL"
 msgstr "JOSM 插件描述 URL"
 
+msgid "Update interval (in days):"
+msgstr "更新间隔(以日计):"
+
 msgid "Ask before updating"
 msgstr "更新前询问"
 
@@ -11554,9 +11551,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr "请决定 JOSM 是否该在更新 JOSM 本身后,于启动时自动更新使用中的插件。"
 
-msgid "Update interval (in days):"
-msgstr "更新间隔(以日计):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11670,12 +11664,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008(瑞典)"
 
-msgid "Projection method"
-msgstr "投影法"
-
 msgid "Projection code"
 msgstr "投影法代码"
 
+msgid "Projection method"
+msgstr "投影法"
+
 msgid "Display coordinates as"
 msgstr "显示坐标为"
 
@@ -11906,6 +11900,9 @@ msgstr "无法从凭据管理器获取 OAuth 访问令牌"
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr "无法将 OAuth 访问令牌存储至凭据管理器"
 
+msgid "Save to preferences"
+msgstr "保存到首选项"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11915,9 +11912,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "您已经有能用 OAuth 访问 OSM 服务器的访问令牌。"
 
-msgid "Save to preferences"
-msgstr "保存到首选项"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "点击以进行 OAuth 授权程序"
 
@@ -13038,9 +13032,6 @@ msgstr "缺少必要的属性“{0}”。"
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "属性“{0}” long 数值非法。得到“{1}”。"
 
-msgid "{0} bytes have been read"
-msgstr "已读入 {0} 字节"
-
 msgid "Prepare OSM data..."
 msgstr "准备 OSM 数据..."
 
@@ -13149,6 +13140,9 @@ msgstr "WMS 文件(*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "不支持的 WMS 文件版本;发现 {0},应为 {1}"
 
+msgid "{0} bytes have been read"
+msgstr "已读入 {0} 字节"
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14907,6 +14901,9 @@ msgstr "BANO"
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15982,6 +15979,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17967,6 +17967,12 @@ msgstr "顺时针"
 msgid "Pedestrian Crossing"
 msgstr "人行横道"
 
+msgid "Tactile Paving"
+msgstr "盲道"
+
+msgid "incorrect"
+msgstr "不正确"
+
 msgid "In case of traffic signals:"
 msgstr "如遇交通信号:"
 
@@ -18155,6 +18161,9 @@ msgstr "沟"
 msgid "Kerb"
 msgstr "路缘石"
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr "入口(围栏缺口)"
 
@@ -19138,12 +19147,6 @@ msgstr "公交车车站"
 msgid "Bus Stop"
 msgstr "公交车停靠站"
 
-msgid "Tactile Paving"
-msgstr "盲道"
-
-msgid "incorrect"
-msgstr "不正确"
-
 msgid "Bus Platform"
 msgstr "公交车月台"
 
@@ -23993,6 +23996,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24058,6 +24064,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr "缩写的街道名称"
 
@@ -26280,16 +26291,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27971,6 +27982,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30475,6 +30489,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30490,12 +30513,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30505,6 +30543,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30516,6 +30557,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "不能在世界之外放置节点。"
 
diff --git a/i18n/po/zh_TW.po b/i18n/po/zh_TW.po
index 8fa5ef3..ace4770 100644
--- a/i18n/po/zh_TW.po
+++ b/i18n/po/zh_TW.po
@@ -7,20 +7,20 @@ msgid ""
 msgstr ""
 "Project-Id-Version: josm\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-04 03:36+0200\n"
-"PO-Revision-Date: 2016-04-28 14:22+0000\n"
-"Last-Translator: Sean Young <assanges at gmail.com>\n"
+"POT-Creation-Date: 2016-05-30 03:38+0200\n"
+"PO-Revision-Date: 2016-05-26 11:14+0000\n"
+"Last-Translator: Rex Tsai <rex.tsai at canonical.com>\n"
 "Language-Team: Traditional Chinese\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-05-04 05:09+0000\n"
-"X-Generator: Launchpad (build 17995)\n"
+"X-Launchpad-Export-Date: 2016-05-30 05:09+0000\n"
+"X-Generator: Launchpad (build 18053)\n"
 "Language: zh_TW\n"
 
 msgid "{0}: option ''{1}'' is ambiguous"
-msgstr "{0}:選項「{1}」不明確"
+msgstr "{0}:選項 {1} 不明確"
 
 msgid "{0}: option ''--{1}'' does not allow an argument"
 msgstr "{0}:選項「--{1}」不允許參數"
@@ -1472,7 +1472,7 @@ msgid "Existing node"
 msgstr "既存節點"
 
 msgid "Both nodes"
-msgstr ""
+msgstr "兩個節點"
 
 msgid "New node"
 msgstr "新節點"
@@ -1487,7 +1487,7 @@ msgid "Where should the tags of the node be put?"
 msgstr ""
 
 msgid "Where should the memberships of this node be put?"
-msgstr ""
+msgstr "要把節點成員放在哪裡呢?"
 
 msgid "Unglued Node"
 msgstr "取消黏合節點"
@@ -1516,27 +1516,24 @@ msgstr ""
 
 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 "從路徑中分離節點"
 
 msgid "Disconnect nodes from a way they currently belong to"
-msgstr ""
+msgstr "自目前節點之所屬路徑斷開"
 
 msgid "Select at least one node to be disconnected."
-msgstr ""
+msgstr "選擇至少一個節點斷開。"
 
 msgid "Selected node cannot be disconnected from anything."
 msgid_plural "Selected nodes cannot be disconnected from anything."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "已選擇的節點無法自任何物件斷開"
 
 msgid ""
 "The affected way would disappear after disconnecting the selected node."
@@ -3513,9 +3510,6 @@ msgstr ""
 msgid "value expected"
 msgstr ""
 
-msgid " (at line {0}, column {1})"
-msgstr " (於第 {0} 列,第 {1} 欄)"
-
 msgid "UTM projection (''+proj=utm'') requires ''+zone=...'' parameter."
 msgstr ""
 
@@ -4633,7 +4627,7 @@ msgstr "圖片偏移"
 
 msgctxt "menu"
 msgid "Imagery"
-msgstr ""
+msgstr "圖磚"
 
 msgctxt "layer"
 msgid "Offset"
@@ -5023,9 +5017,6 @@ msgstr ""
 msgid "Layer not in list."
 msgstr "圖層不在清單中。"
 
-msgid "Layer ''{0}'' must be in list of layers"
-msgstr "圖層「{0}」必須在圖層的清單中"
-
 msgid "Default (open, closed, new)"
 msgstr ""
 
@@ -5732,15 +5723,15 @@ msgstr "原路徑"
 msgid "Decision"
 msgstr "決定"
 
-msgid "<html>Please select the values to keep for the following tags.</html>"
-msgstr "<html>請選擇下列標籤要保留的數值。</html>"
-
 msgid "Show tags with conflicts only"
 msgstr "只顯示有衝突的標籤"
 
 msgid "Show tags with multiple values only"
 msgstr "只顯示有多個數值的標籤"
 
+msgid "<html>Please select the values to keep for the following tags.</html>"
+msgstr "<html>請選擇下列標籤要保留的數值。</html>"
+
 msgid "Apply?"
 msgstr "是否接受?"
 
@@ -6039,15 +6030,6 @@ msgstr[1] ""
 msgid "</p><p>Close the filter dialog to see all objects.<p></html>"
 msgstr "</p><p>關閉過濾條件對話盒以查看所有的物件。<p></html>"
 
-msgid "Advanced object info"
-msgstr "進階的物件資訊"
-
-msgid "map style"
-msgstr "地圖樣式"
-
-msgid "edit counts"
-msgstr ""
-
 msgid "not in data set"
 msgstr "不在資料組合內"
 
@@ -6136,6 +6118,15 @@ msgstr ""
 msgid "In conflict with: "
 msgstr ""
 
+msgid "Advanced object info"
+msgstr "進階的物件資訊"
+
+msgid "map style"
+msgstr "地圖樣式"
+
+msgid "edit counts"
+msgstr ""
+
 msgid "Styles Cache for \"{0}\":"
 msgstr ""
 
@@ -6856,15 +6847,15 @@ msgstr "只查詢已關閉的變更組合"
 msgid "Query both open and closed changesets"
 msgstr "查詢開放與關閉的變更組合"
 
+msgid "Only changesets owned by myself"
+msgstr "只有我自己擁有的變更組合"
+
 msgid "User ID:"
 msgstr "使用者 ID:"
 
 msgid "User name:"
 msgstr "使用者名稱:"
 
-msgid "Only changesets owned by myself"
-msgstr "只有我自己擁有的變更組合"
-
 msgid "Only changesets owned by the user with the following user ID"
 msgstr "只有由下列使用者 ID 擁有的變更組合"
 
@@ -8118,13 +8109,13 @@ msgid "Changeset source"
 msgstr ""
 
 msgid "Imagery used"
-msgstr ""
+msgstr "已用圖磚"
 
 msgid "<b>Source</b>:"
 msgstr ""
 
 msgid "<b>Imagery</b>:"
-msgstr ""
+msgstr "<b>圖磚</b>:"
 
 msgid ""
 "<html>Version <strong>{0}</strong> currently edited in layer ''{1}''</html>"
@@ -8877,6 +8868,12 @@ msgstr "正在取消上傳"
 msgid "Unexpected value for key ''{0}'' in preferences, got ''{1}''"
 msgstr ""
 
+msgid "Fill up one changeset and return to the Upload Dialog"
+msgstr "填滿一個變更組合並回到上傳對話盒"
+
+msgid "Open and use as many new changesets as necessary"
+msgstr "開啟並依需要使用新的變更組合"
+
 msgid "Please select the upload strategy:"
 msgstr "請選擇上傳的方式:"
 
@@ -8894,12 +8891,6 @@ msgid ""
 "upload {0} objects. Which strategy do you want to use?</html>"
 msgstr "<html>需要<strong>多個變更組合</strong>才能上傳 {0} 個物件。您想要使用哪種方式?</html>"
 
-msgid "Fill up one changeset and return to the Upload Dialog"
-msgstr "填滿一個變更組合並回到上傳對話盒"
-
-msgid "Open and use as many new changesets as necessary"
-msgstr "開啟並依需要使用新的變更組合"
-
 msgid "Upload in one request not possible (too many objects to upload)"
 msgstr "以一次要求上傳是不可能的 (太多物件要上傳)"
 
@@ -9634,15 +9625,12 @@ msgid "Select imagery layer"
 msgstr "選擇圖片圖層"
 
 msgid "There are no imagery layers."
-msgstr "沒有圖片圖層。"
+msgstr "沒有圖磚圖層。"
 
 msgid "No imagery layers"
 msgstr "沒有圖片圖層"
 
-msgid "Velocity, km/h"
-msgstr ""
-
-msgid "HDOP, m"
+msgid "HDOP"
 msgstr ""
 
 msgid "Time"
@@ -9651,6 +9639,9 @@ msgstr "時刻"
 msgid "Direction"
 msgstr "方向"
 
+msgid "Velocity, {0}"
+msgstr ""
+
 msgid "gps point"
 msgstr "gps 點"
 
@@ -9790,15 +9781,15 @@ msgstr ""
 msgid "Failed to locate image ''{0}''"
 msgstr ""
 
+msgid "Save Access Token in preferences"
+msgstr "在偏好設定中儲存存取記號"
+
 msgid "Access Token Key:"
 msgstr "存取記號鍵:"
 
 msgid "Access Token Secret:"
 msgstr "存取記號機密:"
 
-msgid "Save Access Token in preferences"
-msgstr "在偏好設定中儲存存取記號"
-
 msgid ""
 "<html>Select to save the Access Token in the JOSM preferences.<br>Unselect "
 "to use the Access Token in this JOSM session only.</html>"
@@ -11400,6 +11391,11 @@ msgstr "內部預設組合"
 msgid "The default preset for JOSM"
 msgstr "JOSM 的預設組合"
 
+msgid "Plugin {0} is still required by this plugin:"
+msgid_plural "Plugin {0} is still required by these {1} plugins:"
+msgstr[0] ""
+msgstr[1] ""
+
 msgid "Plugin bundled with JOSM"
 msgstr "JOSM 隨附外掛程式"
 
@@ -11408,11 +11404,6 @@ msgid ""
 "list of available plugins."
 msgstr "請點選<strong>下載清單</strong>來下載並顯示可用外掛程式的清單。"
 
-msgid "Plugin {0} is still required by this plugin:"
-msgid_plural "Plugin {0} is still required by these {1} plugins:"
-msgstr[0] ""
-msgstr[1] ""
-
 msgid "{0}: Version {1} (local: {2})"
 msgstr "{0}:版本 {1} (本地端: {2})"
 
@@ -11495,6 +11486,9 @@ msgstr "編輯 JOSM 外掛程式描述 URL。"
 msgid "JOSM Plugin description URL"
 msgstr "JOSM 外掛程式描述 URL"
 
+msgid "Update interval (in days):"
+msgstr "更新間隔 (以日計):"
+
 msgid "Ask before updating"
 msgstr "更新前詢問"
 
@@ -11509,9 +11503,6 @@ msgid ""
 "startup after an update of JOSM itself."
 msgstr "請決定 JOSM 是否該在更新 JOSM 本身後於啟動時自動更新使用中的外掛程式。"
 
-msgid "Update interval (in days):"
-msgstr "更新間隔 (以日計):"
-
 msgid ""
 "Please decide whether JOSM shall automatically update active plugins after a "
 "certain period of time."
@@ -11625,12 +11616,12 @@ msgstr ""
 msgid "SWEREF99 13 30 / EPSG:3008 (Sweden)"
 msgstr "SWEREF99 13 30 / EPSG:3008 (瑞典)"
 
-msgid "Projection method"
-msgstr "投影方法"
-
 msgid "Projection code"
 msgstr "投影法代碼"
 
+msgid "Projection method"
+msgstr "投影方法"
+
 msgid "Display coordinates as"
 msgstr "顯示坐標為"
 
@@ -11859,6 +11850,9 @@ msgstr ""
 msgid "Failed to store OAuth Access Token to credentials manager"
 msgstr ""
 
+msgid "Save to preferences"
+msgstr "儲存到偏好設定"
+
 msgid ""
 "You do not have an Access Token yet to access the OSM server using OAuth. "
 "Please authorize first."
@@ -11868,9 +11862,6 @@ msgid ""
 "You already have an Access Token to access the OSM server using OAuth."
 msgstr "您已經有能用 OAuth 存取 OSM 伺服器的存取記號。"
 
-msgid "Save to preferences"
-msgstr "儲存到偏好設定"
-
 msgid "Click to step through the OAuth authorization process"
 msgstr "點選以進行 OAuth 授權程序"
 
@@ -12992,9 +12983,6 @@ msgstr "缺少必要的屬性「{0}」。"
 msgid "Illegal long value for attribute ''{0}''. Got ''{1}''."
 msgstr "屬性「{0}」有不合格的 long 數值。得到「{1}」。"
 
-msgid "{0} bytes have been read"
-msgstr ""
-
 msgid "Prepare OSM data..."
 msgstr "準備 OSM 資料..."
 
@@ -13103,6 +13091,9 @@ msgstr "WMS 檔案 (*.wms)"
 msgid "Unsupported WMS file version; found {0}, expected {1}"
 msgstr "不支援的 WMS 檔案版本;發現 {0},應為 {1}"
 
+msgid "{0} bytes have been read"
+msgstr ""
+
 msgid ""
 "<html><body><p class=\"warning-body\"><strong>Warning:</strong> The password "
 "is stored in plain text in the JOSM preferences file. Furthermore, it is "
@@ -14856,6 +14847,9 @@ msgstr ""
 msgid "BD Carthage"
 msgstr ""
 
+msgid "BD Ortho"
+msgstr ""
+
 msgid "Bordeaux - 2012"
 msgstr ""
 
@@ -15933,6 +15927,9 @@ msgid ""
 "plugin."
 msgstr ""
 
+msgid "Allows the user to work with pictures hosted at mapillary.com"
+msgstr ""
+
 msgid ""
 "Provide a measurement dialog and a layer to measure length and angle of "
 "segments, area surrounded by a (simple) closed way and create measurement "
@@ -17918,6 +17915,12 @@ msgstr "順時針"
 msgid "Pedestrian Crossing"
 msgstr "行人穿越道"
 
+msgid "Tactile Paving"
+msgstr ""
+
+msgid "incorrect"
+msgstr ""
+
 msgid "In case of traffic signals:"
 msgstr ""
 
@@ -18106,6 +18109,9 @@ msgstr ""
 msgid "Kerb"
 msgstr ""
 
+msgid "Tactile paving"
+msgstr ""
+
 msgid "Entrance (Barrier Opening)"
 msgstr ""
 
@@ -19089,12 +19095,6 @@ msgstr "公車車站"
 msgid "Bus Stop"
 msgstr "公車站牌"
 
-msgid "Tactile Paving"
-msgstr ""
-
-msgid "incorrect"
-msgstr ""
-
 msgid "Bus Platform"
 msgstr "公車月台"
 
@@ -23944,6 +23944,9 @@ msgstr ""
 msgid "questionable key (ending with a number): {0}"
 msgstr ""
 
+msgid "The key {0} has an uncommon value."
+msgstr ""
+
 msgid "{0} on a node. Should be used on a way."
 msgstr ""
 
@@ -24009,6 +24012,11 @@ msgid ""
 "the power infrastructure."
 msgstr ""
 
+msgid ""
+"Waterway ends without a connection to another waterway or the direction of "
+"the waterway is wrong."
+msgstr ""
+
 msgid "abbreviated street name"
 msgstr ""
 
@@ -26183,16 +26191,16 @@ msgstr ""
 msgid "Toggle the continuous download on/off"
 msgstr ""
 
-msgid "Download Settings"
+msgid "Activate continuous downloads at startup."
 msgstr ""
 
-msgid "Settings for the continuous download."
+msgid "Supress the default modal progress monitor when downloading."
 msgstr ""
 
-msgid "Activate continuous downloads at startup."
+msgid "Download Settings"
 msgstr ""
 
-msgid "Supress the default modal progress monitor when downloading."
+msgid "Settings for the continuous download."
 msgstr ""
 
 msgid ""
@@ -27869,6 +27877,9 @@ msgstr ""
 msgid "Move to picture''s location with next/previous buttons"
 msgstr ""
 
+msgid "Preview images when hovering its icon"
+msgstr ""
+
 msgid "Download mode"
 msgstr ""
 
@@ -30374,6 +30385,15 @@ msgstr ""
 msgid "Tool:To-fix"
 msgstr ""
 
+msgid "Enable Tofix plugin"
+msgstr ""
+
+msgid "Auto delete layer"
+msgstr ""
+
+msgid "Select the checkbox to:"
+msgstr ""
+
 msgid "Skip"
 msgstr ""
 
@@ -30389,12 +30409,27 @@ msgstr ""
 msgid "Not an error"
 msgstr ""
 
+msgid "<html><a href=\"\">List of tasks</a></html>"
+msgstr ""
+
+msgid "Select a task ..."
+msgstr ""
+
 msgid "Set download area (m²)"
 msgstr ""
 
 msgid "~.02"
 msgstr ""
 
+msgid "Tasks"
+msgstr ""
+
+msgid "Config"
+msgstr ""
+
+msgid "Activation"
+msgstr ""
+
 msgid "tofix:Skip item"
 msgstr ""
 
@@ -30404,6 +30439,9 @@ msgstr ""
 msgid "tofix:Not a Error item"
 msgstr ""
 
+msgid "Activate to-fix plugin."
+msgstr ""
+
 msgid "Maintenance server"
 msgstr ""
 
@@ -30415,6 +30453,9 @@ msgstr ""
 msgid "Something went wrong, try again"
 msgstr ""
 
+msgid "No change to upload!"
+msgstr ""
+
 msgid "Cannot place a node outside of the world."
 msgstr "不能在世界範圍以外放置節點。"
 
@@ -32042,31 +32083,31 @@ msgstr ""
 msgid ""
 "Double click on item to search for object with article name (and center "
 "coordinate)"
-msgstr ""
+msgstr "點撃兩下以條目名稱(和中心坐標)搜索物件"
 
 msgid "Available via WIWOSM server"
-msgstr ""
+msgstr "可透過 WIWOSM 伺服器利用"
 
 msgid "Available in local dataset"
-msgstr ""
+msgstr "可供本地數據資料庫利用"
 
 msgid "Not linked yet"
-msgstr ""
+msgstr "尚未連結"
 
 msgid "{0}.Wikipedia.org"
-msgstr ""
+msgstr "{0}.Wikipedia.org"
 
 msgid "{0}.Wikipedia.org: {1}"
-msgstr ""
+msgstr "{0}.Wikipedia.org:{1}"
 
 msgid "Fetches all coordinates from Wikipedia in the current view"
-msgstr ""
+msgstr "自維基百科取得目前檢視區域之坐標"
 
 msgid "Category"
 msgstr "分類"
 
 msgid "Fetches a list of all Wikipedia articles of a category"
-msgstr ""
+msgstr "取得分類内所有維基百科條目列表"
 
 msgid "Enter the Wikipedia category"
 msgstr "輸入維基百科分類"
@@ -32084,10 +32125,10 @@ msgid "Open Article"
 msgstr "開啟條目"
 
 msgid "Opens the Wikipedia article of the selected item in a browser"
-msgstr ""
+msgstr "在瀏覽器内開啟所選項目的維基百科條目"
 
 msgid "Sets the default language for the Wikipedia articles"
-msgstr ""
+msgstr "設定維基百科的預設語言版本"
 
 msgid "Enter the Wikipedia language"
 msgstr "輸入維基百科語言"
diff --git a/images/cursor/modifier/parallel.png b/images/cursor/modifier/parallel.png
index 37c71cc..2bc1b18 100644
Binary files a/images/cursor/modifier/parallel.png and b/images/cursor/modifier/parallel.png differ
diff --git a/images/cursor/modifier/parallel_add.png b/images/cursor/modifier/parallel_add.png
new file mode 100644
index 0000000..167f89c
Binary files /dev/null and b/images/cursor/modifier/parallel_add.png differ
diff --git a/images/cursor/modifier/parallel_remove.png b/images/cursor/modifier/parallel_remove.png
new file mode 100644
index 0000000..b8409e4
Binary files /dev/null and b/images/cursor/modifier/parallel_remove.png differ
diff --git a/netbeans/nbproject/project.properties b/netbeans/nbproject/project.properties
index 798d1b0..95ec5d6 100644
--- a/netbeans/nbproject/project.properties
+++ b/netbeans/nbproject/project.properties
@@ -36,7 +36,7 @@ file.reference.commons-lang-2.3.jar=../test/lib/unitils-core/commons-lang-2.3.ja
 file.reference.commons-logging-1.1.jar=../test/lib/unitils-core/commons-logging-1.1.jar
 file.reference.core-src=../src
 file.reference.debug-1.0.jar=../test/lib/fest/debug-1.0.jar
-file.reference.equalsverifier-1.7.6.jar=../test/lib/equalsverifier-1.7.6.jar
+file.reference.equalsverifier-2.0.2.jar=../test/lib/equalsverifier-2.0.2.jar
 file.reference.fest-assert-1.0.jar=../test/lib/fest/fest-assert-1.0.jar
 file.reference.fest-reflect-1.1.jar=../test/lib/fest/fest-reflect-1.1.jar
 file.reference.fest-swing-1.1.jar=../test/lib/fest/fest-swing-1.1.jar
@@ -66,7 +66,7 @@ javac.test.classpath=\
     ${javac.classpath}:\
     ${build.classes.dir}:\
     ${file.reference.junit-4.12.jar}:\
-    ${file.reference.equalsverifier-1.7.6.jar}:\
+    ${file.reference.equalsverifier-2.0.2.jar}:\
     ${file.reference.jfcunit.jar}:\
     ${file.reference.hamcrest-core-1.3.jar}:\
     ${file.reference.MRJToolkitStubs-1.0.jar}:\
diff --git a/scripts/SyncEditorImageryIndex.groovy b/scripts/SyncEditorImageryIndex.groovy
index 200d734..88bf350 100644
--- a/scripts/SyncEditorImageryIndex.groovy
+++ b/scripts/SyncEditorImageryIndex.groovy
@@ -24,6 +24,8 @@ 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;
@@ -176,6 +178,7 @@ class SyncEditorImageryIndex {
         }
     }
 
+    @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     void myprintln(String s) {
         if(skipEntries.containsKey(s)) {
             skipCount = skipEntries.get(s)
diff --git a/src/gnu/getopt/Getopt.java b/src/gnu/getopt/Getopt.java
index a8290c2..90b2c6c 100644
--- a/src/gnu/getopt/Getopt.java
+++ b/src/gnu/getopt/Getopt.java
@@ -3,7 +3,7 @@
 /* Java Port Copyright (c) 1998 by Aaron M. Renn (arenn at urbanophile.com)
 /*
 /* This program is free software; you can redistribute it and/or modify
-/* it under the terms of the GNU Library General Public License as published 
+/* it under the terms of the GNU Library General Public License as published
 /* by  the Free Software Foundation; either version 2 of the License or
 /* (at your option) any later version.
 /*
@@ -13,8 +13,8 @@
 /* GNU Library General Public License for more details.
 /*
 /* You should have received a copy of the GNU Library General Public License
-/* along with this program; see the file COPYING.LIB.  If not, write to 
-/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, 
+/* along with this program; see the file COPYING.LIB.  If not, write to
+/* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
 /* Boston, MA  02111-1307 USA
 /**************************************************************************/
 
@@ -54,7 +54,7 @@ import java.util.Map;
   * invalid option encountered is stored in the instance variable optopt
   * which can be retrieved using the getOptopt() method.  To suppress
   * the printing of error messages for this or any other error, set
-  * the value of the opterr instance variable to false using the 
+  * the value of the opterr instance variable to false using the
   * setOpterr() method.
   * <p>
   * Between calls to getopt(), the instance variable optind is used to
@@ -64,7 +64,7 @@ import java.util.Map;
   * method.
   * <p>
   * Note that this object expects command line options to be passed in the
-  * traditional Unix manner.  That is, proceeded by a '-' character. 
+  * traditional Unix manner.  That is, proceeded by a '-' character.
   * Multiple options can follow the '-'.  For example "-abc" is equivalent
   * to "-a -b -c".  If an option takes a required argument, the value
   * of the argument can immediately follow the option character or be
@@ -79,7 +79,7 @@ import java.util.Map;
   * of "foo".
   * <p>
   * The user can stop getopt() from scanning any further into a command line
-  * by using the special argument "--" by itself.  For example: 
+  * by using the special argument "--" by itself.  For example:
   * "-a -- -d" would return an option character of 'a', then return -1
   * The "--" is discarded and "-d" is pointed to by optind as the first
   * non-option argv element.
@@ -103,7 +103,7 @@ import java.util.Map;
   *          case 'b':
   *          case 'c':
   *            arg = g.getOptarg();
-  *            System.out.print("You picked " + (char)c + 
+  *            System.out.print("You picked " + (char)c +
   *                             " with an argument of " +
   *                             ((arg != null) ? arg : "null") + "\n");
   *            break;
@@ -144,15 +144,15 @@ import java.util.Map;
   * method permutes the argument to make it appear to the caller that all
   * options were at the beginning of the command line, and all non-options
   * were at the end.  For example, calling getopt() with command line args
-  * of "-a foo bar -d" returns options 'a' and 'd', then sets optind to 
+  * of "-a foo bar -d" returns options 'a' and 'd', then sets optind to
   * point to "foo".  The program would read the last two argv elements as
-  * "foo" and "bar", just as if the user had typed "-a -d foo bar". 
-  * <p> 
+  * "foo" and "bar", just as if the user had typed "-a -d foo bar".
+  * <p>
   * The user can force getopt() to stop scanning the command line with
   * the special argument "--" by itself.  Any elements occuring before the
   * "--" are scanned and permuted as normal.  Any elements after the "--"
-  * are returned as is as non-option argv elements.  For example, 
-  * "foo -a -- bar -d" would return  option 'a' then -1.  optind would point 
+  * are returned as is as non-option argv elements.  For example,
+  * "foo -a -- bar -d" would return  option 'a' then -1.  optind would point
   * to "foo", "bar" and "-d" as the non-option argv elements.  The "--"
   * is discarded by getopt().
   * <p>
@@ -174,13 +174,13 @@ import java.util.Map;
   * then point to "bar" as the first non-option argv element.  The "--"
   * is discarded.
   * <p>
-  * The POSIX/traditional behavior is enabled by either setting the 
+  * The POSIX/traditional behavior is enabled by either setting the
   * property "gnu.posixly_correct" or by putting a '+' sign as the first
-  * character of the option string.  The difference between the two 
+  * character of the option string.  The difference between the two
   * methods is that setting the gnu.posixly_correct property also forces
   * certain error messages to be displayed in POSIX format.  To enable
   * the "return in order" functionality, put a '-' as the first character
-  * of the option string.  Note that after determining the proper 
+  * of the option string.  Note that after determining the proper
   * behavior, Getopt strips this leading '+' or '-', meaning that a ':'
   * placed as the second character after one of those two will still cause
   * getopt() to return a ':' instead of a '?' if a required option
@@ -190,9 +190,9 @@ import java.util.Map;
   * supports long options.  These are preceeded by a "--" sequence and
   * can be as long as desired.  Long options provide a more user-friendly
   * way of entering command line options.  For example, in addition to a
-  * "-h" for help, a program could support also "--help".  
+  * "-h" for help, a program could support also "--help".
   * <p>
-  * Like short options, long options can also take a required or non-required 
+  * Like short options, long options can also take a required or non-required
   * argument.  Required arguments can either be specified by placing an
   * equals sign after the option name, then the argument, or by putting the
   * argument in the next argv element.  For example: "--outputdir=foo" and
@@ -204,14 +204,14 @@ import java.util.Map;
   * "foo" while "--outputdir foo" would represent the option outputdir
   * with no argument and a first non-option argv element of "foo".
   * <p>
-  * Long options can also be specified using a special POSIX argument 
-  * format (one that I highly discourage).  This form of entry is 
+  * Long options can also be specified using a special POSIX argument
+  * format (one that I highly discourage).  This form of entry is
   * enabled by placing a "W;" (yes, 'W' then a semi-colon) in the valid
   * option string.  This causes getopt to treat the name following the
   * "-W" as the name of the long option.  For example, "-W outputdir=foo"
   * would be equivalent to "--outputdir=foo".  The name can immediately
   * follow the "-W" like so: "-Woutputdir=foo".  Option arguments are
-  * handled identically to normal long options.  If a string follows the 
+  * handled identically to normal long options.  If a string follows the
   * "-W" that does not represent a valid long option, then getopt() returns
   * 'W' and the caller must decide what to do.  Otherwise getopt() returns
   * a long option value as described below.
@@ -220,9 +220,9 @@ import java.util.Map;
   * in full.  So it is permissible to abbreviate the option name to as
   * few characters as required to uniquely identify it.  If the name can
   * represent multiple long options, then an error message is printed and
-  * getopt() returns a '?'.  
+  * getopt() returns a '?'.
   * <p>
-  * If an invalid option is specified or a required option argument is 
+  * If an invalid option is specified or a required option argument is
   * missing, getopt() prints an error and returns a '?' or ':' exactly
   * as for short options.  Note that when an invalid long option is
   * encountered, the optopt variable is set to integer 0 and so cannot
@@ -241,7 +241,7 @@ import java.util.Map;
   * getopt() method will throw a NullPointerException.
   * <p>
   * When getopt() is called and a long option is encountered, one of two
-  * things can be returned.  If the flag field in the LongOpt object 
+  * things can be returned.  If the flag field in the LongOpt object
   * representing the long option is non-null, then the integer value field
   * is stored there and an integer 0 is returned to the caller.  The val
   * field can then be retrieved from the flag field.  Note that since the
@@ -249,14 +249,14 @@ import java.util.Map;
   * must be performed in order to get the actual int value stored there.
   * If the flag field in the LongOpt object is null, then the value field
   * of the LongOpt is returned.  This can be the character of a short option.
-  * This allows an app to have both a long and short option sequence 
+  * This allows an app to have both a long and short option sequence
   * (say, "-h" and "--help") that do the exact same thing.
   * <p>
-  * With long options, there is an alternative method of determining 
+  * With long options, there is an alternative method of determining
   * which option was selected.  The method getLongind() will return the
   * the index in the long option array (NOT argv) of the long option found.
   * So if multiple long options are configured to return the same value,
-  * the application can use getLongind() to distinguish between them. 
+  * the application can use getLongind() to distinguish between them.
   * <p>
   * Here is an expanded Getopt example using long options and various
   * techniques described above:
@@ -265,12 +265,12 @@ import java.util.Map;
   * int c;
   * String arg;
   * LongOpt[] longopts = new LongOpt[3];
-  * // 
+  * //
   * StringBuffer sb = new StringBuffer();
   * longopts[0] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h');
-  * longopts[1] = new LongOpt("outputdir", LongOpt.REQUIRED_ARGUMENT, sb, 'o'); 
+  * longopts[1] = new LongOpt("outputdir", LongOpt.REQUIRED_ARGUMENT, sb, 'o');
   * longopts[2] = new LongOpt("maximum", LongOpt.OPTIONAL_ARGUMENT, null, 2);
-  * // 
+  * //
   * Getopt g = new Getopt("testprog", argv, "-:bc::d:hW;", longopts);
   * g.setOpterr(false); // We'll do our own error handling
   * //
@@ -296,7 +296,7 @@ import java.util.Map;
   *          System.out.println("I know this, but pretend I didn't");
   *          System.out.println("We picked option " +
   *                             longopts[g.getLongind()].getName() +
-  *                           " with value " + 
+  *                           " with value " +
   *                           ((arg != null) ? arg : "null"));
   *          break;
   *          //
@@ -307,7 +307,7 @@ import java.util.Map;
   *        case 'c':
   *        case 'd':
   *          arg = g.getOptarg();
-  *          System.out.println("You picked option '" + (char)c + 
+  *          System.out.println("You picked option '" + (char)c +
   *                             "' with argument " +
   *                             ((arg != null) ? arg : "null"));
   *          break;
@@ -327,7 +327,7 @@ import java.util.Map;
   *          break;
   *          //
   *        case '?':
-  *          System.out.println("The option '" + (char)g.getOptopt() + 
+  *          System.out.println("The option '" + (char)g.getOptopt() +
   *                           "' is not valid");
   *          break;
   *          //
@@ -350,9 +350,9 @@ import java.util.Map;
   * the name given to this option - long_only - is very counter-intuitive.
   * It does not cause only long options to be parsed but instead enables
   * the behavior described above.
-  * <p> 
-  * Note that the functionality and variable names used are driven from 
-  * the C lib version as this object is a port of the C code, not a 
+  * <p>
+  * Note that the functionality and variable names used are driven from
+  * the C lib version as this object is a port of the C code, not a
   * new implementation.  This should aid in porting existing C/C++ code,
   * as well as helping programmers familiar with the glibc version to
   * adapt to the Java version even if it seems very non-Java at times.
@@ -382,11 +382,11 @@ public class Getopt extends Object
  * Class Variables
  */
 
-/** 
+/**
   * Describe how to deal with options that follow non-option ARGV-elements.
   *
   * If the caller did not specify anything,
-  * the default is REQUIRE_ORDER if the property 
+  * the default is REQUIRE_ORDER if the property
   * gnu.posixly_correct is defined, PERMUTE otherwise.
   *
   * The special argument `--' forces an end of option-scanning regardless
@@ -425,7 +425,7 @@ protected static final int RETURN_IN_ORDER = 3;
 /*
  * Instance Variables
  */
- 
+
 /**
   * For communication from `getopt' to the caller.
   * When `getopt' finds an option that takes an argument,
@@ -446,29 +446,29 @@ protected String optarg;
   *  non-option elements that the caller should itself scan.
   *
   *  Otherwise, `optind' communicates from one call to the next
-  *  how much of ARGV has been scanned so far.  
+  *  how much of ARGV has been scanned so far.
   */
 protected int optind = 0;
 
-/** 
+/**
   * Callers store false here to inhibit the error message
-  * for unrecognized options.  
+  * for unrecognized options.
   */
 protected boolean opterr = true;
 
-/** 
+/**
   * When an unrecognized option is encountered, getopt will return a '?'
   * and store the value of the invalid option here.
   */
 protected int optopt = '?';
 
-/** 
+/**
   * The next char to be scanned in the option-element
   * in which the last option character we returned was found.
   * This allows us to pick up the scan where we left off.
   *
   * If this is zero, or a null string, it means resume the scan
-  * by advancing to the next ARGV-element.  
+  * by advancing to the next ARGV-element.
   */
 protected String nextchar;
 
@@ -478,7 +478,7 @@ protected String nextchar;
 protected String optstring;
 
 /**
-  * This is an array of LongOpt objects which describ the valid long 
+  * This is an array of LongOpt objects which describ the valid long
   * options.
   */
 protected LongOpt[] long_options;
@@ -573,7 +573,7 @@ Getopt(String progname, String[] argv, String optstring)
   * @param long_options An array of LongOpt objects that describes the valid long args for this program
   */
 public
-Getopt(String progname, String[] argv, String optstring, 
+Getopt(String progname, String[] argv, String optstring,
        LongOpt[] long_options)
 {
   this(progname, argv, optstring, long_options, false);
@@ -611,7 +611,7 @@ static class OptI18n {
 /**
   * Construct a Getopt instance with given input data that is capable of
   * parsing long options and short options.  Contrary to what you might
-  * think, the flag 'long_only' does not determine whether or not we 
+  * think, the flag 'long_only' does not determine whether or not we
   * scan for only long arguments.  Instead, a value of true here allows
   * long arguments to start with a '-' instead of '--' unless there is a
   * conflict with a short option name.
@@ -623,7 +623,7 @@ static class OptI18n {
   * @param long_only true if long options that do not conflict with short options can start with a '-' as well as '--'
   */
 public
-Getopt(String progname, String[] argv, String optstring, 
+Getopt(String progname, String[] argv, String optstring,
        LongOpt[] long_options, boolean long_only)
 {
   if (optstring.length() == 0)
@@ -672,7 +672,7 @@ Getopt(String progname, String[] argv, String optstring,
 }
 
 /**************************************************************************/
- 
+
 /*
  * Instance Methods
  */
@@ -705,7 +705,7 @@ setOptstring(String optstring)
   * non-option elements that the caller should itself scan.
   *
   * Otherwise, `optind' communicates from one call to the next
-  * how much of ARGV has been scanned so far.  
+  * how much of ARGV has been scanned so far.
   */
 public int
 getOptind()
@@ -718,7 +718,7 @@ getOptind()
 /**
   * This method allows the optind index to be set manually.  Normally this
   * is not necessary (and incorrect usage of this method can lead to serious
-  * lossage), but optind is a public symbol in GNU getopt, so this method 
+  * lossage), but optind is a public symbol in GNU getopt, so this method
   * was added to allow it to be modified by the caller if desired.
   *
   * @param optind The new value of optind
@@ -748,7 +748,7 @@ setArgv(String[] argv)
 
 /**************************************************************************/
 
-/** 
+/**
   * For communication from `getopt' to the caller.
   * When `getopt' finds an option that takes an argument,
   * the argument value is returned here.
@@ -767,7 +767,7 @@ getOptarg()
 /**
   * Normally Getopt will print a message to the standard error when an
   * invalid option is encountered.  This can be suppressed (or re-enabled)
-  * by calling this method.  There is no get method for this variable 
+  * by calling this method.  There is no get method for this variable
   * because if you can't remember the state you set this to, why should I?
   */
 public void
@@ -822,18 +822,18 @@ exchange(String[] argv)
     {
       if (top - middle > middle - bottom)
         {
-          // Bottom segment is the short one. 
+          // Bottom segment is the short one.
           int len = middle - bottom;
           int i;
 
-          // Swap it with the top part of the top segment. 
+          // Swap it with the top part of the top segment.
           for (i = 0; i < len; i++)
             {
               tem = argv[bottom + i];
               argv[bottom + i] = argv[top - (middle - bottom) + i];
               argv[top - (middle - bottom) + i] = tem;
             }
-          // Exclude the moved bottom segment from further swapping. 
+          // Exclude the moved bottom segment from further swapping.
           top -= len;
         }
       else
@@ -842,19 +842,19 @@ exchange(String[] argv)
           int len = top - middle;
           int i;
 
-          // Swap it with the bottom part of the bottom segment. 
+          // Swap it with the bottom part of the bottom segment.
           for (i = 0; i < len; i++)
             {
               tem = argv[bottom + i];
               argv[bottom + i] = argv[middle + i];
               argv[middle + i] = tem;
             }
-          // Exclude the moved top segment from further swapping. 
+          // Exclude the moved top segment from further swapping.
           bottom += len;
         }
     }
 
-  // Update records for the slots the non-options now occupy. 
+  // Update records for the slots the non-options now occupy.
 
   first_nonopt += (optind - last_nonopt);
   last_nonopt = optind;
@@ -878,7 +878,7 @@ checkLongOption()
   int nameend;
   boolean ambig;
   boolean exact;
-  
+
   longopt_handled = true;
   ambig = false;
   exact = false;
@@ -887,7 +887,7 @@ checkLongOption()
   nameend = nextchar.indexOf("=");
   if (nameend == -1)
     nameend = nextchar.length();
-  
+
   // Test all lnog options for either exact match or abbreviated matches
   for (int i = 0; i < long_options.length; i++)
     {
@@ -914,7 +914,7 @@ checkLongOption()
             }
         }
     } // for
-  
+
   // Print out an error if the option specified was ambiguous
   if (ambig && !exact)
     {
@@ -922,21 +922,21 @@ checkLongOption()
         {
           Object[] msgArgs = { progname, argv[optind] };
           System.err.println(MessageFormat.format(
-                             _messages.getString("getopt.ambigious"), 
+                             _messages.getString("getopt.ambigious"),
                              msgArgs));
         }
 
        nextchar = "";
        optopt = 0;
        ++optind;
- 
+
        return('?');
     }
- 
+
   if (pfound != null)
     {
       ++optind;
- 
+
       if (nameend != nextchar.length())
         {
           if (pfound.has_arg != LongOpt.NO_ARGUMENT)
@@ -955,24 +955,24 @@ checkLongOption()
                     {
                       Object[] msgArgs = { progname, pfound.name };
                       System.err.println(MessageFormat.format(
-                                  _messages.getString("getopt.arguments1"), 
+                                  _messages.getString("getopt.arguments1"),
                                   msgArgs));
                     }
                   // +option or -option
                   else
                     {
-                      Object[] msgArgs = { progname, new 
-                               Character(argv[optind-1].charAt(0)).toString(),
+                      Object[] msgArgs = { progname,
+                               Character.toString(argv[optind-1].charAt(0)),
                                pfound.name };
                       System.err.println(MessageFormat.format(
-                               _messages.getString("getopt.arguments2"), 
+                               _messages.getString("getopt.arguments2"),
                                msgArgs));
                     }
                  }
-   
+
               nextchar = "";
               optopt = pfound.val;
-   
+
               return('?');
             }
         } // if (nameend)
@@ -989,10 +989,10 @@ checkLongOption()
                 {
                   Object[] msgArgs = { progname, argv[optind-1] };
                   System.err.println(MessageFormat.format(
-                                     _messages.getString("getopt.requires"), 
+                                     _messages.getString("getopt.requires"),
                                      msgArgs));
                 }
-   
+
               nextchar = "";
               optopt = pfound.val;
               if (optstring.charAt(0) == ':')
@@ -1001,20 +1001,20 @@ checkLongOption()
                 return('?');
             }
         } // else if (pfound)
-   
+
       nextchar = "";
 
       if (pfound.flag != null)
         {
           pfound.flag.setLength(0);
           pfound.flag.append(pfound.val);
-   
+
           return(0);
         }
 
       return(pfound.val);
    } // if (pfound != null)
-  
+
   longopt_handled = false;
 
   return(0);
@@ -1069,7 +1069,7 @@ getopt()
             {
               optind++;
             }
-          
+
           last_nonopt = optind;
         }
 
@@ -1105,7 +1105,7 @@ getopt()
 
       // If we have come to a non-option and did not permute it,
       // either stop the scan or describe it to the caller and pass it by.
-      if (argv[optind].equals("") || (argv[optind].charAt(0) != '-') || 
+      if (argv[optind].equals("") || (argv[optind].charAt(0) != '-') ||
           argv[optind].equals("-"))
         {
           if (ordering == REQUIRE_ORDER)
@@ -1114,7 +1114,7 @@ getopt()
             optarg = argv[optind++];
             return(1);
         }
-      
+
       // We have found another option-ARGV-element.
       // Skip the initial punctuation.
       if (argv[optind].startsWith("--"))
@@ -1138,14 +1138,14 @@ getopt()
 
      This distinction seems to be the most useful approach.  */
   if ((long_options != null) && (argv[optind].startsWith("--")
-      || (long_only && ((argv[optind].length()  > 2) || 
+      || (long_only && ((argv[optind].length()  > 2) ||
       (optstring.indexOf(argv[optind].charAt(1)) == -1)))))
     {
        int c = checkLongOption();
 
        if (longopt_handled)
          return(c);
-         
+
       // Can't find it as a long option.  If this is not getopt_long_only,
       // or the option starts with '--' or is not a valid short
       // option, then it's an error.
@@ -1159,16 +1159,16 @@ getopt()
                 {
                   Object[] msgArgs = { progname, nextchar };
                   System.err.println(MessageFormat.format(
-                                   _messages.getString("getopt.unrecognized"), 
+                                   _messages.getString("getopt.unrecognized"),
                                    msgArgs));
                 }
               else
                 {
-                  Object[] msgArgs = { progname, new 
-                                 Character(argv[optind].charAt(0)).toString(), 
+                  Object[] msgArgs = { progname,
+                                 Character.toString(argv[optind].charAt(0)),
                                  nextchar };
                   System.err.println(MessageFormat.format(
-                                 _messages.getString("getopt.unrecognized2"), 
+                                 _messages.getString("getopt.unrecognized2"),
                                  msgArgs));
                 }
             }
@@ -1176,7 +1176,7 @@ getopt()
           nextchar = "";
           ++optind;
           optopt = 0;
-    
+
           return('?');
         }
     } // if (longopts)
@@ -1187,7 +1187,7 @@ getopt()
     nextchar = nextchar.substring(1);
   else
     nextchar = "";
-  
+
   String temp = null;
   if (optstring.indexOf(c) != -1)
     temp = optstring.substring(optstring.indexOf(c));
@@ -1202,15 +1202,15 @@ getopt()
           if (posixly_correct)
             {
               // 1003.2 specifies the format of this message
-              Object[] msgArgs = { progname, new 
-                                   Character((char)c).toString() };
+              Object[] msgArgs = { progname,
+                                   Character.toString((char)c) };
               System.err.println(MessageFormat.format(
                             _messages.getString("getopt.illegal"), msgArgs));
             }
           else
             {
-              Object[] msgArgs = { progname, new 
-                                   Character((char)c).toString() };
+              Object[] msgArgs = { progname,
+                                   Character.toString((char)c) };
               System.err.println(MessageFormat.format(
                             _messages.getString("getopt.invalid"), msgArgs));
             }
@@ -1233,9 +1233,9 @@ getopt()
         {
           if (opterr)
             {
-              // 1003.2 specifies the format of this message. 
-              Object[] msgArgs = { progname, new 
-                                   Character((char)c).toString() };
+              // 1003.2 specifies the format of this message.
+              Object[] msgArgs = { progname,
+                                   Character.toString((char)c) };
               System.err.println(MessageFormat.format(
                             _messages.getString("getopt.requires2"), msgArgs));
             }
@@ -1249,7 +1249,7 @@ getopt()
       else
         {
           // We already incremented `optind' once;
-          // increment it again when taking next ARGV-elt as argument. 
+          // increment it again when taking next ARGV-elt as argument.
           nextchar = argv[optind];
           optarg  = argv[optind];
         }
@@ -1296,14 +1296,14 @@ getopt()
               if (opterr)
                 {
                   // 1003.2 specifies the format of this message
-                  Object[] msgArgs = { progname, new 
-                                       Character((char)c).toString() };
+                  Object[] msgArgs = { progname,
+                                       Character.toString((char)c) };
                   System.err.println(MessageFormat.format(
                             _messages.getString("getopt.requires2"), msgArgs));
                 }
 
               optopt = c;
- 
+
               if (optstring.charAt(0) == ':')
                 return(':');
               else
@@ -1326,14 +1326,14 @@ getopt()
                       if (opterr)
                         {
                           // 1003.2 specifies the format of this message
-                          Object[] msgArgs = { progname, new 
-                                               Character((char)c).toString() };
+                          Object[] msgArgs = { progname,
+                                               Character.toString((char)c) };
                           System.err.println(MessageFormat.format(
                              _messages.getString("getopt.requires2"), msgArgs));
                         }
 
                       optopt = c;
- 
+
                       if (optstring.charAt(0) == ':')
                         return(':');
                       else
diff --git a/src/gnu/getopt/LongOpt.java b/src/gnu/getopt/LongOpt.java
index 837ac49..d804e08 100644
--- a/src/gnu/getopt/LongOpt.java
+++ b/src/gnu/getopt/LongOpt.java
@@ -4,7 +4,7 @@
 /* Copyright (c) 1998 by Aaron M. Renn (arenn at urbanophile.com)
 /*
 /* This program is free software; you can redistribute it and/or modify
-/* it under the terms of the GNU Library General Public License as published 
+/* it under the terms of the GNU Library General Public License as published
 /* by  the Free Software Foundation; either version 2 of the License or
 /* (at your option) any later version.
 /*
@@ -14,15 +14,13 @@
 /* GNU Library General Public License for more details.
 /*
 /* You should have received a copy of the GNU Library General Public License
-/* along with this program; see the file COPYING.LIB.  If not, write to 
-/* the Free Software Foundation Inc., 59 Temple Place - Suite 330, 
+/* along with this program; see the file COPYING.LIB.  If not, write to
+/* the Free Software Foundation Inc., 59 Temple Place - Suite 330,
 /* Boston, MA  02111-1307 USA
 /**************************************************************************/
 
 package gnu.getopt;
 
-import java.util.Locale;
-import java.util.ResourceBundle;
 import java.text.MessageFormat;
 
 /**************************************************************************/
@@ -33,7 +31,7 @@ import java.text.MessageFormat;
   * object to define the list of valid long options for a given parsing
   * session.  Refer to the getopt documentation for details on the
   * format of long options.
-  * 
+  *
   * @version 1.0.5
   * @author Aaron M. Renn (arenn at urbanophile.com)
   *
@@ -54,7 +52,7 @@ public class LongOpt extends Object
   */
 public static final int NO_ARGUMENT = 0;
 
-/** 
+/**
   * Constant value used for the "has_arg" constructor argument.  This
   * value indicates that the option takes an argument that is required.
   */
@@ -115,18 +113,18 @@ private Getopt.OptI18n _messages = new Getopt.OptI18n(); // ResourceBundle.getBu
   * @param has_arg Indicates whether the option has no argument (NO_ARGUMENT), a required argument (REQUIRED_ARGUMENT) or an optional argument (OPTIONAL_ARGUMENT).
   * @param flag If non-null, this is a location to store the value of "val" when this option is encountered, otherwise "val" is treated as the equivalent short option character.
   * @param val The value to return for this long option, or the equivalent single letter option to emulate if flag is null.
-  * 
+  *
   * @exception IllegalArgumentException If the has_arg param is not one of NO_ARGUMENT, REQUIRED_ARGUMENT or OPTIONAL_ARGUMENT.
   */
 public
-LongOpt(String name, int has_arg, 
+LongOpt(String name, int has_arg,
         StringBuffer flag, int val) throws IllegalArgumentException
 {
   // Validate has_arg
-  if ((has_arg != NO_ARGUMENT) && (has_arg != REQUIRED_ARGUMENT) 
+  if ((has_arg != NO_ARGUMENT) && (has_arg != REQUIRED_ARGUMENT)
      && (has_arg != OPTIONAL_ARGUMENT))
     {
-      Object[] msgArgs = { new Integer(has_arg).toString() };
+      Object[] msgArgs = { Integer.toString(has_arg) };
       throw new IllegalArgumentException(MessageFormat.format(
                     _messages.getString("getopt.invalidValue"), msgArgs));
     }
diff --git a/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java b/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
index 5db1c48..f7af8b5 100644
--- a/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
+++ b/src/org/apache/commons/jcs/auxiliary/disk/block/BlockDiskCache.java
@@ -29,6 +29,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
@@ -82,6 +83,8 @@ public class BlockDiskCache<K, V>
      */
     private final ReentrantReadWriteLock storageLock = new ReentrantReadWriteLock();
 
+    private ScheduledFuture<?> future;
+
     /**
      * Constructs the BlockDisk after setting up the root directory.
      * <p>
@@ -167,7 +170,7 @@ public class BlockDiskCache<K, V>
         // TODO we might need to stagger this a bit.
         if ( this.blockDiskCacheAttributes.getKeyPersistenceIntervalSeconds() > 0 )
         {
-            scheduledExecutor.scheduleAtFixedRate(
+            future = scheduledExecutor.scheduleAtFixedRate(
                     new Runnable()
                     {
                         @Override
@@ -585,6 +588,11 @@ public class BlockDiskCache<K, V>
             setAlive(false);
             this.keyStore.saveKeys();
 
+            if (future != null)
+            {
+                future.cancel(true);
+            }
+
             try
             {
                 if ( log.isDebugEnabled() )
diff --git a/src/org/apache/commons/jcs/engine/control/CompositeCache.java b/src/org/apache/commons/jcs/engine/control/CompositeCache.java
index 4596a3a..f1a8c8a 100644
--- a/src/org/apache/commons/jcs/engine/control/CompositeCache.java
+++ b/src/org/apache/commons/jcs/engine/control/CompositeCache.java
@@ -27,6 +27,7 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -119,6 +120,8 @@ public class CompositeCache<K, V>
     /** Key matcher used by the getMatching API */
     private IKeyMatcher<K> keyMatcher = new KeyMatcherPatternImpl<K>();
 
+    private ScheduledFuture<?> future;
+
     /**
      * Constructor for the Cache object
      * <p>
@@ -163,7 +166,7 @@ public class CompositeCache<K, V>
     {
         if ( cacheAttr.isUseMemoryShrinker() )
         {
-            scheduledExecutor.scheduleAtFixedRate(
+            future = scheduledExecutor.scheduleAtFixedRate(
                     new ShrinkerThread<K, V>(this), 0, cacheAttr.getShrinkerIntervalSeconds(),
                     TimeUnit.SECONDS);
         }
@@ -1296,6 +1299,12 @@ public class CompositeCache<K, V>
 
         synchronized (this)
         {
+            // Try to stop shrinker thread
+            if (future != null)
+            {
+                future.cancel(true);
+            }
+
             // Now, shut down the event queue
             if (elementEventQ != null)
             {
diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index 324ea53..ac883f4 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -34,6 +34,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -85,12 +86,12 @@ import org.openstreetmap.josm.gui.MainApplication.Option;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrameListener;
-import org.openstreetmap.josm.gui.MapView;
 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;
 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.layer.OsmDataLayer.CommandQueueListener;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
@@ -105,6 +106,8 @@ import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.FileWatcher;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmApiInitializationException;
+import org.openstreetmap.josm.io.OsmTransferCanceledException;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.I18n;
@@ -140,6 +143,8 @@ public abstract class Main {
     /**
      * Replies true if JOSM currently displays a map view. False, if it doesn't, i.e. if
      * it only shows the MOTD panel.
+     * <p>
+     * You do not need this when accessing the layer manager. The layer manager will be empty if no map view is shown.
      *
      * @return <code>true</code> if JOSM currently displays a map view
      */
@@ -186,10 +191,18 @@ 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.
      */
     public static MapFrame map;
 
     /**
+     * Provides access to the layers displayed in the main view.
+     * @since 10271
+     */
+    private static final MainLayerManager layerManager = new MainLayerManager();
+
+    /**
      * The toolbar preference control to register new actions.
      */
     public static volatile ToolbarPreferences toolbar;
@@ -527,8 +540,8 @@ public abstract class Main {
      */
     public final synchronized void removeLayer(final Layer layer) {
         if (map != null) {
-            map.mapView.removeLayer(layer);
-            if (isDisplayingMapView() && map.mapView.getAllLayers().isEmpty()) {
+            getLayerManager().removeLayer(layer);
+            if (isDisplayingMapView() && getLayerManager().getLayers().isEmpty()) {
                 setMapFrame(null);
             }
         }
@@ -593,7 +606,7 @@ public abstract class Main {
                 // if it goes wrong that's not critical at this stage.
                 try {
                     OsmApi.getOsmApi().initialize(null, true);
-                } catch (Exception e) {
+                } catch (OsmTransferCanceledException | OsmApiInitializationException e) {
                     Main.warn(getErrorMessage(Utils.getRootCause(e)));
                 }
             }
@@ -604,7 +617,7 @@ public abstract class Main {
             @Override
             public void initialize() {
                 validator = new OsmValidator();
-                MapView.addLayerChangeListener(validator);
+                getLayerManager().addLayerChangeListener(validator);
             }
         });
 
@@ -639,7 +652,7 @@ public abstract class Main {
                 i.get();
             }
             service.shutdown();
-        } catch (Exception ex) {
+        } catch (InterruptedException | ExecutionException ex) {
             throw new RuntimeException(ex);
         }
 
@@ -726,6 +739,15 @@ public abstract class Main {
     }
 
     /**
+     * Returns the main layer manager that is used by the map view.
+     * @return The layer manager. The value returned will never change.
+     * @since 10279
+     */
+    public static MainLayerManager getLayerManager() {
+        return layerManager;
+    }
+
+    /**
      * Add a new layer to the map.
      *
      * If no map exists, create one.
@@ -769,7 +791,7 @@ public abstract class Main {
             createMapFrame(layer, viewport);
         }
         layer.hookUpMapView();
-        map.mapView.addLayer(layer);
+        getLayerManager().addLayer(layer);
         if (noMap) {
             Main.map.setVisible(true);
         } else if (viewport != null) {
@@ -809,7 +831,7 @@ public abstract class Main {
      */
     public OsmDataLayer getEditLayer() {
         if (!isDisplayingMapView()) return null;
-        return map.mapView.getEditLayer();
+        return getLayerManager().getEditLayer();
     }
 
     /**
@@ -848,7 +870,7 @@ public abstract class Main {
      */
     public Layer getActiveLayer() {
         if (!isDisplayingMapView()) return null;
-        return map.mapView.getActiveLayer();
+        return getLayerManager().getActiveLayer();
     }
 
     protected static final JPanel contentPanePrivate = new JPanel(new BorderLayout());
@@ -932,45 +954,46 @@ public abstract class Main {
     public static void preConstructorInit(Map<Option, Collection<String>> args) {
         ProjectionPreference.setProjection();
 
+        String defaultlaf = platform.getDefaultStyle();
+        String laf = Main.pref.get("laf", defaultlaf);
         try {
-            String defaultlaf = platform.getDefaultStyle();
-            String laf = Main.pref.get("laf", defaultlaf);
-            try {
-                UIManager.setLookAndFeel(laf);
-            } catch (final NoClassDefFoundError | ClassNotFoundException e) {
-                // Try to find look and feel in plugin classloaders
-                Class<?> klass = null;
-                for (ClassLoader cl : PluginHandler.getResourceClassLoaders()) {
-                    try {
-                        klass = cl.loadClass(laf);
-                        break;
-                    } catch (ClassNotFoundException ex) {
-                        // Do nothing
-                        if (Main.isTraceEnabled()) {
-                            Main.trace(ex.getMessage());
-                        }
+            UIManager.setLookAndFeel(laf);
+        } catch (final NoClassDefFoundError | ClassNotFoundException e) {
+            // Try to find look and feel in plugin classloaders
+            Class<?> klass = null;
+            for (ClassLoader cl : PluginHandler.getResourceClassLoaders()) {
+                try {
+                    klass = cl.loadClass(laf);
+                    break;
+                } catch (ClassNotFoundException ex) {
+                    if (Main.isTraceEnabled()) {
+                        Main.trace(ex.getMessage());
                     }
                 }
-                if (klass != null && LookAndFeel.class.isAssignableFrom(klass)) {
-                    try {
-                        UIManager.setLookAndFeel((LookAndFeel) klass.newInstance());
-                    } catch (Exception ex) {
-                        warn("Cannot set Look and Feel: " + laf + ": "+ex.getMessage());
-                    }
-                } else {
-                    info("Look and Feel not found: " + laf);
+            }
+            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());
+                } catch (UnsupportedLookAndFeelException ex) {
+                    info("Look and Feel not supported: " + laf);
                     Main.pref.put("laf", defaultlaf);
                 }
-            } catch (final UnsupportedLookAndFeelException e) {
-                info("Look and Feel not supported: " + laf);
+            } else {
+                info("Look and Feel not found: " + laf);
                 Main.pref.put("laf", defaultlaf);
             }
-            toolbar = new ToolbarPreferences();
-            contentPanePrivate.updateUI();
-            panel.updateUI();
-        } catch (final Exception e) {
+        } catch (UnsupportedLookAndFeelException e) {
+            info("Look and Feel not supported: " + laf);
+            Main.pref.put("laf", defaultlaf);
+        } catch (InstantiationException | IllegalAccessException e) {
             error(e);
         }
+        toolbar = new ToolbarPreferences();
+        contentPanePrivate.updateUI();
+        panel.updateUI();
+
         UIManager.put("OptionPane.okIcon", ImageProvider.get("ok"));
         UIManager.put("OptionPane.yesIcon", UIManager.get("OptionPane.okIcon"));
         UIManager.put("OptionPane.cancelIcon", ImageProvider.get("cancel"));
@@ -1028,7 +1051,7 @@ public abstract class Main {
      */
     public static boolean saveUnsavedModifications() {
         if (!isDisplayingMapView()) return true;
-        return saveUnsavedModifications(map.mapView.getLayersOfType(AbstractModifiableLayer.class), true);
+        return saveUnsavedModifications(getLayerManager().getLayersOfType(AbstractModifiableLayer.class), true);
     }
 
     /**
@@ -1095,7 +1118,7 @@ public abstract class Main {
             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<>(Main.map.mapView.getAllLayers());
+                Collection<Layer> layers = new ArrayList<>(getLayerManager().getLayers());
                 for (Layer l: layers) {
                     Main.main.removeLayer(l);
                 }
diff --git a/src/org/openstreetmap/josm/actions/AboutAction.java b/src/org/openstreetmap/josm/actions/AboutAction.java
index 5650ac2..0f29a57 100644
--- a/src/org/openstreetmap/josm/actions/AboutAction.java
+++ b/src/org/openstreetmap/josm/actions/AboutAction.java
@@ -41,7 +41,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * @author imi
  */
-public class AboutAction extends JosmAction {
+public final class AboutAction extends JosmAction {
 
     /**
      * Constructs a new {@code AboutAction}.
@@ -129,13 +129,12 @@ public class AboutAction extends JosmAction {
         if (is == null) {
             displayErrorMessage(ta, tr("Failed to locate resource ''{0}''.", filePath));
         } else {
-            try {
-                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+            try (InputStreamReader reader = new InputStreamReader(is, "UTF-8");
+                 BufferedReader br = new BufferedReader(reader)) {
                 String line;
                 while ((line = br.readLine()) != null) {
                     ta.append(line+'\n');
                 }
-                br.close();
             } catch (IOException e) {
                 Main.warn(e);
                 displayErrorMessage(ta, tr("Failed to load resource ''{0}'', error is {1}.", filePath, e.toString()));
diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
index 331042c..9d20e99 100644
--- a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
+++ b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
@@ -53,25 +53,21 @@ public class AddImageryLayerAction extends JosmAction implements AdaptableAction
         installAdapters();
 
         // change toolbar icon from if specified
-        try {
-            String icon = info.getIcon();
-            if (icon != null) {
-                new ImageProvider(icon).setOptional(true).getInBackground(new ImageResourceCallback() {
-                            @Override
-                            public void finished(final ImageResource result) {
-                                if (result != null) {
-                                    GuiHelper.runInEDT(new Runnable() {
-                                        @Override
-                                        public void run() {
-                                            result.getImageIcon(AddImageryLayerAction.this);
-                                        }
-                                    });
-                                }
+        String icon = info.getIcon();
+        if (icon != null) {
+            new ImageProvider(icon).setOptional(true).getInBackground(new ImageResourceCallback() {
+                        @Override
+                        public void finished(final ImageResource result) {
+                            if (result != null) {
+                                GuiHelper.runInEDT(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        result.getImageIcon(AddImageryLayerAction.this);
+                                    }
+                                });
                             }
-                        });
-            }
-        } catch (Exception ex) {
-            throw new RuntimeException(ex.getMessage(), ex);
+                        }
+                    });
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/AutoScaleAction.java b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
index 4e9c739..30798cb 100644
--- a/src/org/openstreetmap/josm/actions/AutoScaleAction.java
+++ b/src/org/openstreetmap/josm/actions/AutoScaleAction.java
@@ -233,87 +233,107 @@ public class AutoScaleAction extends JosmAction {
 
         switch (mode) {
         case "problem":
-            TestError error = Main.map.validatorDialog.getSelectedError();
-            if (error == null)
-                return null;
-            ((ValidatorBoundingXYVisitor) v).visit(error);
-            if (v.getBounds() == null)
-                return null;
-            v.enlargeBoundingBox(Main.pref.getDouble("validator.zoom-enlarge-bbox", 0.0002));
-            break;
+            return modeProblem(v);
         case "data":
-            for (Layer l : Main.map.mapView.getAllLayers()) {
-                l.visitBoundingBox(v);
-            }
-            break;
+            return modeData(v);
         case "layer":
-            // try to zoom to the first selected layer
-            Layer l = getFirstSelectedLayer();
-            if (l == null)
-                return null;
-            l.visitBoundingBox(v);
-            break;
+            return modeLayer(v);
         case "selection":
         case "conflict":
-            Collection<OsmPrimitive> sel = new HashSet<>();
-            if ("selection".equals(mode)) {
-                sel = getCurrentDataSet().getSelected();
-            } else {
-                Conflict<? extends OsmPrimitive> c = Main.map.conflictDialog.getSelectedConflict();
-                if (c != null) {
-                    sel.add(c.getMy());
-                } else if (Main.map.conflictDialog.getConflicts() != null) {
-                    sel = Main.map.conflictDialog.getConflicts().getMyConflictParties();
-                }
-            }
-            if (sel.isEmpty()) {
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        "selection".equals(mode) ? tr("Nothing selected to zoom to.") : tr("No conflicts to zoom to"),
-                        tr("Information"),
-                        JOptionPane.INFORMATION_MESSAGE);
-                return null;
-            }
-            for (OsmPrimitive osm : sel) {
-                osm.accept(v);
-            }
-
-            // Increase the bounding box by up to 100% to give more context.
-            v.enlargeBoundingBoxLogarithmically(100);
-            // Make the bounding box at least 100 meter wide to
-            // ensure reasonable zoom level when zooming onto single nodes.
-            v.enlargeToMinSize(Main.pref.getDouble("zoom_to_selection_min_size_in_meter", 100));
-            break;
+            return modeSelectionOrConflict(v);
         case "download":
+            return modeDownload(v);
+        default:
+            return v;
+        }
+    }
 
-            if (lastZoomTime > 0 && System.currentTimeMillis() - lastZoomTime > Main.pref.getLong("zoom.bounds.reset.time", 10*1000)) {
-                lastZoomTime = -1;
+    private static BoundingXYVisitor modeProblem(BoundingXYVisitor v) {
+        TestError error = Main.map.validatorDialog.getSelectedError();
+        if (error == null)
+            return null;
+        ((ValidatorBoundingXYVisitor) v).visit(error);
+        if (v.getBounds() == null)
+            return null;
+        v.enlargeBoundingBox(Main.pref.getDouble("validator.zoom-enlarge-bbox", 0.0002));
+        return v;
+    }
+
+    private static BoundingXYVisitor modeData(BoundingXYVisitor v) {
+        for (Layer l : Main.map.mapView.getAllLayers()) {
+            l.visitBoundingBox(v);
+        }
+        return v;
+    }
+
+    private BoundingXYVisitor modeLayer(BoundingXYVisitor v) {
+        // try to zoom to the first selected layer
+        Layer l = getFirstSelectedLayer();
+        if (l == null)
+            return null;
+        l.visitBoundingBox(v);
+        return v;
+    }
+
+    private BoundingXYVisitor modeSelectionOrConflict(BoundingXYVisitor v) {
+        Collection<OsmPrimitive> sel = new HashSet<>();
+        if ("selection".equals(mode)) {
+            sel = getCurrentDataSet().getSelected();
+        } else {
+            Conflict<? extends OsmPrimitive> c = Main.map.conflictDialog.getSelectedConflict();
+            if (c != null) {
+                sel.add(c.getMy());
+            } else if (Main.map.conflictDialog.getConflicts() != null) {
+                sel = Main.map.conflictDialog.getConflicts().getMyConflictParties();
             }
-            final DataSet dataset = getCurrentDataSet();
-            if (dataset != null) {
-                List<DataSource> dataSources = new ArrayList<>(dataset.getDataSources());
-                int s = dataSources.size();
-                if (s > 0) {
-                    if (lastZoomTime == -1 || lastZoomArea == -1 || lastZoomArea > s) {
-                        lastZoomArea = s-1;
-                        v.visit(dataSources.get(lastZoomArea).bounds);
-                    } else if (lastZoomArea > 0) {
-                        lastZoomArea -= 1;
-                        v.visit(dataSources.get(lastZoomArea).bounds);
-                    } else {
-                        lastZoomArea = -1;
-                        Area sourceArea = Main.main.getCurrentDataSet().getDataSourceArea();
-                        if (sourceArea != null) {
-                            v.visit(new Bounds(sourceArea.getBounds2D()));
-                        }
-                    }
-                    lastZoomTime = System.currentTimeMillis();
+        }
+        if (sel.isEmpty()) {
+            JOptionPane.showMessageDialog(
+                    Main.parent,
+                    "selection".equals(mode) ? tr("Nothing selected to zoom to.") : tr("No conflicts to zoom to"),
+                    tr("Information"),
+                    JOptionPane.INFORMATION_MESSAGE);
+            return null;
+        }
+        for (OsmPrimitive osm : sel) {
+            osm.accept(v);
+        }
+
+        // Increase the bounding box by up to 100% to give more context.
+        v.enlargeBoundingBoxLogarithmically(100);
+        // Make the bounding box at least 100 meter wide to
+        // ensure reasonable zoom level when zooming onto single nodes.
+        v.enlargeToMinSize(Main.pref.getDouble("zoom_to_selection_min_size_in_meter", 100));
+        return v;
+    }
+
+    private BoundingXYVisitor modeDownload(BoundingXYVisitor v) {
+        if (lastZoomTime > 0 && System.currentTimeMillis() - lastZoomTime > Main.pref.getLong("zoom.bounds.reset.time", 10L*1000L)) {
+            lastZoomTime = -1;
+        }
+        final DataSet dataset = getCurrentDataSet();
+        if (dataset != null) {
+            List<DataSource> dataSources = new ArrayList<>(dataset.getDataSources());
+            int s = dataSources.size();
+            if (s > 0) {
+                if (lastZoomTime == -1 || lastZoomArea == -1 || lastZoomArea > s) {
+                    lastZoomArea = s-1;
+                    v.visit(dataSources.get(lastZoomArea).bounds);
+                } else if (lastZoomArea > 0) {
+                    lastZoomArea -= 1;
+                    v.visit(dataSources.get(lastZoomArea).bounds);
                 } else {
-                    lastZoomTime = -1;
                     lastZoomArea = -1;
+                    Area sourceArea = Main.main.getCurrentDataSet().getDataSourceArea();
+                    if (sourceArea != null) {
+                        v.visit(new Bounds(sourceArea.getBounds2D()));
+                    }
                 }
+                lastZoomTime = System.currentTimeMillis();
+            } else {
+                lastZoomTime = -1;
+                lastZoomArea = -1;
             }
-            break;
         }
         return v;
     }
diff --git a/src/org/openstreetmap/josm/actions/CloseChangesetAction.java b/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
index 21cb854..1f935d7 100644
--- a/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
+++ b/src/org/openstreetmap/josm/actions/CloseChangesetAction.java
@@ -136,7 +136,7 @@ public class CloseChangesetAction extends JosmAction {
                         query,
                         getProgressMonitor().createSubTaskMonitor(1, false /* not internal */)
                 );
-            } catch (Exception e) {
+            } catch (OsmTransferException | IllegalArgumentException e) {
                 if (canceled)
                     return;
                 lastException = e;
diff --git a/src/org/openstreetmap/josm/actions/CombineWayAction.java b/src/org/openstreetmap/josm/actions/CombineWayAction.java
index 76bed08..5176a03 100644
--- a/src/org/openstreetmap/josm/actions/CombineWayAction.java
+++ b/src/org/openstreetmap/josm/actions/CombineWayAction.java
@@ -440,8 +440,8 @@ public class CombineWayAction extends JosmAction {
 
         private final Set<NodePair> edges;
         private int numUndirectedEges;
-        private Map<Node, List<NodePair>> successors;
-        private Map<Node, List<NodePair>> predecessors;
+        private final Map<Node, List<NodePair>> successors = new LinkedHashMap<>();
+        private final Map<Node, List<NodePair>> predecessors = new LinkedHashMap<>();
 
         protected void rememberSuccessor(NodePair pair) {
             if (successors.containsKey(pair.getA())) {
@@ -481,8 +481,8 @@ public class CombineWayAction extends JosmAction {
 
         protected void prepare() {
             Set<NodePair> undirectedEdges = new LinkedHashSet<>();
-            successors = new LinkedHashMap<>();
-            predecessors = new LinkedHashMap<>();
+            successors.clear();
+            predecessors.clear();
 
             for (NodePair pair: edges) {
                 if (!undirectedEdges.contains(pair) && !undirectedEdges.contains(pair.swap())) {
diff --git a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
index 39e2e24..fcd933e 100644
--- a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
+++ b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
@@ -64,10 +64,10 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
 
         for (final Class<? extends FileImporter> importerClass : importerNames) {
             try {
-                FileImporter importer = importerClass.newInstance();
+                FileImporter importer = importerClass.getConstructor().newInstance();
                 importers.add(importer);
                 MapView.addLayerChangeListener(importer);
-            } catch (Exception e) {
+            } catch (ReflectiveOperationException e) {
                 if (Main.isDebugEnabled()) {
                     Main.debug(e.getMessage());
                 }
@@ -105,10 +105,10 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
 
         for (final Class<? extends FileExporter> exporterClass : exporterClasses) {
             try {
-                FileExporter exporter = exporterClass.newInstance();
+                FileExporter exporter = exporterClass.getConstructor().newInstance();
                 exporters.add(exporter);
                 MapView.addLayerChangeListener(exporter);
-            } catch (Exception e) {
+            } catch (ReflectiveOperationException e) {
                 if (Main.isDebugEnabled()) {
                     Main.debug(e.getMessage());
                 }
@@ -318,7 +318,7 @@ public class ExtensionFileFilter extends FileFilter implements java.io.FileFilte
             Utils.join(",", extensionsPlusArchive),
             defaultExtension,
             description + (!extensionsForDescription.isEmpty()
-                ? (" (" + Utils.join(", ", extensionsForDescription) + ")")
+                ? (" (" + Utils.join(", ", extensionsForDescription) + ')')
                 : "")
             );
     }
diff --git a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
index 5af6f74..d444d45 100644
--- a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
+++ b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
@@ -117,12 +117,14 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
             return;
         }
         KeyEvent kev = (KeyEvent) event;
-        int dx = 0, dy = 0;
+        int dx = 0;
+        int dy = 0;
         switch (kev.getKeyCode()) {
         case KeyEvent.VK_UP : dy = +1; break;
         case KeyEvent.VK_DOWN : dy = -1; break;
         case KeyEvent.VK_LEFT : dx = -1; break;
         case KeyEvent.VK_RIGHT : dx = +1; break;
+        default: // Do nothing
         }
         if (dx != 0 || dy != 0) {
             double ppd = layer.getPPD();
@@ -258,8 +260,8 @@ public class ImageryAdjustAction extends MapMode implements AWTEventListener {
             int precision = Main.getProjection().getDefaultZoomInPPD() >= 1.0 ? 2 : 7;
             // US locale to force decimal separator to be '.'
             try (Formatter us = new Formatter(Locale.US)) {
-                tOffset.setText(us.format(
-                    "%1." + precision + "f; %1." + precision + 'f',
+                tOffset.setText(us.format(new StringBuilder()
+                    .append("%1.").append(precision).append("f; %1.").append(precision).append('f').toString(),
                     layer.getDx(), layer.getDy()).toString());
             }
         }
diff --git a/src/org/openstreetmap/josm/actions/JoinAreasAction.java b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
index f96f42e..2dc2f58 100644
--- a/src/org/openstreetmap/josm/actions/JoinAreasAction.java
+++ b/src/org/openstreetmap/josm/actions/JoinAreasAction.java
@@ -958,13 +958,16 @@ public class JoinAreasAction extends JosmAction {
             SplitWayResult split = SplitWayAction.splitWay(getEditLayer(), way, chunks,
                     Collections.<OsmPrimitive>emptyList(), SplitWayAction.Strategy.keepFirstChunk());
 
-            //execute the command, we need the results
-            cmds.add(split.getCommand());
-            commitCommands(marktr("Split ways into fragments"));
+            if (split != null) {
+                //execute the command, we need the results
+                cmds.add(split.getCommand());
+                commitCommands(marktr("Split ways into fragments"));
 
-            result.add(split.getOriginalWay());
-            result.addAll(split.getNewWays());
-        } else {
+                result.add(split.getOriginalWay());
+                result.addAll(split.getNewWays());
+            }
+        }
+        if (result.isEmpty()) {
             //nothing to split
             result.add(way);
         }
diff --git a/src/org/openstreetmap/josm/actions/JosmAction.java b/src/org/openstreetmap/josm/actions/JosmAction.java
index 477b3a7..5e450aa 100644
--- a/src/org/openstreetmap/josm/actions/JosmAction.java
+++ b/src/org/openstreetmap/josm/actions/JosmAction.java
@@ -5,6 +5,8 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.KeyEvent;
 import java.util.Collection;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import javax.swing.AbstractAction;
@@ -238,7 +240,7 @@ public abstract class JosmAction extends AbstractAction implements Destroyable {
                     public void run() {
                         try {
                             future.get();
-                        } catch (Exception e) {
+                        } catch (InterruptedException | ExecutionException | CancellationException e) {
                             Main.error(e);
                             return;
                         }
diff --git a/src/org/openstreetmap/josm/actions/JumpToAction.java b/src/org/openstreetmap/josm/actions/JumpToAction.java
index 4c47749..e1a5555 100644
--- a/src/org/openstreetmap/josm/actions/JumpToAction.java
+++ b/src/org/openstreetmap/josm/actions/JumpToAction.java
@@ -186,7 +186,7 @@ public class JumpToAction extends JosmAction {
             }
 
             // 10 000 000 = 10 000 * 1000 = World * (km -> m)
-            zm.setText(Double.toString(Math.round(10000000 * Math.pow(2, (-1) * zoomLvl))));
+            zm.setText(Double.toString(Math.round(10000000d * Math.pow(2d, (-1d) * zoomLvl))));
         }
     }
 
diff --git a/src/org/openstreetmap/josm/actions/OpenFileAction.java b/src/org/openstreetmap/josm/actions/OpenFileAction.java
index 46a0e51..3c6feff 100644
--- a/src/org/openstreetmap/josm/actions/OpenFileAction.java
+++ b/src/org/openstreetmap/josm/actions/OpenFileAction.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
@@ -181,20 +182,18 @@ public class OpenFileAction extends DiskAccessAction {
         }
 
         protected void alertFilesNotMatchingWithImporter(Collection<File> files, FileImporter importer) {
-            final StringBuilder msg = new StringBuilder();
-            msg.append("<html>").append(
-                    trn(
-                            "Cannot open {0} file with the file importer ''{1}''.",
-                            "Cannot open {0} files with the file importer ''{1}''.",
-                            files.size(),
-                            files.size(),
-                            importer.filter.getDescription()
+            final StringBuilder msg = new StringBuilder(128).append("<html>").append(
+                    trn("Cannot open {0} file with the file importer ''{1}''.",
+                        "Cannot open {0} files with the file importer ''{1}''.",
+                        files.size(),
+                        files.size(),
+                        importer.filter.getDescription()
                     )
             ).append("<br><ul>");
             for (File f: files) {
                 msg.append("<li>").append(f.getAbsolutePath()).append("</li>");
             }
-            msg.append("</ul>");
+            msg.append("</ul></html>");
 
             HelpAwareOptionPane.showMessageDialogInEDT(
                     Main.parent,
@@ -206,13 +205,11 @@ public class OpenFileAction extends DiskAccessAction {
         }
 
         protected void alertFilesWithUnknownImporter(Collection<File> files) {
-            final StringBuilder msg = new StringBuilder();
-            msg.append("<html>").append(
-                    trn(
-                            "Cannot open {0} file because file does not exist or no suitable file importer is available.",
-                            "Cannot open {0} files because files do not exist or no suitable file importer is available.",
-                            files.size(),
-                            files.size()
+            final StringBuilder msg = new StringBuilder(128).append("<html>").append(
+                    trn("Cannot open {0} file because file does not exist or no suitable file importer is available.",
+                        "Cannot open {0} files because files do not exist or no suitable file importer is available.",
+                        files.size(),
+                        files.size()
                     )
             ).append("<br><ul>");
             for (File f: files) {
@@ -220,7 +217,7 @@ public class OpenFileAction extends DiskAccessAction {
                    .append(f.exists() ? tr("no importer") : tr("does not exist"))
                    .append("</i>)</li>");
             }
-            msg.append("</ul>");
+            msg.append("</ul></html>");
 
             HelpAwareOptionPane.showMessageDialogInEDT(
                     Main.parent,
@@ -270,8 +267,7 @@ public class OpenFileAction extends DiskAccessAction {
                                             f.getAbsolutePath()), tr("Open file"), JOptionPane.ERROR_MESSAGE);
                                 }
                             });
-                            // TODO when changing to Java 6: Don't cancel the
-                            // task here but use different modality. (Currently 2 dialogs
+                            // TODO when changing to Java 6: Don't cancel the task here but use different modality. (Currently 2 dialogs
                             // would block each other.)
                             return;
                         } else {
@@ -327,7 +323,7 @@ public class OpenFileAction extends DiskAccessAction {
                                 Main.main.menu.openLocation.openUrl(false, url);
                             }
                         }
-                    } catch (Exception e) {
+                    } catch (IOException | PatternSyntaxException | IllegalStateException | IndexOutOfBoundsException e) {
                         Main.error(e);
                     }
                 }
diff --git a/src/org/openstreetmap/josm/actions/OpenLocationAction.java b/src/org/openstreetmap/josm/actions/OpenLocationAction.java
index df1723c..522da6a 100644
--- a/src/org/openstreetmap/josm/actions/OpenLocationAction.java
+++ b/src/org/openstreetmap/josm/actions/OpenLocationAction.java
@@ -152,7 +152,7 @@ public class OpenLocationAction extends JosmAction {
                     if (task.acceptsUrl(url, isRemotecontrol)) {
                         result.add(task);
                     }
-                } catch (Exception e) {
+                } catch (ReflectiveOperationException e) {
                     Main.error(e);
                 }
             }
@@ -172,7 +172,7 @@ public class OpenLocationAction extends JosmAction {
                 try {
                     DownloadTask task = taskClass.getConstructor().newInstance();
                     result.append(task.acceptsDocumentationSummary());
-                } catch (Exception e) {
+                } catch (ReflectiveOperationException e) {
                     Main.error(e);
                 }
             }
diff --git a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
index 708dd72..2f0b7a0 100644
--- a/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
+++ b/src/org/openstreetmap/josm/actions/OrthogonalizeAction.java
@@ -419,10 +419,10 @@ public final class OrthogonalizeAction extends JosmAction {
      * Class contains everything we need to know about a single way.
      */
     private static class WayData {
-        public final List<Node> wayNodes;             // The assigned way
-        public final int nSeg;            // Number of Segments of the Way
-        public final int nNode;           // Number of Nodes of the Way
-        public Direction[] segDirections; // Direction of the segments
+        public final List<Node> wayNodes;       // The assigned way
+        public final int nSeg;                  // Number of Segments of the Way
+        public final int nNode;                 // Number of Nodes of the Way
+        public final Direction[] segDirections; // Direction of the segments
         // segment i goes from node i to node (i+1)
         public EastNorth segSum;          // (Vector-)sum of all horizontal segments plus the sum of all vertical
         // segments turned by 90 degrees
@@ -432,6 +432,7 @@ public final class OrthogonalizeAction extends JosmAction {
             this.wayNodes = wayNodes;
             this.nNode = wayNodes.size();
             this.nSeg = nNode - 1;
+            this.segDirections = new Direction[nSeg];
         }
 
         /**
@@ -447,7 +448,6 @@ public final class OrthogonalizeAction extends JosmAction {
             for (int i = 0; i < nNode; i++) {
                 en[i] = wayNodes.get(i).getEastNorth();
             }
-            segDirections = new Direction[nSeg];
             Direction direction = pInitialDirection;
             segDirections[0] = direction;
             for (int i = 0; i < nSeg - 1; i++) {
diff --git a/src/org/openstreetmap/josm/actions/PasteAction.java b/src/org/openstreetmap/josm/actions/PasteAction.java
index 96e5873..6030f29 100644
--- a/src/org/openstreetmap/josm/actions/PasteAction.java
+++ b/src/org/openstreetmap/josm/actions/PasteAction.java
@@ -63,7 +63,10 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
      */
     public void pasteData(PrimitiveDeepCopy pasteBuffer, Layer source, ActionEvent e) {
         /* Find the middle of the pasteBuffer area */
-        double maxEast = -1E100, minEast = 1E100, maxNorth = -1E100, minNorth = 1E100;
+        double maxEast = -1E100;
+        double minEast = 1E100;
+        double maxNorth = -1E100;
+        double minNorth = 1E100;
         boolean incomplete = false;
         for (PrimitiveData data : pasteBuffer.getAll()) {
             if (data instanceof NodeData) {
@@ -91,8 +94,8 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
         }
 
         // Allow to cancel paste if there are incomplete primitives
-        if (incomplete) {
-            if (!confirmDeleteIncomplete()) return;
+        if (incomplete && !confirmDeleteIncomplete()) {
+            return;
         }
 
         // default to paste in center of map (pasted via menu or cursor not in MapView)
@@ -157,7 +160,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
                 List<RelationMemberData> newMembers = new ArrayList<>();
                 for (RelationMemberData member: ((RelationData) data).getMembers()) {
                     OsmPrimitiveType memberType = member.getMemberType();
-                    Long newId = null;
+                    Long newId;
                     switch (memberType) {
                     case NODE:
                         newId = newNodeIds.get(member.getMemberId());
@@ -168,6 +171,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
                     case RELATION:
                         newId = newRelationIds.get(member.getMemberId());
                         break;
+                    default: throw new AssertionError();
                     }
                     if (newId != null) {
                         newMembers.add(new RelationMemberData(member.getRole(), memberType, newId));
@@ -182,7 +186,7 @@ public final class PasteAction extends JosmAction implements PasteBufferChangedL
         Main.map.mapView.repaint();
     }
 
-    protected boolean confirmDeleteIncomplete() {
+    private static boolean confirmDeleteIncomplete() {
         ExtendedDialog ed = new ExtendedDialog(Main.parent,
                 tr("Delete incomplete members?"),
                 new String[] {tr("Paste without incomplete members"), tr("Cancel")});
diff --git a/src/org/openstreetmap/josm/actions/RestartAction.java b/src/org/openstreetmap/josm/actions/RestartAction.java
index eb4a904..9f86416 100644
--- a/src/org/openstreetmap/josm/actions/RestartAction.java
+++ b/src/org/openstreetmap/josm/actions/RestartAction.java
@@ -78,42 +78,37 @@ public class RestartAction extends JosmAction {
     }
 
     /**
-     * Restarts the current Java application
-     * @throws IOException in case of any error
+     * Restarts the current Java application.
+     * @throws IOException in case of any I/O error
      */
     public static void restartJOSM() throws IOException {
         if (isRestartSupported() && !Main.exitJosm(false, 0)) return;
         final List<String> cmd;
-        try {
-            // special handling for OSX .app package
-            if (Main.isPlatformOsx() && System.getProperty("java.library.path").contains("/JOSM.app/Contents/MacOS")) {
-                cmd = getAppleCommands();
-            } else {
-                cmd = getCommands();
-            }
-            Main.info("Restart "+cmd);
-            if (Main.isDebugEnabled() && Main.pref.getBoolean("restart.debug.simulation")) {
-                Main.debug("Restart cancelled to get debug info");
-                return;
-            }
-            // execute the command in a shutdown hook, to be sure that all the
-            // resources have been disposed before restarting the application
-            Runtime.getRuntime().addShutdownHook(new Thread("josm-restarter") {
-                @Override
-                public void run() {
-                    try {
-                        Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
-                    } catch (IOException e) {
-                        Main.error(e);
-                    }
-                }
-            });
-            // exit
-            System.exit(0);
-        } catch (Exception e) {
-            // something went wrong
-            throw new IOException("Error while trying to restart the application", e);
+        // special handling for OSX .app package
+        if (Main.isPlatformOsx() && System.getProperty("java.library.path").contains("/JOSM.app/Contents/MacOS")) {
+            cmd = getAppleCommands();
+        } else {
+            cmd = getCommands();
+        }
+        Main.info("Restart "+cmd);
+        if (Main.isDebugEnabled() && Main.pref.getBoolean("restart.debug.simulation")) {
+            Main.debug("Restart cancelled to get debug info");
+            return;
         }
+        // execute the command in a shutdown hook, to be sure that all the
+        // resources have been disposed before restarting the application
+        Runtime.getRuntime().addShutdownHook(new Thread("josm-restarter") {
+            @Override
+            public void run() {
+                try {
+                    Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
+                } catch (IOException e) {
+                    Main.error(e);
+                }
+            }
+        });
+        // exit
+        System.exit(0);
     }
 
     private static List<String> getAppleCommands() {
diff --git a/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java b/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
index 8f165ad..2853bb4 100644
--- a/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
+++ b/src/org/openstreetmap/josm/actions/SearchNotesDownloadAction.java
@@ -74,12 +74,16 @@ public class SearchNotesDownloadAction extends JosmAction {
         performSearch(searchTerm);
     }
 
+    /**
+     * Perform search.
+     * @param searchTerm search term
+     */
     public void performSearch(String searchTerm) {
 
-        searchTerm = searchTerm.trim();
+        String trimmedSearchTerm = searchTerm.trim();
 
         try {
-            final long id = Long.parseLong(searchTerm);
+            final long id = Long.parseLong(trimmedSearchTerm);
             new DownloadNotesTask().download(id, null);
             return;
         } catch (NumberFormatException ignore) {
@@ -91,14 +95,14 @@ public class SearchNotesDownloadAction extends JosmAction {
         int noteLimit = Main.pref.getInteger("osm.notes.downloadLimit", 1000);
         int closedLimit = Main.pref.getInteger("osm.notes.daysCloased", 7);
 
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(128);
         sb.append(OsmApi.getOsmApi().getBaseUrl())
             .append("notes/search?limit=")
             .append(noteLimit)
             .append("&closed=")
             .append(closedLimit)
             .append("&q=")
-            .append(Utils.encodeUrl(searchTerm));
+            .append(Utils.encodeUrl(trimmedSearchTerm));
 
         new DownloadNotesTask().loadUrl(false, sb.toString(), null);
     }
diff --git a/src/org/openstreetmap/josm/actions/SessionLoadAction.java b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
index f244d0d..260ca4b 100644
--- a/src/org/openstreetmap/josm/actions/SessionLoadAction.java
+++ b/src/org/openstreetmap/josm/actions/SessionLoadAction.java
@@ -51,7 +51,8 @@ public class SessionLoadAction extends DiskAccessAction {
         AbstractFileChooser fc = createAndOpenFileChooser(true, false, tr("Open session"),
                 Arrays.asList(SessionImporter.FILE_FILTER, FileFilterAllFiles.getInstance()),
                 SessionImporter.FILE_FILTER, JFileChooser.FILES_ONLY, "lastDirectory");
-        if (fc == null) return;
+        if (fc == null)
+            return;
         File file = fc.getSelectedFile();
         boolean zip = Utils.hasExtension(file, "joz");
         Main.worker.submit(new Loader(file, zip));
@@ -113,35 +114,46 @@ public class SessionLoadAction extends DiskAccessAction {
             SwingUtilities.invokeLater(new Runnable() {
                 @Override
                 public void run() {
-                    if (canceled) return;
-                    if (!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);
-                        }
-                        if (active != null) {
-                            Main.map.mapView.setActiveLayer(active);
-                        }
-                        if (noMap) {
-                            Main.map.setVisible(true);
-                        }
-                    }
-                    for (Runnable task : postLoadTasks) {
-                        if (canceled) return;
-                        if (task == null) {
-                            continue;
-                        }
-                        task.run();
-                    }
+                    if (canceled)
+                        return;
+                    addLayers();
+                    runPostLoadTasks();
                 }
             });
         }
 
+        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);
+                }
+                if (active != null) {
+                    Main.map.mapView.setActiveLayer(active);
+                }
+                if (noMap) {
+                    Main.map.setVisible(true);
+                }
+            }
+        }
+
+        private void runPostLoadTasks() {
+            for (Runnable task : postLoadTasks) {
+                if (canceled)
+                    return;
+                if (task == null) {
+                    continue;
+                }
+                task.run();
+            }
+        }
+
         @Override
         protected void realRun() {
             try {
@@ -170,7 +182,7 @@ public class SessionLoadAction extends DiskAccessAction {
                 handleException(tr("Data Error"), e);
             } catch (IOException e) {
                 handleException(tr("IO Error"), e);
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 cancel();
                 throw e;
             }
diff --git a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
index d439338..84844c8 100644
--- a/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
+++ b/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
@@ -32,6 +32,7 @@ import org.openstreetmap.josm.gui.preferences.SourceEntry;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorTagCheckerRulesPreference;
+import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.PlatformHookUnixoid;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -76,7 +77,7 @@ public final class ShowStatusReportAction extends JosmAction {
      * @return The report header (software and system info)
      */
     public static String getReportHeader() {
-        StringBuilder text = new StringBuilder();
+        StringBuilder text = new StringBuilder(256);
         String runtimeVersion = System.getProperty("java.runtime.version");
         text.append(Version.getInstance().getReleaseAttributes())
             .append("\nIdentification: ").append(Version.getInstance().getAgentString())
@@ -134,7 +135,6 @@ public final class ShowStatusReportAction extends JosmAction {
                 text.append("VM arguments: ").append(vmArguments.toString().replace("\\\\", "\\")).append('\n');
             }
         } catch (SecurityException e) {
-            // Ignore exception
             if (Main.isTraceEnabled()) {
                 Main.trace(e.getMessage());
             }
@@ -161,10 +161,15 @@ public final class ShowStatusReportAction extends JosmAction {
         appendCollection(text, "Validator rules", getCustomUrls(ValidatorTagCheckerRulesPreference.RulePrefHelper.INSTANCE));
         appendCollection(text, "Last errors/warnings", Main.getLastErrorAndWarnings());
 
+        String osmApi = OsmApi.getOsmApi().getServerUrl();
+        if (!OsmApi.DEFAULT_API_URL.equals(osmApi.trim())) {
+            text.append("OSM API: ").append(osmApi).append("\n\n");
+        }
+
         return text.toString();
     }
 
-    protected static Collection<String> getCustomUrls(SourceEditor.SourcePrefHelper helper) {
+    private static Collection<String> getCustomUrls(SourceEditor.SourcePrefHelper helper) {
         Set<String> set = new TreeSet<>();
         for (SourceEntry entry : helper.get()) {
             set.add(entry.url);
@@ -220,7 +225,7 @@ public final class ShowStatusReportAction extends JosmAction {
         return target == null ? str : str.replace(target, replacement);
     }
 
-    protected static <T> void appendCollection(StringBuilder text, String label, Collection<T> col) {
+    private static <T> void appendCollection(StringBuilder text, String label, Collection<T> col) {
         if (!col.isEmpty()) {
             text.append(label+":\n");
             for (T o : col) {
@@ -266,6 +271,7 @@ public final class ShowStatusReportAction extends JosmAction {
         switch (ed.showDialog().getValue()) {
             case 1: ta.copyToClippboard(); break;
             case 2: BugReportSender.reportBug(reportHeader); break;
+            default: // Do nothing
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/SplitWayAction.java b/src/org/openstreetmap/josm/actions/SplitWayAction.java
index 05db126..dc017bf 100644
--- a/src/org/openstreetmap/josm/actions/SplitWayAction.java
+++ b/src/org/openstreetmap/josm/actions/SplitWayAction.java
@@ -225,11 +225,11 @@ public class SplitWayAction extends JosmAction {
      */
     static class SegmentToKeepSelectionDialog extends ExtendedDialog {
         static final AtomicInteger DISPLAY_COUNT = new AtomicInteger();
-        final Way selectedWay;
-        final List<Way> newWays;
+        final transient Way selectedWay;
+        final transient List<Way> newWays;
         final JList<Way> list;
-        final List<OsmPrimitive> selection;
-        final Way wayToKeep;
+        final transient List<OsmPrimitive> selection;
+        final transient Way wayToKeep;
 
         SegmentToKeepSelectionDialog(Way selectedWay, List<Way> newWays, Way wayToKeep, List<OsmPrimitive> selection) {
             super(Main.parent, tr("Which way segment should reuse the history of {0}?", selectedWay.getId()),
@@ -745,8 +745,7 @@ public class SplitWayAction extends JosmAction {
      */
     public static SplitWayResult split(OsmDataLayer layer, Way way, List<Node> atNodes, Collection<? extends OsmPrimitive> selection) {
         List<List<Node>> chunks = buildSplitChunks(way, atNodes);
-        if (chunks == null) return null;
-        return splitWay(layer, way, chunks, selection);
+        return chunks != null ? splitWay(layer, way, chunks, selection) : null;
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/UnGlueAction.java b/src/org/openstreetmap/josm/actions/UnGlueAction.java
index d0c277a..2ad71b5 100644
--- a/src/org/openstreetmap/josm/actions/UnGlueAction.java
+++ b/src/org/openstreetmap/josm/actions/UnGlueAction.java
@@ -202,8 +202,8 @@ public class UnGlueAction extends JosmAction {
      */
     static final class PropertiesMembershipDialog extends ExtendedDialog {
 
-        final ExistingBothNewChoice tags;
-        final ExistingBothNewChoice memberships;
+        final transient ExistingBothNewChoice tags;
+        final transient ExistingBothNewChoice memberships;
 
         private PropertiesMembershipDialog(boolean preselectNew, boolean queryTags, boolean queryMemberships) {
             super(Main.parent, tr("Tags / Memberships"), new String[]{tr("Unglue"), tr("Cancel")});
@@ -561,7 +561,7 @@ public class UnGlueAction extends JosmAction {
      */
     private static 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() + 1, newNodes.size() + 1), cmds));
+                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));
     }
diff --git a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
index c803b7c..7159c36 100644
--- a/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
@@ -22,6 +22,7 @@ import org.openstreetmap.josm.gui.io.UpdatePrimitivesTask;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
 import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.Shortcut;
 
 /**
@@ -43,7 +44,7 @@ public class UpdateSelectionAction extends JosmAction {
         try {
             DataSet ds = reader.parseOsm(NullProgressMonitor.INSTANCE);
             Main.main.getEditLayer().mergeFrom(ds);
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             ExceptionDialogUtil.explainException(e);
         }
     }
diff --git a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
index 45b9ae2..8a32702 100644
--- a/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
+++ b/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
@@ -340,7 +340,6 @@ public class UploadSelectionAction extends JosmAction {
                         OsmPrimitive myDeletedParent = layer.data.getPrimitiveById(p);
                         // our local dataset includes a deleted parent of a primitive we want
                         // to delete. Include this parent in the collection of uploaded primitives
-                        //
                         if (myDeletedParent != null && myDeletedParent.isDeleted()) {
                             if (!toUpload.contains(myDeletedParent)) {
                                 toUpload.add(myDeletedParent);
@@ -351,7 +350,7 @@ public class UploadSelectionAction extends JosmAction {
                         }
                     }
                 }
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (canceled)
                     // ignore exception
                     return;
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java
index b63c5a0..f655091 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/AbstractChangesetDownloadTask.java
@@ -126,17 +126,19 @@ public abstract class AbstractChangesetDownloadTask extends AbstractDownloadTask
      * @return the future representing the asynchronous task
      */
     public final Future<?> download() {
-        return Main.worker.submit(downloadTaskRunnable);
+        return downloadTaskRunnable != null ? Main.worker.submit(downloadTaskRunnable) : null;
     }
 
     @Override
     public final Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
-        return Main.worker.submit(downloadTaskRunnable);
+        return downloadTaskRunnable != null ? Main.worker.submit(downloadTaskRunnable) : null;
     }
 
     @Override
     public final void cancel() {
-        downloadTaskRunnable.cancel();
+        if (downloadTaskRunnable != null) {
+            downloadTaskRunnable.cancel();
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/AbstractDownloadTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/AbstractDownloadTask.java
index a65653c..7033f08 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/AbstractDownloadTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/AbstractDownloadTask.java
@@ -83,7 +83,7 @@ public abstract class AbstractDownloadTask<T> implements DownloadTask {
 
     @Override
     public String acceptsDocumentationSummary() {
-        StringBuilder buff = new StringBuilder("<tr><td>");
+        StringBuilder buff = new StringBuilder(128).append("<tr><td>");
         buff.append(getTitle())
             .append(":</td><td>");
         String[] patterns = getPatterns();
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
index 6668cd5..b9df7b5 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetContentDownloadTask.java
@@ -26,8 +26,6 @@ import org.xml.sax.SAXException;
  */
 public class ChangesetContentDownloadTask extends AbstractChangesetDownloadTask {
 
-    private final DownloadTask downloadTask;
-
     class DownloadTask extends RunnableDownloadTask {
         /** the list of changeset ids to download */
         private final List<Integer> toDownload = new ArrayList<>();
@@ -128,8 +126,7 @@ public class ChangesetContentDownloadTask extends AbstractChangesetDownloadTask
         if (changesetId <= 0)
             throw new IllegalArgumentException(
                     MessageFormat.format("Expected integer value > 0 for parameter ''{0}'', got ''{1}''", "changesetId", changesetId));
-        downloadTask = new DownloadTask(parent, Collections.singleton(changesetId));
-        setDownloadTask(downloadTask);
+        setDownloadTask(new DownloadTask(parent, Collections.singleton(changesetId)));
     }
 
     /**
@@ -141,8 +138,7 @@ public class ChangesetContentDownloadTask extends AbstractChangesetDownloadTask
      * @throws IllegalArgumentException if parent is {@code null}
      */
     public ChangesetContentDownloadTask(Component parent, Collection<Integer> changesetIds) {
-        downloadTask = new DownloadTask(parent, changesetIds);
-        setDownloadTask(downloadTask);
+        setDownloadTask(new DownloadTask(parent, changesetIds));
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetHeaderDownloadTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetHeaderDownloadTask.java
index 746331e..3060232 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetHeaderDownloadTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetHeaderDownloadTask.java
@@ -27,8 +27,6 @@ import org.xml.sax.SAXException;
  */
 public class ChangesetHeaderDownloadTask extends AbstractChangesetDownloadTask {
 
-    private final DownloadTask downloadTask;
-
     class DownloadTask extends RunnableDownloadTask {
         /** the list of changeset ids to download */
         private final Set<Integer> toDownload = new HashSet<>();
@@ -111,8 +109,7 @@ public class ChangesetHeaderDownloadTask extends AbstractChangesetDownloadTask {
      * @since 7704
      */
     public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids, boolean includeDiscussion) {
-        downloadTask = new DownloadTask(dialogParent, ids, includeDiscussion);
-        setDownloadTask(downloadTask);
+        setDownloadTask(new DownloadTask(dialogParent, ids, includeDiscussion));
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
index 202f3ba..14702ef 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/ChangesetQueryTask.java
@@ -26,8 +26,6 @@ import org.xml.sax.SAXException;
  */
 public class ChangesetQueryTask extends AbstractChangesetDownloadTask {
 
-    private final DownloadTask downloadTask;
-
     class DownloadTask extends RunnableDownloadTask {
         /** the changeset query */
         private ChangesetQuery query;
@@ -133,7 +131,6 @@ public class ChangesetQueryTask extends AbstractChangesetDownloadTask {
      */
     public ChangesetQueryTask(Component parent, ChangesetQuery query) {
         CheckParameterUtil.ensureParameterNotNull(query, "query");
-        downloadTask = new DownloadTask(parent, query);
-        setDownloadTask(downloadTask);
+        setDownloadTask(new DownloadTask(parent, query));
     }
 }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
index bd82630..b1e1324 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
@@ -114,14 +114,10 @@ public class DownloadGpsTask extends AbstractDownloadTask<GpxData> {
                     return;
                 ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
                 rawData = reader.parseRawGps(subMonitor);
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (isCanceled())
                     return;
-                if (e instanceof OsmTransferException) {
-                    rememberException(e);
-                } else {
-                    rememberException(new OsmTransferException(e));
-                }
+                rememberException(e);
             }
         }
 
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
index 4166b5e..7f99e86 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadNotesTask.java
@@ -159,14 +159,10 @@ public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
                                 + tr("Request a smaller area to make sure that all notes are being downloaded.")
                                 + "</html>",
                         tr("More notes to download"), JOptionPane.INFORMATION_MESSAGE);
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (isCanceled())
                     return;
-                if (e instanceof OsmTransferException) {
-                    rememberException(e);
-                } else {
-                    rememberException(new OsmTransferException(e));
-                }
+                rememberException(e);
             }
         }
     }
@@ -185,14 +181,10 @@ public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
             ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
             try {
                 notesData = reader.parseRawNotes(subMonitor);
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (isCanceled())
                     return;
-                if (e instanceof OsmTransferException) {
-                    rememberException(e);
-                } else {
-                    rememberException(new OsmTransferException(e));
-                }
+                rememberException(e);
             }
         }
     }
@@ -211,14 +203,10 @@ public class DownloadNotesTask extends AbstractDownloadTask<NoteData> {
             ProgressMonitor subMonitor = progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false);
             try {
                 notesData = reader.parseRawNotesBzip2(subMonitor);
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (isCanceled())
                     return;
-                if (e instanceof OsmTransferException) {
-                    rememberException(e);
-                } else {
-                    rememberException(new OsmTransferException(e));
-                }
+                rememberException(e);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
index 3360d70..a7e690b 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
@@ -331,7 +331,7 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
                 if (isCanceled())
                     return;
                 dataSet = parseDataSet();
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (isCanceled()) {
                     Main.info(tr("Ignoring exception because download has been canceled. Exception was: {0}", e.toString()));
                     return;
@@ -339,10 +339,8 @@ public class DownloadOsmTask extends AbstractDownloadTask<DataSet> {
                 if (e instanceof OsmTransferCanceledException) {
                     setCanceled(true);
                     return;
-                } else if (e instanceof OsmTransferException) {
-                    rememberException(e);
                 } else {
-                    rememberException(new OsmTransferException(e));
+                    rememberException(e);
                 }
                 DownloadOsmTask.this.setFailed(true);
             }
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
index 495cbf4..b24817e 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
@@ -183,17 +183,18 @@ public class DownloadReferrersTask extends PleaseWaitRunnable {
             for (Entry<Long, OsmPrimitiveType> entry: children.entrySet()) {
                 if (canceled)
                     return;
-                String msg = "";
+                String msg;
                 switch(entry.getValue()) {
                 case NODE: msg = tr("({0}/{1}) Loading parents of node {2}", i+1, children.size(), entry.getKey()); break;
                 case WAY: msg = tr("({0}/{1}) Loading parents of way {2}", i+1, children.size(), entry.getKey()); break;
                 case RELATION: msg = tr("({0}/{1}) Loading parents of relation {2}", i+1, children.size(), entry.getKey()); break;
+                default: throw new AssertionError();
                 }
                 progressMonitor.subTask(msg);
                 downloadParents(entry.getKey(), entry.getValue(), progressMonitor);
                 i++;
             }
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled)
                 return;
             lastException = e;
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
index cafc37d..4bcb3c9 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTaskList.java
@@ -15,6 +15,8 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import javax.swing.JOptionPane;
@@ -48,7 +50,7 @@ public class DownloadTaskList {
     private final List<Future<?>> taskFutures = new LinkedList<>();
     private ProgressMonitor progressMonitor;
 
-    private void addDownloadTask(DownloadTask dt, Rectangle2D td, int i, int n) {
+    private void addDownloadTask(ProgressMonitor progressMonitor, DownloadTask dt, Rectangle2D td, int i, int n) {
         ProgressMonitor childProgress = progressMonitor.createSubTaskMonitor(1, false);
         childProgress.setCustomText(tr("Download {0} of {1} ({2} left)", i, n, n - i));
         Future<?> future = dt.download(false, new Bounds(td), childProgress);
@@ -79,10 +81,10 @@ public class DownloadTaskList {
         for (Rectangle2D td : rects) {
             i++;
             if (osmData) {
-                addDownloadTask(new DownloadOsmTask(), td, i, n);
+                addDownloadTask(progressMonitor, new DownloadOsmTask(), td, i, n);
             }
             if (gpxData) {
-                addDownloadTask(new DownloadGpsTask(), td, i, n);
+                addDownloadTask(progressMonitor, new DownloadGpsTask(), td, i, n);
             }
         }
         progressMonitor.addCancelListener(new CancelListener() {
@@ -248,7 +250,7 @@ public class DownloadTaskList {
             for (Future<?> future : taskFutures) {
                 try {
                     future.get();
-                } catch (Exception e) {
+                } catch (InterruptedException | ExecutionException | CancellationException e) {
                     Main.error(e);
                     return;
                 }
@@ -271,7 +273,7 @@ public class DownloadTaskList {
                     @Override
                     public void run() {
                         if (items.size() == 1 && tr("No data found in this area.").equals(items.iterator().next())) {
-                            new Notification(items.iterator().next().toString()).setIcon(JOptionPane.WARNING_MESSAGE).show();
+                            new Notification(items.iterator().next()).setIcon(JOptionPane.WARNING_MESSAGE).show();
                         } else {
                             JOptionPane.showMessageDialog(Main.parent, "<html>"
                                     + tr("The following errors occurred during mass download: {0}",
diff --git a/src/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandler.java b/src/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandler.java
index f035f70..700ecfa 100644
--- a/src/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandler.java
+++ b/src/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandler.java
@@ -8,6 +8,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 
 import javax.swing.JOptionPane;
@@ -39,7 +41,7 @@ public class PostDownloadHandler implements Runnable {
         //
         try {
             future.get();
-        } catch (Exception e) {
+        } catch (InterruptedException | ExecutionException | CancellationException e) {
             Main.error(e);
             return;
         }
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
index 97231d4..48b5201 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
@@ -895,8 +895,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
     }
 
     /**
-     * if one of the ends of {@code way} is given {@code  node},
-     * then set  currentBaseNode = node and previousNode = adjacent node of way
+     * if one of the ends of {@code way} is given {@code node},
+     * then set currentBaseNode = node and previousNode = adjacent node of way
      * @param way way to continue
      * @param node starting node
      */
@@ -1141,7 +1141,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
         Point p1 = mv.getPoint(getCurrentBaseNode());
         Point p2 = mv.getPoint(currentMouseEastNorth);
 
-        double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI;
+        double t = Math.atan2((double) p2.y - p1.y, (double) p2.x - p1.x) + Math.PI;
 
         b.moveTo(p1.x, p1.y);
         b.lineTo(p2.x, p2.y);
@@ -1482,7 +1482,7 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
                 b = new GeneralPath();
                 if (absoluteFix) {
                     b.moveTo(p2.x, p2.y);
-                    b.lineTo(2*p1.x-p2.x, 2*p1.y-p2.y); // bi-directional line
+                    b.lineTo(2f*p1.x-p2.x, 2f*p1.y-p2.y); // bi-directional line
                 } else {
                     b.moveTo(p2.x, p2.y);
                     b.lineTo(p3.x, p3.y);
@@ -1664,7 +1664,8 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
                     }
                 }
             }
-            return projected = new EastNorth(e0+l*pe, n0+l*pn);
+            projected = new EastNorth(e0+l*pe, n0+l*pn);
+            return projected;
         }
 
         public void noSnapNow() {
@@ -1690,23 +1691,6 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             customBaseHeading = hdg;
         }
 
-        private void nextSnapMode() {
-            if (snapOn) {
-                // turn off snapping if we are in fixed mode or no actile snapping line exist
-                if (fixed || !active) {
-                    snapOn = false;
-                    unsetFixedMode();
-                } else {
-                    setFixedMode();
-                }
-            } else {
-                snapOn = true;
-                unsetFixedMode();
-            }
-            checkBox.setState(snapOn);
-            customBaseHeading = -1;
-        }
-
         private void enableSnapping() {
             snapOn = true;
             checkBox.setState(snapOn);
@@ -1727,18 +1711,18 @@ public class DrawAction extends MapMode implements MapViewPaintable, SelectionCh
             }
         }
 
-        public  void unsetFixedMode() {
+        public void unsetFixedMode() {
             fixed = false;
             absoluteFix = false;
             lastAngle = 0;
             active = false;
         }
 
-        public  boolean isActive() {
+        public boolean isActive() {
             return active;
         }
 
-        public  boolean isSnapOn() {
+        public boolean isSnapOn() {
             return snapOn;
         }
 
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java b/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
index e71bdb5..06d2118 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java
@@ -90,7 +90,7 @@ public class ImproveWayAccuracyAction extends MapMode implements
 
     protected String oldModeHelpText;
 
-    private final AbstractMapViewPaintable temporaryLayer = new AbstractMapViewPaintable() {
+    private final transient AbstractMapViewPaintable temporaryLayer = new AbstractMapViewPaintable() {
         @Override
         public void paint(Graphics2D g, MapView mv, Bounds bbox) {
             ImproveWayAccuracyAction.this.paint(g, mv, bbox);
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java b/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
index c4e7c5b..673febe 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
@@ -54,9 +54,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  *
  * 4. Visual cues could be better
  *
- * 5. Cursors (Half-done)
- *
- * 6. (long term) Parallelize and adjust offsets of existing ways
+ * 5. (long term) Parallelize and adjust offsets of existing ways
  *
  * == Code quality ==
  *
@@ -82,7 +80,7 @@ import org.openstreetmap.josm.tools.Shortcut;
 public class ParallelWayAction extends MapMode implements ModifierListener, MapViewPaintable {
 
     private enum Mode {
-        dragging, normal
+        DRAGGING, NORMAL
     }
 
     //// Preferences and flags
@@ -144,7 +142,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
     @Override
     public void enterMode() {
         // super.enterMode() updates the status line and cursor so we need our state to be set correctly
-        setMode(Mode.normal);
+        setMode(Mode.NORMAL);
         pWays = null;
         updateAllPreferences(); // All default values should've been set now
 
@@ -189,11 +187,11 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
         // TODO: add more detailed feedback based on modifier state.
         // TODO: dynamic messages based on preferences. (Could be problematic translation wise)
         switch (mode) {
-        case normal:
+        case NORMAL:
             // CHECKSTYLE.OFF: LineLength
             return tr("Select ways as in Select mode. Drag selected ways or a single way to create a parallel copy (Alt toggles tag preservation)");
             // CHECKSTYLE.ON: LineLength
-        case dragging:
+        case DRAGGING:
             return tr("Hold Ctrl to toggle snapping");
         }
         return ""; // impossible ..
@@ -202,8 +200,6 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
     // Separated due to "race condition" between default values
     private void updateAllPreferences() {
         updateModeLocalPreferences();
-        // @formatter:off
-        // @formatter:on
     }
 
     private void updateModeLocalPreferences() {
@@ -251,25 +247,19 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
     private void updateCursor() {
         Cursor newCursor = null;
         switch (mode) {
-        case normal:
+        case NORMAL:
             if (matchesCurrentModifiers(setSelectedModifierCombo)) {
                 newCursor = ImageProvider.getCursor("normal", "parallel");
             } else if (matchesCurrentModifiers(addToSelectionModifierCombo)) {
-                newCursor = ImageProvider.getCursor("normal", "parallel"); // FIXME
+                newCursor = ImageProvider.getCursor("normal", "parallel_add");
             } else if (matchesCurrentModifiers(toggleSelectedModifierCombo)) {
-                newCursor = ImageProvider.getCursor("normal", "parallel"); // FIXME
-            } else if (Main.isDebugEnabled()) {
-                // TODO: set to a cursor indicating an error
-                Main.debug("TODO: set an error cursor");
+                newCursor = ImageProvider.getCursor("normal", "parallel_remove");
             }
             break;
-        case dragging:
-            if (snap) {
-                // TODO: snapping cursor?
-                newCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
-            } else {
-                newCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
-            }
+        case DRAGGING:
+            newCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
+            break;
+        default: throw new AssertionError();
         }
         if (newCursor != null) {
             mv.setNewCursor(newCursor, this);
@@ -351,11 +341,11 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
                 clearSourceWays();
                 addSourceWay(nearestWay);
             } // else -> invalid modifier combination
-        } else if (mode == Mode.dragging) {
+        } else if (mode == Mode.DRAGGING) {
             clearSourceWays();
         }
 
-        setMode(Mode.normal);
+        setMode(Mode.NORMAL);
         resetMouseTrackingState();
         mv.repaint();
     }
@@ -391,7 +381,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
         // Setting this after the check above means we tolerate clicks with some movement
         mouseHasBeenDragged = true;
 
-        if (mode == Mode.normal) {
+        if (mode == Mode.NORMAL) {
             // Should we ensure that the copyTags modifiers are still valid?
 
             // Important to use mouse position from the press, since the drag
@@ -400,7 +390,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
                 return;
             if (!initParallelWays(mousePressedPos, copyTags))
                 return;
-            setMode(Mode.dragging);
+            setMode(Mode.DRAGGING);
         }
 
         // Calculate distance to the reference line
@@ -464,7 +454,7 @@ public class ParallelWayAction extends MapMode implements ModifierListener, MapV
 
     @Override
     public void paint(Graphics2D g, MapView mv, Bounds bbox) {
-        if (mode == Mode.dragging) {
+        if (mode == Mode.DRAGGING) {
             // sanity checks
             if (mv == null)
                 return;
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java b/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java
index 0d49640..06875e2 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ParallelWays.java
@@ -62,7 +62,6 @@ public class ParallelWays {
             }
             ways.add(wCopy);
         }
-        sourceWays = null; // Ensure that we only use the copies from now
 
         // Find a linear ordering of the nodes. Fail if there isn't one.
         CombineWayAction.NodeGraph nodeGraph = CombineWayAction.NodeGraph.createUndirectedGraphFromNodeWays(ways);
diff --git a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
index 589d4f7..1009634 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
@@ -724,8 +724,8 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 ((MoveCommand) c).saveCheckpoint();
                 ((MoveCommand) c).applyVectorTo(currentEN);
             } else {
-                Main.main.undoRedo.add(
-                        c = new MoveCommand(selection, startEN, currentEN));
+                c = new MoveCommand(selection, startEN, currentEN);
+                Main.main.undoRedo.add(c);
             }
             for (Node n : affectedNodes) {
                 LatLon ll = n.getCoor();
@@ -833,7 +833,7 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
             if (osm instanceof Way) {
                 limit -= ((Way) osm).getNodes().size();
             }
-            if ((limit -= 1) < 0) {
+            if (--limit < 0) {
                 break;
             }
         }
@@ -1199,8 +1199,10 @@ public class SelectAction extends MapMode implements ModifierListener, KeyPressR
                 for (WaySegment ws : mv.getNearestWaySegments(p, mv.isSelectablePredicate)) {
                     w = ws.way;
 
-                    Point2D p1 = mv.getPoint2D(wnp.a = w.getNode(ws.lowerIndex));
-                    Point2D p2 = mv.getPoint2D(wnp.b = w.getNode(ws.lowerIndex + 1));
+                    wnp.a = w.getNode(ws.lowerIndex);
+                    wnp.b = w.getNode(ws.lowerIndex + 1);
+                    Point2D p1 = mv.getPoint2D(wnp.a);
+                    Point2D p2 = mv.getPoint2D(wnp.b);
                     if (WireframeMapRenderer.isLargeSegment(p1, p2, virtualSpace)) {
                         Point2D pc = new Point2D.Double((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
                         if (p.distanceSq(pc) < virtualSnapDistSq2) {
diff --git a/src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java b/src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java
index 3d0a9f1..a357b47 100644
--- a/src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java
+++ b/src/org/openstreetmap/josm/actions/mapmode/ZoomAction.java
@@ -27,6 +27,7 @@ import org.openstreetmap.josm.tools.Shortcut;
  * are ignored.
  *
  * @author imi
+ * @since 1
  */
 public class ZoomAction extends MapMode implements SelectionEnded {
 
@@ -41,7 +42,7 @@ public class ZoomAction extends MapMode implements SelectionEnded {
      */
     public ZoomAction(MapFrame mapFrame) {
         super(tr("Zoom"), "zoom", tr("Zoom and move map"),
-                Shortcut.registerShortcut("mapmode:zoom", tr("Mode: {0}", tr("Zoom")), KeyEvent.VK_Z, Shortcut.DIRECT),
+                Shortcut.registerShortcut("mapmode:zoom", tr("Mode: {0}", tr("Zoom")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
                 mapFrame, ImageProvider.getCursor("normal", "zoom"));
         selectionManager = new SelectionManager(this, true, mapFrame.mapView);
     }
diff --git a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
index e4f77cc..32a9724 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
@@ -243,7 +243,7 @@ public class SearchCompiler {
     }
 
     public interface BinaryMatchFactory extends MatchFactory {
-        BinaryMatch get(String keyword, Match lhs, Match rhs, PushbackTokenizer tokenizer) throws ParseError;
+        AbstractBinaryMatch get(String keyword, Match lhs, Match rhs, PushbackTokenizer tokenizer) throws ParseError;
     }
 
     /**
@@ -336,23 +336,40 @@ public class SearchCompiler {
     /**
      * A binary search operator which may take data parameters.
      */
-    public abstract static class BinaryMatch extends Match {
+    public abstract static class AbstractBinaryMatch extends Match {
 
         protected final Match lhs;
         protected final Match rhs;
 
-        public BinaryMatch(Match lhs, Match rhs) {
+        /**
+         * Constructs a new {@code BinaryMatch}.
+         * @param lhs Left hand side
+         * @param rhs Right hand side
+         */
+        public AbstractBinaryMatch(Match lhs, Match rhs) {
             this.lhs = lhs;
             this.rhs = rhs;
         }
 
-        public Match getLhs() {
+        /**
+         * Returns left hand side.
+         * @return left hand side
+         */
+        public final Match getLhs() {
             return lhs;
         }
 
-        public Match getRhs() {
+        /**
+         * Returns right hand side.
+         * @return right hand side
+         */
+        public final Match getRhs() {
             return rhs;
         }
+
+        protected static String parenthesis(Match m) {
+            return '(' + m.toString() + ')';
+        }
     }
 
     /**
@@ -399,7 +416,7 @@ public class SearchCompiler {
 
         @Override
         public String toString() {
-            return "!" + match;
+            return '!' + match.toString();
         }
 
         public Match getMatch() {
@@ -437,7 +454,12 @@ public class SearchCompiler {
     /**
      * Matches if both left and right expressions match.
      */
-    public static class And extends BinaryMatch {
+    public static class And extends AbstractBinaryMatch {
+        /**
+         * Constructs a new {@code And} match.
+         * @param lhs left hand side
+         * @param rhs right hand side
+         */
         public And(Match lhs, Match rhs) {
             super(lhs, rhs);
         }
@@ -454,15 +476,20 @@ public class SearchCompiler {
 
         @Override
         public String toString() {
-            return (lhs instanceof BinaryMatch && !(lhs instanceof And) ? "(" + lhs + ")" : lhs) + " && "
-                    + (rhs instanceof BinaryMatch && !(rhs instanceof And) ? "(" + rhs + ")" : rhs);
+            return (lhs instanceof AbstractBinaryMatch && !(lhs instanceof And) ? parenthesis(lhs) : lhs) + " && "
+                 + (rhs instanceof AbstractBinaryMatch && !(rhs instanceof And) ? parenthesis(rhs) : rhs);
         }
     }
 
     /**
      * Matches if the left OR the right expression match.
      */
-    public static class Or extends BinaryMatch {
+    public static class Or extends AbstractBinaryMatch {
+        /**
+         * Constructs a new {@code Or} match.
+         * @param lhs left hand side
+         * @param rhs right hand side
+         */
         public Or(Match lhs, Match rhs) {
             super(lhs, rhs);
         }
@@ -479,15 +506,20 @@ public class SearchCompiler {
 
         @Override
         public String toString() {
-            return (lhs instanceof BinaryMatch && !(lhs instanceof Or) ? "(" + lhs + ")" : lhs) + " || "
-                    + (rhs instanceof BinaryMatch && !(rhs instanceof Or) ? "(" + rhs + ")" : rhs);
+            return (lhs instanceof AbstractBinaryMatch && !(lhs instanceof Or) ? parenthesis(lhs) : lhs) + " || "
+                 + (rhs instanceof AbstractBinaryMatch && !(rhs instanceof Or) ? parenthesis(rhs) : rhs);
         }
     }
 
     /**
      * Matches if the left OR the right expression match, but not both.
      */
-    public static class Xor extends BinaryMatch {
+    public static class Xor extends AbstractBinaryMatch {
+        /**
+         * Constructs a new {@code Xor} match.
+         * @param lhs left hand side
+         * @param rhs right hand side
+         */
         public Xor(Match lhs, Match rhs) {
             super(lhs, rhs);
         }
@@ -504,8 +536,8 @@ public class SearchCompiler {
 
         @Override
         public String toString() {
-            return (lhs instanceof BinaryMatch && !(lhs instanceof Xor) ? "(" + lhs + ")" : lhs) + " ^ "
-                    + (rhs instanceof BinaryMatch && !(rhs instanceof Xor) ? "(" + rhs + ")" : rhs);
+            return (lhs instanceof AbstractBinaryMatch && !(lhs instanceof Xor) ? parenthesis(lhs) : lhs) + " ^ "
+                 + (rhs instanceof AbstractBinaryMatch && !(rhs instanceof Xor) ? parenthesis(rhs) : rhs);
         }
     }
 
@@ -597,24 +629,19 @@ public class SearchCompiler {
                     this.keyPattern = Pattern.compile(key, searchFlags);
                 } catch (PatternSyntaxException e) {
                     throw new ParseError(tr(rxErrorMsg, e.getPattern(), e.getIndex(), e.getMessage()), e);
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     throw new ParseError(tr(rxErrorMsgNoPos, key, e.getMessage()), e);
                 }
                 try {
                     this.valuePattern = Pattern.compile(value, searchFlags);
                 } catch (PatternSyntaxException e) {
                     throw new ParseError(tr(rxErrorMsg, e.getPattern(), e.getIndex(), e.getMessage()), e);
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     throw new ParseError(tr(rxErrorMsgNoPos, value, e.getMessage()), e);
                 }
                 this.key = key;
                 this.value = value;
 
-            } else if (caseSensitive) {
-                this.key = key;
-                this.value = value;
-                this.keyPattern = null;
-                this.valuePattern = null;
             } else {
                 this.key = key;
                 this.value = value;
@@ -794,7 +821,7 @@ public class SearchCompiler {
                     keyPattern = Pattern.compile(key, regexFlags(false));
                 } catch (PatternSyntaxException e) {
                     throw new ParseError(tr(rxErrorMsg, e.getPattern(), e.getIndex(), e.getMessage()), e);
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     throw new ParseError(tr(rxErrorMsgNoPos, key, e.getMessage()), e);
                 }
             } else {
@@ -805,7 +832,7 @@ public class SearchCompiler {
                     valuePattern = Pattern.compile(this.value, regexFlags(false));
                 } catch (PatternSyntaxException e) {
                     throw new ParseError(tr(rxErrorMsg, e.getPattern(), e.getIndex(), e.getMessage()), e);
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     throw new ParseError(tr(rxErrorMsgNoPos, value, e.getMessage()), e);
                 }
             } else {
@@ -884,7 +911,7 @@ public class SearchCompiler {
                     this.searchRegex = Pattern.compile(s, regexFlags(caseSensitive));
                 } catch (PatternSyntaxException e) {
                     throw new ParseError(tr(rxErrorMsg, e.getPattern(), e.getIndex(), e.getMessage()), e);
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     throw new ParseError(tr(rxErrorMsgNoPos, s, e.getMessage()), e);
                 }
                 this.search = s;
@@ -1759,7 +1786,7 @@ public class SearchCompiler {
     public static String buildSearchStringForTag(String key, String value) {
         final String forKey = '"' + escapeStringForSearch(key) + '"' + '=';
         if (value == null || value.isEmpty()) {
-            return forKey + "*";
+            return forKey + '*';
         } else {
             return forKey + '"' + escapeStringForSearch(value) + '"';
         }
diff --git a/src/org/openstreetmap/josm/actions/upload/UploadNotesTask.java b/src/org/openstreetmap/josm/actions/upload/UploadNotesTask.java
index 5ce841c..b9a3bf2 100644
--- a/src/org/openstreetmap/josm/actions/upload/UploadNotesTask.java
+++ b/src/org/openstreetmap/josm/actions/upload/UploadNotesTask.java
@@ -116,7 +116,7 @@ public class UploadNotesTask {
                     newNote = null;
                 }
                 updatedNotes.put(note, newNote);
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 Main.error("Failed to upload note to server: " + note.getId());
                 Main.error(e);
                 failedNotes.put(note, e);
diff --git a/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java b/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
index f1b3b06..51307a4 100644
--- a/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
+++ b/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
@@ -72,7 +72,6 @@ public class ValidateUploadHook implements UploadHook {
                 }
             }
         }
-        tests = null;
         OsmDataLayer editLayer = JosmAction.getEditLayer();
         if (editLayer != null) {
             editLayer.validationErrors.clear();
diff --git a/src/org/openstreetmap/josm/command/ChangeCommand.java b/src/org/openstreetmap/josm/command/ChangeCommand.java
index 31f09df..ecb5dd8 100644
--- a/src/org/openstreetmap/josm/command/ChangeCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangeCommand.java
@@ -75,11 +75,12 @@ public class ChangeCommand extends Command {
 
     @Override
     public String getDescriptionText() {
-        String msg = "";
+        String msg;
         switch(OsmPrimitiveType.from(osm)) {
         case NODE: msg = marktr("Change node {0}"); break;
         case WAY: msg = marktr("Change way {0}"); break;
         case RELATION: msg = marktr("Change relation {0}"); break;
+        default: throw new AssertionError();
         }
         return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
     }
diff --git a/src/org/openstreetmap/josm/command/ChangePropertyCommand.java b/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
index cedf8a7..5badabe 100644
--- a/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
@@ -160,6 +160,7 @@ public class ChangePropertyCommand extends Command {
                 case NODE: msg = marktr("Remove \"{0}\" for node ''{1}''"); break;
                 case WAY: msg = marktr("Remove \"{0}\" for way ''{1}''"); break;
                 case RELATION: msg = marktr("Remove \"{0}\" for relation ''{1}''"); break;
+                default: throw new AssertionError();
                 }
                 text = tr(msg, entry.getKey(), primitive.getDisplayName(DefaultNameFormatter.getInstance()));
             } else {
@@ -167,6 +168,7 @@ public class ChangePropertyCommand extends Command {
                 case NODE: msg = marktr("Set {0}={1} for node ''{2}''"); break;
                 case WAY: msg = marktr("Set {0}={1} for way ''{2}''"); break;
                 case RELATION: msg = marktr("Set {0}={1} for relation ''{2}''"); break;
+                default: throw new AssertionError();
                 }
                 text = tr(msg, entry.getKey(), entry.getValue(), primitive.getDisplayName(DefaultNameFormatter.getInstance()));
             }
diff --git a/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java b/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
index 6441e52..c57e468 100644
--- a/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
+++ b/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
@@ -62,7 +62,9 @@ public class ChangeRelationMemberRoleCommand extends Command {
     @Override
     public void undoCommand() {
         relation.setMember(position, new RelationMember(oldRole, relation.getMember(position).getMember()));
-        relation.setModified(oldModified);
+        if (oldModified != null) {
+            relation.setModified(oldModified);
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/command/Command.java b/src/org/openstreetmap/josm/command/Command.java
index a23483a..07cc022 100644
--- a/src/org/openstreetmap/josm/command/Command.java
+++ b/src/org/openstreetmap/josm/command/Command.java
@@ -62,7 +62,7 @@ public abstract class Command extends PseudoCommand {
      */
     public static class OldNodeState {
 
-        private final LatLon latlon;
+        private final LatLon latLon;
         private final EastNorth eastNorth; // cached EastNorth to be used for applying exact displacement
         private final boolean modified;
 
@@ -71,7 +71,7 @@ public abstract class Command extends PseudoCommand {
          * @param node The node whose state has to be remembered
          */
         public OldNodeState(Node node) {
-            latlon = node.getCoor();
+            latLon = node.getCoor();
             eastNorth = node.getEastNorth();
             modified = node.isModified();
         }
@@ -80,9 +80,10 @@ public abstract class Command extends PseudoCommand {
          * Returns old lat/lon.
          * @return old lat/lon
          * @see Node#getCoor()
+         * @since 10248
          */
-        public final LatLon getLatlon() {
-            return latlon;
+        public final LatLon getLatLon() {
+            return latLon;
         }
 
         /**
@@ -105,7 +106,7 @@ public abstract class Command extends PseudoCommand {
 
         @Override
         public int hashCode() {
-            return Objects.hash(latlon, eastNorth, modified);
+            return Objects.hash(latLon, eastNorth, modified);
         }
 
         @Override
@@ -114,7 +115,7 @@ public abstract class Command extends PseudoCommand {
             if (obj == null || getClass() != obj.getClass()) return false;
             OldNodeState that = (OldNodeState) obj;
             return modified == that.modified &&
-                    Objects.equals(latlon, that.latlon) &&
+                    Objects.equals(latLon, that.latLon) &&
                     Objects.equals(eastNorth, that.eastNorth);
         }
     }
diff --git a/src/org/openstreetmap/josm/command/DeleteCommand.java b/src/org/openstreetmap/josm/command/DeleteCommand.java
index 04a3779..edf5e39 100644
--- a/src/org/openstreetmap/josm/command/DeleteCommand.java
+++ b/src/org/openstreetmap/josm/command/DeleteCommand.java
@@ -7,6 +7,7 @@ import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.GridBagLayout;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -26,6 +27,7 @@ import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.SplitWayAction;
+import org.openstreetmap.josm.actions.SplitWayAction.SplitWayResult;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -157,8 +159,8 @@ public class DeleteCommand extends Command {
         // Do nothing
     }
 
-    private Set<OsmPrimitiveType> getTypesToDelete() {
-        Set<OsmPrimitiveType> typesToDelete = EnumSet.noneOf(OsmPrimitiveType.class);
+    private EnumSet<OsmPrimitiveType> getTypesToDelete() {
+        EnumSet<OsmPrimitiveType> typesToDelete = EnumSet.noneOf(OsmPrimitiveType.class);
         for (OsmPrimitive osm : toDelete) {
             typesToDelete.add(OsmPrimitiveType.from(osm));
         }
@@ -169,17 +171,18 @@ public class DeleteCommand extends Command {
     public String getDescriptionText() {
         if (toDelete.size() == 1) {
             OsmPrimitive primitive = toDelete.iterator().next();
-            String msg = "";
+            String msg;
             switch(OsmPrimitiveType.from(primitive)) {
             case NODE: msg = marktr("Delete node {0}"); break;
             case WAY: msg = marktr("Delete way {0}"); break;
             case RELATION:msg = marktr("Delete relation {0}"); break;
+            default: throw new AssertionError();
             }
 
             return tr(msg, primitive.getDisplayName(DefaultNameFormatter.getInstance()));
         } else {
             Set<OsmPrimitiveType> typesToDelete = getTypesToDelete();
-            String msg = "";
+            String msg;
             if (typesToDelete.size() > 1) {
                 msg = trn("Delete {0} object", "Delete {0} objects", toDelete.size(), toDelete.size());
             } else {
@@ -188,6 +191,7 @@ public class DeleteCommand extends Command {
                 case NODE: msg = trn("Delete {0} node", "Delete {0} nodes", toDelete.size(), toDelete.size()); break;
                 case WAY: msg = trn("Delete {0} way", "Delete {0} ways", toDelete.size(), toDelete.size()); break;
                 case RELATION: msg = trn("Delete {0} relation", "Delete {0} relations", toDelete.size(), toDelete.size()); break;
+                default: throw new AssertionError();
                 }
             }
             return msg;
@@ -469,10 +473,8 @@ public class DeleteCommand extends Command {
             wnew.setNodes(n1);
             return new ChangeCommand(ws.way, wnew);
         } else {
-            List<List<Node>> chunks = new ArrayList<>(2);
-            chunks.add(n1);
-            chunks.add(n2);
-            return SplitWayAction.splitWay(layer, ws.way, chunks, Collections.<OsmPrimitive>emptyList()).getCommand();
+            SplitWayResult split = SplitWayAction.splitWay(layer, ws.way, Arrays.asList(n1, n2), Collections.<OsmPrimitive>emptyList());
+            return split != null ? split.getCommand() : null;
         }
     }
 
diff --git a/src/org/openstreetmap/josm/command/MoveCommand.java b/src/org/openstreetmap/josm/command/MoveCommand.java
index f9d2118..3c474c5 100644
--- a/src/org/openstreetmap/josm/command/MoveCommand.java
+++ b/src/org/openstreetmap/josm/command/MoveCommand.java
@@ -217,7 +217,7 @@ public class MoveCommand extends Command {
         Iterator<OldNodeState> it = oldState.iterator();
         for (Node n : nodes) {
             OldNodeState os = it.next();
-            n.setCoor(os.getLatlon());
+            n.setCoor(os.getLatLon());
             n.setModified(os.isModified());
         }
     }
diff --git a/src/org/openstreetmap/josm/command/TransformNodesCommand.java b/src/org/openstreetmap/josm/command/TransformNodesCommand.java
index 4575463..bade457 100644
--- a/src/org/openstreetmap/josm/command/TransformNodesCommand.java
+++ b/src/org/openstreetmap/josm/command/TransformNodesCommand.java
@@ -94,7 +94,7 @@ public abstract class TransformNodesCommand extends Command {
     public void undoCommand() {
         for (Node n : nodes) {
             OldNodeState os = oldStates.get(n);
-            n.setCoor(os.getLatlon());
+            n.setCoor(os.getLatLon());
             n.setModified(os.isModified());
         }
     }
diff --git a/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java b/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java
index 4e49a11..a05ca34 100644
--- a/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java
@@ -16,8 +16,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * Represents the resolution of a conflict between the modified flag of two {@link OsmPrimitive}s.
- *
- *
+ * @since 2624
  */
 public class ModifiedConflictResolveCommand extends ConflictResolveCommand {
 
@@ -34,11 +33,12 @@ public class ModifiedConflictResolveCommand extends ConflictResolveCommand {
 
     @Override
     public String getDescriptionText() {
-        String msg = "";
+        String msg;
         switch(OsmPrimitiveType.from(conflict.getMy())) {
         case NODE: msg = marktr("Set the ''modified'' flag for node {0}"); break;
         case WAY: msg = marktr("Set the ''modified'' flag for way {0}"); break;
         case RELATION: msg = marktr("Set the ''modified'' flag for relation {0}"); break;
+        default: throw new AssertionError();
         }
         return tr(msg, conflict.getMy().getId());
     }
diff --git a/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java b/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java
index 709540c..07b1690 100644
--- a/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java
+++ b/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java
@@ -16,8 +16,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
  * Represents the resolution of a version conflict between two {@link OsmPrimitive}s.
- *
- *
+ * @since 1622
  */
 public class VersionConflictResolveCommand extends ConflictResolveCommand {
 
@@ -34,11 +33,12 @@ public class VersionConflictResolveCommand extends ConflictResolveCommand {
 
     @Override
     public String getDescriptionText() {
-        String msg = "";
+        String msg;
         switch(OsmPrimitiveType.from(conflict.getMy())) {
         case NODE: msg = marktr("Resolve version conflict for node {0}"); break;
         case WAY: msg = marktr("Resolve version conflict for way {0}"); break;
         case RELATION: msg = marktr("Resolve version conflict for relation {0}"); break;
+        default: throw new AssertionError();
         }
         return tr(msg, conflict.getMy().getId());
     }
diff --git a/src/org/openstreetmap/josm/data/AutosaveTask.java b/src/org/openstreetmap/josm/data/AutosaveTask.java
index 78c34d0..d872628 100644
--- a/src/org/openstreetmap/josm/data/AutosaveTask.java
+++ b/src/org/openstreetmap/josm/data/AutosaveTask.java
@@ -12,6 +12,7 @@ import java.io.PrintStream;
 import java.lang.management.ManagementFactory;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Deque;
@@ -72,11 +73,15 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
     /** Defines if a notification should be displayed after each autosave */
     public static final BooleanProperty PROP_NOTIFICATION = new BooleanProperty("autosave.notification", false);
 
-    private static class AutosaveLayerInfo {
-        private OsmDataLayer layer;
+    protected static final class AutosaveLayerInfo {
+        private final OsmDataLayer layer;
         private String layerName;
         private String layerFileName;
         private final Deque<File> backupFiles = new LinkedList<>();
+
+        AutosaveLayerInfo(OsmDataLayer layer) {
+            this.layer = layer;
+        }
     }
 
     private final DataSetListenerAdapter datasetAdapter = new DataSetListenerAdapter(this);
@@ -89,6 +94,15 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
     private final File autosaveDir = new File(Main.pref.getUserDataDirectory(), AUTOSAVE_DIR);
     private final File deletedLayersDir = new File(Main.pref.getUserDataDirectory(), DELETED_LAYERS_DIR);
 
+    /**
+     * Replies the autosave directory.
+     * @return the autosave directory
+     * @since 10299
+     */
+    public final Path getAutosaveDir() {
+        return autosaveDir.toPath();
+    }
+
     public void schedule() {
         if (PROP_INTERVAL.get() > 0) {
 
@@ -152,26 +166,20 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         }
     }
 
-    private File getNewLayerFile(AutosaveLayerInfo layer) {
-        int index = 0;
-        Date now = new Date();
+    protected File getNewLayerFile(AutosaveLayerInfo layer, Date now, int startIndex) {
+        int index = startIndex;
         while (true) {
             String filename = String.format("%1$s_%2$tY%2$tm%2$td_%2$tH%2$tM%2$tS%2$tL%3$s",
-                    layer.layerFileName, now, index == 0 ? "" : '_' + index);
-            File result = new File(autosaveDir, filename + "." + Main.pref.get("autosave.extension", "osm"));
+                    layer.layerFileName, now, index == 0 ? "" : ('_' + Integer.toString(index)));
+            File result = new File(autosaveDir, filename + '.' + Main.pref.get("autosave.extension", "osm"));
             try {
+                if (index > PROP_INDEX_LIMIT.get())
+                    throw new IOException("index limit exceeded");
                 if (result.createNewFile()) {
-                    File pidFile = new File(autosaveDir, filename+".pid");
-                    try (PrintStream ps = new PrintStream(pidFile, "UTF-8")) {
-                        ps.println(ManagementFactory.getRuntimeMXBean().getName());
-                    } catch (Exception t) {
-                        Main.error(t);
-                    }
+                    createNewPidFile(autosaveDir, filename);
                     return result;
                 } else {
                     Main.warn(tr("Unable to create file {0}, other filename will be used", result.getAbsolutePath()));
-                    if (index > PROP_INDEX_LIMIT.get())
-                        throw new IOException("index limit exceeded");
                 }
             } catch (IOException e) {
                 Main.error(tr("IOError while creating file, autosave will be skipped: {0}", e.getMessage()));
@@ -181,13 +189,22 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         }
     }
 
+    private static void createNewPidFile(File autosaveDir, String filename) {
+        File pidFile = new File(autosaveDir, filename+".pid");
+        try (PrintStream ps = new PrintStream(pidFile, "UTF-8")) {
+            ps.println(ManagementFactory.getRuntimeMXBean().getName());
+        } catch (IOException | SecurityException t) {
+            Main.error(t);
+        }
+    }
+
     private void savelayer(AutosaveLayerInfo info) {
         if (!info.layer.getName().equals(info.layerName)) {
             setLayerFileName(info);
             info.layerName = info.layer.getName();
         }
         if (changedDatasets.remove(info.layer.data)) {
-            File file = getNewLayerFile(info);
+            File file = getNewLayerFile(info, new Date(), 0);
             if (file != null) {
                 info.backupFiles.add(file);
                 new OsmExporter().exportData(file, info.layer, true /* no backup with appended ~ */);
@@ -212,7 +229,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
                 if (PROP_NOTIFICATION.get() && !layersInfo.isEmpty()) {
                     displayNotification();
                 }
-            } catch (Exception t) {
+            } catch (RuntimeException t) {
                 // Don't let exception stop time thread
                 Main.error("Autosave failed:");
                 Main.error(t);
@@ -239,9 +256,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
     private void registerNewlayer(OsmDataLayer layer) {
         synchronized (layersLock) {
             layer.data.addDataSetListener(datasetAdapter);
-            AutosaveLayerInfo info = new AutosaveLayerInfo();
-            info.layer = layer;
-            layersInfo.add(info);
+            layersInfo.add(new AutosaveLayerInfo(layer));
         }
     }
 
@@ -286,7 +301,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
         changedDatasets.add(event.getDataset());
     }
 
-    private File getPidFile(File osmFile) {
+    protected File getPidFile(File osmFile) {
         return new File(autosaveDir, osmFile.getName().replaceFirst("[.][^.]+$", ".pid"));
     }
 
@@ -311,7 +326,7 @@ public class AutosaveTask extends TimerTask implements LayerChangeListener, List
                             String pid = jvmId.split("@")[0];
                             skipFile = jvmPerfDataFileExists(pid);
                         }
-                    } catch (Exception t) {
+                    } catch (IOException | SecurityException t) {
                         Main.error(t);
                     }
                 }
diff --git a/src/org/openstreetmap/josm/data/CustomConfigurator.java b/src/org/openstreetmap/josm/data/CustomConfigurator.java
index c570a48..d59297d 100644
--- a/src/org/openstreetmap/josm/data/CustomConfigurator.java
+++ b/src/org/openstreetmap/josm/data/CustomConfigurator.java
@@ -9,6 +9,7 @@ import java.io.CharArrayReader;
 import java.io.CharArrayWriter;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -34,9 +35,13 @@ 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;
 import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
@@ -52,10 +57,12 @@ import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.plugins.ReadLocalPluginInformationTask;
 import org.openstreetmap.josm.tools.LanguageInfo;
 import org.openstreetmap.josm.tools.Utils;
+import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
 
 /**
  * Class to process configuration changes stored in XML
@@ -184,14 +191,14 @@ public final class CustomConfigurator {
      * @param text - message to display, HTML allowed
      */
     public static void messageBox(String type, String text) {
-        if (type == null || type.isEmpty()) type = "plain";
-
-        switch (type.charAt(0)) {
+        char c = (type == null || type.isEmpty() ? "plain" : type).charAt(0);
+        switch (c) {
             case 'i': JOptionPane.showMessageDialog(Main.parent, text, tr("Information"), JOptionPane.INFORMATION_MESSAGE); break;
             case 'w': JOptionPane.showMessageDialog(Main.parent, text, tr("Warning"), JOptionPane.WARNING_MESSAGE); break;
             case 'e': JOptionPane.showMessageDialog(Main.parent, text, tr("Error"), JOptionPane.ERROR_MESSAGE); break;
             case 'q': JOptionPane.showMessageDialog(Main.parent, text, tr("Question"), JOptionPane.QUESTION_MESSAGE); break;
             case 'p': JOptionPane.showMessageDialog(Main.parent, text, tr("Message"), JOptionPane.PLAIN_MESSAGE); break;
+            default: Main.warn("Unsupported messageBox type: " + c);
         }
     }
 
@@ -202,25 +209,18 @@ public final class CustomConfigurator {
      * @return number of pressed button, -1 if cancelled
      */
     public static int askForOption(String text, String opts) {
-        Integer answer;
         if (!opts.isEmpty()) {
-            String[] options = opts.split(";");
-            answer = JOptionPane.showOptionDialog(Main.parent, text, "Question",
-                    JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, 0);
+            return JOptionPane.showOptionDialog(Main.parent, text, "Question",
+                    JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, opts.split(";"), 0);
         } else {
-            answer = JOptionPane.showOptionDialog(Main.parent, text, "Question",
+            return JOptionPane.showOptionDialog(Main.parent, text, "Question",
                     JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, 2);
         }
-        if (answer == null) return -1; else return answer;
     }
 
     public static String askForText(String text) {
         String s = JOptionPane.showInputDialog(Main.parent, text, tr("Enter text"), JOptionPane.QUESTION_MESSAGE);
-        if (s != null && !(s = s.trim()).isEmpty()) {
-            return s;
-        } else {
-            return "";
-        }
+        return s != null ? s.trim() : null;
     }
 
     /**
@@ -276,10 +276,10 @@ public final class CustomConfigurator {
             document = builder.parse(is);
             exportDocument = builder.newDocument();
             root = document.getDocumentElement();
-        } catch (Exception ex) {
+        } catch (SAXException | IOException | ParserConfigurationException ex) {
             Main.warn("Error getting preferences to save:" +ex.getMessage());
         }
-        if (root == null)
+        if (root == null || exportDocument == null)
             return;
         try {
             Element newRoot = exportDocument.createElement("config");
@@ -305,7 +305,7 @@ public final class CustomConfigurator {
             Transformer ts = TransformerFactory.newInstance().newTransformer();
             ts.setOutputProperty(OutputKeys.INDENT, "yes");
             ts.transform(new DOMSource(exportDocument), new StreamResult(f.toURI().getPath()));
-        } catch (Exception ex) {
+        } catch (DOMException | TransformerFactoryConfigurationError | TransformerException ex) {
             Main.warn("Error saving preferences part:");
             Main.error(ex);
         }
@@ -457,7 +457,7 @@ public final class CustomConfigurator {
                 try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
                     openAndReadXML(is);
                 }
-            } catch (Exception ex) {
+            } catch (ScriptException | IOException | SecurityException ex) {
                 log("Error reading custom preferences: " + ex.getMessage());
             }
         }
@@ -472,7 +472,7 @@ public final class CustomConfigurator {
                 synchronized (CustomConfigurator.class) {
                     processXML(document);
                 }
-            } catch (Exception ex) {
+            } catch (SAXException | IOException | ParserConfigurationException ex) {
                 log("Error reading custom preferences: "+ex.getMessage());
             }
             log("-- Reading complete --");
@@ -498,7 +498,7 @@ public final class CustomConfigurator {
                 engine.eval("API.pluginInstall = function(names) { "+className+".pluginOperation(names,'','');}");
                 engine.eval("API.pluginUninstall = function(names) { "+className+".pluginOperation('',names,'');}");
                 engine.eval("API.pluginDelete = function(names) { "+className+".pluginOperation('','',names);}");
-            } catch (Exception ex) {
+            } catch (ScriptException ex) {
                 log("Error: initializing script engine: "+ex.getMessage());
                 Main.error(ex);
             }
@@ -753,7 +753,7 @@ public final class CustomConfigurator {
 
                 CharArrayReader reader = new CharArrayReader(fragmentWithReplacedVars.toCharArray());
                 tmpPref.fromXML(reader);
-            } catch (Exception ex) {
+            } catch (TransformerException | XMLStreamException | IOException ex) {
                 log("Error: can not read XML fragment :" + ex.getMessage());
             }
 
diff --git a/src/org/openstreetmap/josm/data/Preferences.java b/src/org/openstreetmap/josm/data/Preferences.java
index a2dad2c..b090210 100644
--- a/src/org/openstreetmap/josm/data/Preferences.java
+++ b/src/org/openstreetmap/josm/data/Preferences.java
@@ -98,7 +98,7 @@ public class Preferences {
     private static final String[] OBSOLETE_PREF_KEYS = {
     };
 
-    private static final long MAX_AGE_DEFAULT_PREFERENCES = 60 * 60 * 24 * 50; // 50 days (in seconds)
+    private static final long MAX_AGE_DEFAULT_PREFERENCES = 60L * 60L * 24L * 50L; // 50 days (in seconds)
 
     /**
      * Internal storage for the preference directory.
@@ -730,21 +730,13 @@ public class Preferences {
 
     /* only for preferences */
     public synchronized String getColorName(String o) {
-        try {
-            Matcher m = Pattern.compile("mappaint\\.(.+?)\\.(.+)").matcher(o);
-            if (m.matches()) {
-                return tr("Paint style {0}: {1}", tr(I18n.escape(m.group(1))), tr(I18n.escape(m.group(2))));
-            }
-        } catch (Exception e) {
-            Main.warn(e);
+        Matcher m = Pattern.compile("mappaint\\.(.+?)\\.(.+)").matcher(o);
+        if (m.matches()) {
+            return tr("Paint style {0}: {1}", tr(I18n.escape(m.group(1))), tr(I18n.escape(m.group(2))));
         }
-        try {
-            Matcher m = Pattern.compile("layer (.+)").matcher(o);
-            if (m.matches()) {
-                return tr("Layer: {0}", tr(I18n.escape(m.group(1))));
-            }
-        } catch (Exception e) {
-            Main.warn(e);
+        m = Pattern.compile("layer (.+)").matcher(o);
+        if (m.matches()) {
+            return tr("Layer: {0}", tr(I18n.escape(m.group(1))));
         }
         return tr(I18n.escape(colornames.containsKey(o) ? colornames.get(o) : o));
     }
@@ -1208,9 +1200,9 @@ public class Preferences {
     public static <T> Map<String, String> serializeStruct(T struct, Class<T> klass) {
         T structPrototype;
         try {
-            structPrototype = klass.newInstance();
-        } catch (InstantiationException | IllegalAccessException ex) {
-            throw new RuntimeException(ex);
+            structPrototype = klass.getConstructor().newInstance();
+        } catch (ReflectiveOperationException ex) {
+            throw new IllegalArgumentException(ex);
         }
 
         Map<String, String> hash = new LinkedHashMap<>();
@@ -1218,23 +1210,21 @@ public class Preferences {
             if (f.getAnnotation(pref.class) == null) {
                 continue;
             }
-            f.setAccessible(true);
+            Utils.setObjectsAccessible(f);
             try {
                 Object fieldValue = f.get(struct);
                 Object defaultFieldValue = f.get(structPrototype);
-                if (fieldValue != null) {
-                    if (f.getAnnotation(writeExplicitly.class) != null || !Objects.equals(fieldValue, defaultFieldValue)) {
-                        String key = f.getName().replace('_', '-');
-                        if (fieldValue instanceof Map) {
-                            hash.put(key, mapToJson((Map) fieldValue));
-                        } else if (fieldValue instanceof MultiMap) {
-                            hash.put(key, multiMapToJson((MultiMap) fieldValue));
-                        } else {
-                            hash.put(key, fieldValue.toString());
-                        }
+                if (fieldValue != null && (f.getAnnotation(writeExplicitly.class) != null || !Objects.equals(fieldValue, defaultFieldValue))) {
+                    String key = f.getName().replace('_', '-');
+                    if (fieldValue instanceof Map) {
+                        hash.put(key, mapToJson((Map<?, ?>) fieldValue));
+                    } else if (fieldValue instanceof MultiMap) {
+                        hash.put(key, multiMapToJson((MultiMap<?, ?>) fieldValue));
+                    } else {
+                        hash.put(key, fieldValue.toString());
                     }
                 }
-            } catch (IllegalArgumentException | IllegalAccessException ex) {
+            } catch (IllegalAccessException ex) {
                 throw new RuntimeException(ex);
             }
         }
@@ -1257,24 +1247,22 @@ public class Preferences {
     public static <T> T deserializeStruct(Map<String, String> hash, Class<T> klass) {
         T struct = null;
         try {
-            struct = klass.newInstance();
-        } catch (InstantiationException | IllegalAccessException ex) {
+            struct = klass.getConstructor().newInstance();
+        } catch (ReflectiveOperationException ex) {
             throw new RuntimeException(ex);
         }
         for (Entry<String, String> key_value : hash.entrySet()) {
-            Object value = null;
+            Object value;
             Field f;
             try {
                 f = klass.getDeclaredField(key_value.getKey().replace('-', '_'));
             } catch (NoSuchFieldException ex) {
                 continue;
-            } catch (SecurityException ex) {
-                throw new RuntimeException(ex);
             }
             if (f.getAnnotation(pref.class) == null) {
                 continue;
             }
-            f.setAccessible(true);
+            Utils.setObjectsAccessible(f);
             if (f.getType() == Boolean.class || f.getType() == boolean.class) {
                 value = Boolean.valueOf(key_value.getValue());
             } else if (f.getType() == Integer.class || f.getType() == int.class) {
@@ -1333,12 +1321,9 @@ public class Preferences {
         if (!GraphicsEnvironment.isHeadless()) {
             try {
                 Field field = Toolkit.class.getDeclaredField("resources");
-                field.setAccessible(true);
+                Utils.setObjectsAccessible(field);
                 field.set(null, ResourceBundle.getBundle("sun.awt.resources.awt"));
-            } catch (Exception | InternalError e) {
-                // Ignore all exceptions, including internal error raised by Java 9 Jigsaw EA:
-                // java.lang.InternalError: legacy getBundle can't be used to find sun.awt.resources.awt in module java.desktop
-                // InternalError catch to remove when https://bugs.openjdk.java.net/browse/JDK-8136804 is resolved
+            } catch (ReflectiveOperationException e) {
                 if (Main.isTraceEnabled()) {
                     Main.trace(e.getMessage());
                 }
diff --git a/src/org/openstreetmap/josm/data/ProjectionBounds.java b/src/org/openstreetmap/josm/data/ProjectionBounds.java
index e14d518..1e4059a 100644
--- a/src/org/openstreetmap/josm/data/ProjectionBounds.java
+++ b/src/org/openstreetmap/josm/data/ProjectionBounds.java
@@ -105,7 +105,7 @@ public class ProjectionBounds {
 
     @Override
     public String toString() {
-        return "ProjectionBounds["+minEast+","+minNorth+","+maxEast+","+maxNorth+']';
+        return "ProjectionBounds["+minEast+','+minNorth+','+maxEast+','+maxNorth+']';
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
index 060827f..f403de6 100644
--- a/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
+++ b/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
@@ -4,6 +4,7 @@ package org.openstreetmap.josm.data;
 import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.text.NumberFormat;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
@@ -38,25 +39,28 @@ public class SystemOfMeasurement {
      * Metric system (international standard).
      * @since 3406
      */
-    public static final SystemOfMeasurement METRIC = new SystemOfMeasurement(1, "m", 1000, "km", 10000, "ha");
+    public static final SystemOfMeasurement METRIC = new SystemOfMeasurement(1, "m", 1000, "km", "km/h", 3.6, 10000, "ha");
 
     /**
      * Chinese system.
+     * See <a href="https://en.wikipedia.org/wiki/Chinese_units_of_measurement#Chinese_length_units_effective_in_1930">length units</a>,
+     * <a href="https://en.wikipedia.org/wiki/Chinese_units_of_measurement#Chinese_area_units_effective_in_1930">area units</a>
      * @since 3406
      */
-    public static final SystemOfMeasurement CHINESE = new SystemOfMeasurement(1.0/3.0, "\u5e02\u5c3a" /* chi */, 500, "\u5e02\u91cc" /* li */);
+    public static final SystemOfMeasurement CHINESE = new SystemOfMeasurement(1.0/3.0, "\u5e02\u5c3a" /* chi */, 500, "\u5e02\u91cc" /* li */,
+            "km/h", 3.6, 666.0 + 2.0/3.0, "\u4ea9" /* mu */);
 
     /**
      * Imperial system (British Commonwealth and former British Empire).
      * @since 3406
      */
-    public static final SystemOfMeasurement IMPERIAL = new SystemOfMeasurement(0.3048, "ft", 1609.344, "mi", 4046.86, "ac");
+    public static final SystemOfMeasurement IMPERIAL = new SystemOfMeasurement(0.3048, "ft", 1609.344, "mi", "mph", 2.23694, 4046.86, "ac");
 
     /**
      * Nautical mile system (navigation, polar exploration).
      * @since 5549
      */
-    public static final SystemOfMeasurement NAUTICAL_MILE = new SystemOfMeasurement(185.2, "kbl", 1852, "NM");
+    public static final SystemOfMeasurement NAUTICAL_MILE = new SystemOfMeasurement(185.2, "kbl", 1852, "NM", "kn", 1.94384);
 
     /**
      * Known systems of measurement.
@@ -64,11 +68,12 @@ public class SystemOfMeasurement {
      */
     public static final Map<String, SystemOfMeasurement> ALL_SYSTEMS;
     static {
-        ALL_SYSTEMS = new LinkedHashMap<>();
-        ALL_SYSTEMS.put(marktr("Metric"), METRIC);
-        ALL_SYSTEMS.put(marktr("Chinese"), CHINESE);
-        ALL_SYSTEMS.put(marktr("Imperial"), IMPERIAL);
-        ALL_SYSTEMS.put(marktr("Nautical Mile"), NAUTICAL_MILE);
+        Map<String, SystemOfMeasurement> map = new LinkedHashMap<>();
+        map.put(marktr("Metric"), METRIC);
+        map.put(marktr("Chinese"), CHINESE);
+        map.put(marktr("Imperial"), IMPERIAL);
+        map.put(marktr("Nautical Mile"), NAUTICAL_MILE);
+        ALL_SYSTEMS = Collections.unmodifiableMap(map);
     }
 
     private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<>();
@@ -137,6 +142,12 @@ public class SystemOfMeasurement {
     public final String aName;
     /** Second unit used to format text. */
     public final String bName;
+    /** Speed value for the most common speed symbol, in meters per second
+     *  @since 10175 */
+    public final double speedValue;
+    /** Most common speed symbol (kmh/h, mph, kn, etc.)
+     *  @since 10175 */
+    public final String speedName;
     /** Specific optional area value, in squared meters, between {@code aValue*aValue} and {@code bValue*bValue}. Set to {@code -1} if not used.
      *  @since 5870 */
     public final double areaCustomValue;
@@ -154,9 +165,12 @@ public class SystemOfMeasurement {
      * @param aName First unit used to format text.
      * @param bValue Second value, in meters, used to translate unit according to above formula.
      * @param bName Second unit used to format text.
+     * @param speedName the most common speed symbol (kmh/h, mph, kn, etc.)
+     * @param speedValue the speed value for the most common speed symbol, for 1 meter per second
+     * @since 10175
      */
-    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName) {
-        this(aValue, aName, bValue, bName, -1, null);
+    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName, String speedName, double speedValue) {
+        this(aValue, aName, bValue, bName, speedName, speedValue, -1, null);
     }
 
     /**
@@ -169,17 +183,22 @@ public class SystemOfMeasurement {
      * @param aName First unit used to format text.
      * @param bValue Second value, in meters, used to translate unit according to above formula.
      * @param bName Second unit used to format text.
+     * @param speedName the most common speed symbol (kmh/h, mph, kn, etc.)
+     * @param speedValue the speed value for the most common speed symbol, for 1 meter per second
      * @param areaCustomValue Specific optional area value, in squared meters, between {@code aValue*aValue} and {@code bValue*bValue}.
      *                        Set to {@code -1} if not used.
      * @param areaCustomName Specific optional area unit. Set to {@code null} if not used.
      *
-     * @since 5870
+     * @since 10175
      */
-    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName, double areaCustomValue, String areaCustomName) {
+    public SystemOfMeasurement(double aValue, String aName, double bValue, String bName, String speedName, double speedValue,
+            double areaCustomValue, String areaCustomName) {
         this.aValue = aValue;
         this.aName = aName;
         this.bValue = bValue;
         this.bName = bName;
+        this.speedValue = speedValue;
+        this.speedName = speedName;
         this.areaCustomValue = areaCustomValue;
         this.areaCustomName = areaCustomName;
     }
@@ -248,6 +267,6 @@ public class SystemOfMeasurement {
         if (format != null) {
             return format.format(v) + ' ' + unit;
         }
-        return String.format(Locale.US, "%." + (v < 9.999999 ? 2 : 1) + "f %s", v, unit);
+        return String.format(Locale.US, v < 9.999999 ? "%.2f %s" : "%.1f %s", v, unit);
     }
 }
diff --git a/src/org/openstreetmap/josm/data/Version.java b/src/org/openstreetmap/josm/data/Version.java
index 8cde3cf..9f1c41b 100644
--- a/src/org/openstreetmap/josm/data/Version.java
+++ b/src/org/openstreetmap/josm/data/Version.java
@@ -190,7 +190,7 @@ public class Version {
         if (isLocalBuild() && v != JOSM_UNKNOWN_VERSION) {
             s += " SVN";
         }
-        String result = "JOSM/1.5 ("+ s+' '+LanguageInfo.getJOSMLocaleCode()+")";
+        String result = "JOSM/1.5 ("+ s+' '+LanguageInfo.getJOSMLocaleCode()+')';
         if (includeOsDetails && Main.platform != null) {
             result += ' ' + Main.platform.getOSDescription();
         }
diff --git a/src/org/openstreetmap/josm/data/cache/BufferedImageCacheEntry.java b/src/org/openstreetmap/josm/data/cache/BufferedImageCacheEntry.java
index eafb3fe..06fe61e 100644
--- a/src/org/openstreetmap/josm/data/cache/BufferedImageCacheEntry.java
+++ b/src/org/openstreetmap/josm/data/cache/BufferedImageCacheEntry.java
@@ -47,11 +47,7 @@ public class BufferedImageCacheEntry extends CacheEntry {
             if (content != null && content.length > 0) {
                 img = ImageIO.read(new ByteArrayInputStream(content));
                 imageLoaded = true;
-
-                if (writtenToDisk)
-                    content = null;
             }
-
         }
         return img;
     }
diff --git a/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java b/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
index c584fcb..e148423 100644
--- a/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
+++ b/src/org/openstreetmap/josm/data/cache/JCSCacheManager.java
@@ -16,8 +16,8 @@ import org.apache.commons.jcs.access.CacheAccess;
 import org.apache.commons.jcs.auxiliary.AuxiliaryCache;
 import org.apache.commons.jcs.auxiliary.AuxiliaryCacheFactory;
 import org.apache.commons.jcs.auxiliary.disk.behavior.IDiskCacheAttributes;
-import org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes;
-import org.apache.commons.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory;
+import org.apache.commons.jcs.auxiliary.disk.block.BlockDiskCacheAttributes;
+import org.apache.commons.jcs.auxiliary.disk.block.BlockDiskCacheFactory;
 import org.apache.commons.jcs.engine.CompositeCacheAttributes;
 import org.apache.commons.jcs.engine.behavior.ICompositeCacheAttributes.DiskUsagePattern;
 import org.apache.commons.jcs.engine.control.CompositeCache;
@@ -40,7 +40,7 @@ public final class JCSCacheManager {
     private static volatile CompositeCacheManager cacheManager;
     private static long maxObjectTTL        = -1;
     private static final String PREFERENCE_PREFIX = "jcs.cache";
-    private static final AuxiliaryCacheFactory diskCacheFactory = new IndexedDiskCacheFactory();
+    private static final AuxiliaryCacheFactory diskCacheFactory = new BlockDiskCacheFactory();
     private static FileLock cacheDirLock;
 
     /**
@@ -157,7 +157,8 @@ public final class JCSCacheManager {
     }
 
     @SuppressWarnings("unchecked")
-    private static <K, V> CacheAccess<K, V> getCacheInner(String cacheName, int maxMemoryObjects, int maxDiskObjects, String cachePath) {
+    private static <K, V> CacheAccess<K, V> getCacheInner(String cacheName, int maxMemoryObjects, int maxDiskObjects, String cachePath)
+            throws IOException {
         CompositeCache<K, V> cc = cacheManager.getCache(cacheName, getCacheAttributes(maxMemoryObjects));
 
         if (cachePath != null && cacheDirLock != null) {
@@ -168,8 +169,10 @@ public final class JCSCacheManager {
                     AuxiliaryCache<K, V> diskCache = diskCacheFactory.createCache(diskAttributes, cacheManager, null, new StandardSerializer());
                     cc.setAuxCaches(new AuxiliaryCache[]{diskCache});
                 }
+            } catch (IOException e) {
+                throw e;
             } catch (Exception e) {
-                throw new RuntimeException(e);
+                throw new IOException(e);
             }
         }
         return new CacheAccess<>(cc);
@@ -187,7 +190,7 @@ public final class JCSCacheManager {
     }
 
     private static IDiskCacheAttributes getDiskCacheAttributes(int maxDiskObjects, String cachePath) {
-        IndexedDiskCacheAttributes ret = new IndexedDiskCacheAttributes();
+        BlockDiskCacheAttributes ret = new BlockDiskCacheAttributes();
         ret.setDiskLimitType(IDiskCacheAttributes.DiskLimitType.SIZE);
         ret.setMaxKeySize(maxDiskObjects);
         if (cachePath != null) {
diff --git a/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java b/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
index e6c1f86..eaaed62 100644
--- a/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
+++ b/src/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJob.java
@@ -4,10 +4,10 @@ package org.openstreetmap.josm.data.cache;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.URL;
+import java.security.SecureRandom;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -26,6 +26,8 @@ import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.Utils;
 
+import sun.net.www.protocol.http.HttpURLConnection;
+
 /**
  * @author Wiktor Niesiobędzki
  *
@@ -294,7 +296,6 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
     /**
      * @return true if object was successfully downloaded, false, if there was a loading failure
      */
-
     private boolean loadObject() {
         if (attributes == null) {
             attributes = new CacheEntryAttributes();
@@ -339,18 +340,17 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
                 useHead.put(serverKey, Boolean.TRUE);
             }
 
-
             attributes = parseHeaders(urlConn);
 
             for (int i = 0; i < 5; ++i) {
-                if (urlConn.getResponseCode() == 503) {
-                    Thread.sleep(5000+(new Random()).nextInt(5000));
+                if (urlConn.getResponseCode() == HttpURLConnection.HTTP_UNAVAILABLE) {
+                    Thread.sleep(5000L+new SecureRandom().nextInt(5000));
                     continue;
                 }
 
                 attributes.setResponseCode(urlConn.getResponseCode());
                 byte[] raw;
-                if (urlConn.getResponseCode() == 200) {
+                if (urlConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                     raw = Utils.readBytesFromStream(urlConn.getContent());
                 } else {
                     raw = new byte[]{};
@@ -394,14 +394,13 @@ public abstract class JCSCachedTileLoaderJob<K, V extends CacheEntry> implements
                 cache.put(getCacheKey(), createCacheEntry(new byte[]{}), attributes);
             }
             return doCache;
-        } catch (Exception e) {
+        } catch (InterruptedException e) {
             attributes.setErrorMessage(e.toString());
             log.log(Level.WARNING, "JCS - Exception during download {0}",  getUrlNoException());
             Main.warn(e);
         }
         log.log(Level.WARNING, "JCS - Silent failure during download: {0}", getUrlNoException());
         return false;
-
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/coor/LatLon.java b/src/org/openstreetmap/josm/data/coor/LatLon.java
index 0d2471a..7c18c29 100644
--- a/src/org/openstreetmap/josm/data/coor/LatLon.java
+++ b/src/org/openstreetmap/josm/data/coor/LatLon.java
@@ -173,7 +173,7 @@ public class LatLon extends Coordinate {
 
         if (cDms60.equals(sSeconds)) {
             sSeconds = cDms00;
-            sMinutes = cDmsMinuteFormatter.format(tMinutes+1);
+            sMinutes = cDmsMinuteFormatter.format(tMinutes+1L);
         }
         if ("60".equals(sMinutes)) {
             sMinutes = "00";
diff --git a/src/org/openstreetmap/josm/data/coor/QuadTiling.java b/src/org/openstreetmap/josm/data/coor/QuadTiling.java
index 739d991..afd8fa5 100644
--- a/src/org/openstreetmap/josm/data/coor/QuadTiling.java
+++ b/src/org/openstreetmap/josm/data/coor/QuadTiling.java
@@ -24,9 +24,9 @@ public final class QuadTiling {
         // The world is divided up into X_PARTS,Y_PARTS.
         // The question is how far we move for each bit being set.
         // In the case of the top level, we move half of the world.
-        double xUnit = X_PARTS/2;
-        double yUnit = Y_PARTS/2;
-        long shift = (NR_LEVELS*2)-2;
+        double xUnit = X_PARTS/2d;
+        double yUnit = Y_PARTS/2d;
+        long shift = (NR_LEVELS*2L)-2L;
 
         double x = 0;
         double y = 0;
diff --git a/src/org/openstreetmap/josm/data/gpx/GpxConstants.java b/src/org/openstreetmap/josm/data/gpx/GpxConstants.java
index 72b6344..edfea57 100644
--- a/src/org/openstreetmap/josm/data/gpx/GpxConstants.java
+++ b/src/org/openstreetmap/josm/data/gpx/GpxConstants.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.data.gpx;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
@@ -88,18 +89,18 @@ public interface GpxConstants {
     /**
      * Ordered list of all possible waypoint keys.
      */
-    List<String> WPT_KEYS = Arrays.asList(PT_ELE, PT_TIME, PT_MAGVAR, PT_GEOIDHEIGHT,
+    List<String> WPT_KEYS = Collections.unmodifiableList(Arrays.asList(PT_ELE, PT_TIME, PT_MAGVAR, PT_GEOIDHEIGHT,
             GPX_NAME, GPX_CMT, GPX_DESC, GPX_SRC, META_LINKS, PT_SYM, PT_TYPE,
-            PT_FIX, PT_SAT, PT_HDOP, PT_VDOP, PT_PDOP, PT_AGEOFDGPSDATA, PT_DGPSID, META_EXTENSIONS);
+            PT_FIX, PT_SAT, PT_HDOP, PT_VDOP, PT_PDOP, PT_AGEOFDGPSDATA, PT_DGPSID, META_EXTENSIONS));
 
     /**
      * Ordered list of all possible route and track keys.
      */
-    List<String> RTE_TRK_KEYS = Arrays.asList(
-            GPX_NAME, GPX_CMT, GPX_DESC, GPX_SRC, META_LINKS, "number", PT_TYPE, META_EXTENSIONS);
+    List<String> RTE_TRK_KEYS = Collections.unmodifiableList(Arrays.asList(
+            GPX_NAME, GPX_CMT, GPX_DESC, GPX_SRC, META_LINKS, "number", PT_TYPE, META_EXTENSIONS));
 
     /**
      * Possible fix values.
      */
-    Collection<String> FIX_VALUES = Arrays.asList("none", "2d", "3d", "dgps", "pps");
+    Collection<String> FIX_VALUES = Collections.unmodifiableList(Arrays.asList("none", "2d", "3d", "dgps", "pps"));
 }
diff --git a/src/org/openstreetmap/josm/data/gpx/WayPoint.java b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
index 37d865e..510f90f 100644
--- a/src/org/openstreetmap/josm/data/gpx/WayPoint.java
+++ b/src/org/openstreetmap/josm/data/gpx/WayPoint.java
@@ -11,6 +11,7 @@ import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 
@@ -123,7 +124,7 @@ public class WayPoint extends WithAttributes implements Comparable<WayPoint>, Te
                 final Date time = DateUtils.fromString(get(PT_TIME).toString());
                 this.time = time.getTime() / 1000.;
                 return time;
-            } catch (Exception e) {
+            } catch (UncheckedParseException e) {
                 Main.warn(e);
                 time = 0;
             }
diff --git a/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java b/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java
index 7a9b1d5..2a286b3 100644
--- a/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java
+++ b/src/org/openstreetmap/josm/data/imagery/CachedTileLoaderFactory.java
@@ -3,7 +3,6 @@ package org.openstreetmap.josm.data.imagery;
 
 import java.io.File;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -32,7 +31,7 @@ public class CachedTileLoaderFactory implements TileLoaderFactory {
     /**
      * @param cache cache instance which will be used by tile loaders created by this tile loader
      * @param tileLoaderClass tile loader class that will be created
-     *
+     * @throws IllegalArgumentException if a suitable constructor cannot be found for {@code tileLoaderClass}
      */
     public CachedTileLoaderFactory(ICacheAccess<String, BufferedImageCacheEntry> cache, Class<? extends TileLoader> tileLoaderClass) {
         this.cache = cache;
@@ -45,7 +44,7 @@ public class CachedTileLoaderFactory implements TileLoaderFactory {
                     Map.class);
         } catch (NoSuchMethodException | SecurityException e) {
             Main.warn(e);
-            throw new RuntimeException(e);
+            throw new IllegalArgumentException(e);
         }
     }
 
@@ -87,9 +86,12 @@ public class CachedTileLoaderFactory implements TileLoaderFactory {
                     connectTimeout,
                     readTimeout,
                     headers);
-        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
+        } catch (IllegalArgumentException e) {
             Main.warn(e);
-            throw new RuntimeException(e);
+            throw e;
+        } catch (ReflectiveOperationException e) {
+            Main.warn(e);
+            throw new IllegalArgumentException(e);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
index 7b4931f..ef417fa 100644
--- a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
+++ b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
@@ -664,16 +664,12 @@ public class ImageryInfo extends TileSourceInfo implements Comparable<ImageryInf
         }
 
         if (serverProjections == null || serverProjections.isEmpty()) {
-            try {
-                serverProjections = new ArrayList<>();
-                Matcher m = Pattern.compile(".*\\{PROJ\\(([^)}]+)\\)\\}.*").matcher(url.toUpperCase(Locale.ENGLISH));
-                if (m.matches()) {
-                    for (String p : m.group(1).split(",")) {
-                        serverProjections.add(p);
-                    }
+            serverProjections = new ArrayList<>();
+            Matcher m = Pattern.compile(".*\\{PROJ\\(([^)}]+)\\)\\}.*").matcher(url.toUpperCase(Locale.ENGLISH));
+            if (m.matches()) {
+                for (String p : m.group(1).split(",")) {
+                    serverProjections.add(p);
                 }
-            } catch (Exception e) {
-                Main.warn(e);
             }
         }
     }
@@ -866,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/TMSCachedTileLoaderJob.java b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
index cb4c25e..a2368e4 100644
--- a/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
+++ b/src/org/openstreetmap/josm/data/imagery/TMSCachedTileLoaderJob.java
@@ -151,7 +151,7 @@ public class TMSCachedTileLoaderJob extends JCSCachedTileLoaderJob<String, Buffe
         tile.initLoading();
         try {
             super.submit(this, force);
-        } catch (Exception e) {
+        } catch (IOException e) {
             // if we fail to submit the job, mark tile as loaded and set error message
             tile.finishLoading();
             tile.setError(e.getMessage());
diff --git a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
index 2b8d2eb..6e808ee 100644
--- a/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSource.java
@@ -118,7 +118,7 @@ public class TemplatedWMSTileSource extends TMSTileSource implements TemplatedTi
         for (int zoom = 1; zoom <= getMaxZoom(); zoom++) {
             // use well known scale set "GoogleCompatibile" from OGC WMTS spec to calculate number of tiles per zoom level
             // this makes the zoom levels "glued" to standard TMS zoom levels
-            degreesPerTile[zoom] = (SCALE_DENOMINATOR_ZOOM_LEVEL_1 / Math.pow(2, zoom - 1)) * crsScale;
+            degreesPerTile[zoom] = (SCALE_DENOMINATOR_ZOOM_LEVEL_1 / Math.pow(2d, zoom - 1d)) * crsScale;
             TileXY minTileIndex = eastNorthToTileXY(topLeft, zoom);
             tileXMin[zoom] = minTileIndex.getXIndex();
             tileYMin[zoom] = minTileIndex.getYIndex();
diff --git a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
index 74cf0a1..c8a5b80 100644
--- a/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
+++ b/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
@@ -251,6 +251,7 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
      * Creates a tile source based on imagery info
      * @param info imagery info
      * @throws IOException if any I/O error occurs
+     * @throws IllegalArgumentException if any other error happens for the given imagery info
      */
     public WMTSTileSource(ImageryInfo info) throws IOException {
         super(info);
@@ -289,7 +290,12 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
         return output.toString();
     }
 
-    private Collection<Layer> getCapabilities() {
+    /**
+     * @return capabilities
+     * @throws IOException in case of any I/O error
+     * @throws IllegalArgumentException in case of any other error
+     */
+    private Collection<Layer> getCapabilities() throws IOException {
         XMLInputFactory factory = XMLInputFactory.newFactory();
         // do not try to load external entities, nor validate the XML
         factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE);
@@ -319,7 +325,7 @@ public class WMTSTileSource extends AbstractTMSTileSource implements TemplatedTi
                 }
             }
             return ret;
-        } catch (Exception e) {
+        } catch (XMLStreamException e) {
             throw new IllegalArgumentException(e);
         }
     }
diff --git a/src/org/openstreetmap/josm/data/notes/Note.java b/src/org/openstreetmap/josm/data/notes/Note.java
index 1692dd3..ccdd77f 100644
--- a/src/org/openstreetmap/josm/data/notes/Note.java
+++ b/src/org/openstreetmap/josm/data/notes/Note.java
@@ -147,6 +147,6 @@ public class Note {
 
     @Override
     public String toString() {
-        return tr("Note") + " " + id + ": " + getFirstComment();
+        return tr("Note") + ' ' + id + ": " + getFirstComment();
     }
 }
diff --git a/src/org/openstreetmap/josm/data/oauth/OAuthParameters.java b/src/org/openstreetmap/josm/data/oauth/OAuthParameters.java
index dc00c0a..afe4eb9 100644
--- a/src/org/openstreetmap/josm/data/oauth/OAuthParameters.java
+++ b/src/org/openstreetmap/josm/data/oauth/OAuthParameters.java
@@ -1,16 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.oauth;
 
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.Objects;
 
-import oauth.signpost.OAuthConsumer;
-import oauth.signpost.OAuthProvider;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
+
+import oauth.signpost.OAuthConsumer;
+import oauth.signpost.OAuthProvider;
 
 /**
  * This class manages an immutable set of OAuth parameters.
@@ -51,13 +51,8 @@ public class OAuthParameters {
         final String consumerSecret;
         final String serverUrl;
 
-        if (apiUrl != null) {
-            // validate URL syntax
-            try {
-                new URL(apiUrl);
-            } catch (MalformedURLException e) {
-                apiUrl = null;
-            }
+        if (!Utils.isValidUrl(apiUrl)) {
+            apiUrl = null;
         }
 
         if (apiUrl != null && !OsmApi.DEFAULT_API_URL.equals(apiUrl)) {
diff --git a/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java b/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
index ed6f427..d26f39e 100644
--- a/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
+++ b/src/org/openstreetmap/josm/data/oauth/SignpostAdapters.java
@@ -19,8 +19,17 @@ public final class SignpostAdapters {
     private SignpostAdapters() {
     }
 
+    /**
+     * OAuth provider.
+     */
     public static class OAuthProvider extends AbstractOAuthProvider {
 
+        /**
+         * Constructs a new {@code OAuthProvider}.
+         * @param requestTokenEndpointUrl request token endpoint URL
+         * @param accessTokenEndpointUrl access token endpoint URL
+         * @param authorizationWebsiteUrl authorization website URL
+         */
         public OAuthProvider(String requestTokenEndpointUrl, String accessTokenEndpointUrl, String authorizationWebsiteUrl) {
             super(requestTokenEndpointUrl, accessTokenEndpointUrl, authorizationWebsiteUrl);
         }
@@ -45,8 +54,16 @@ public final class SignpostAdapters {
         }
     }
 
+    /**
+     * OAuth consumer.
+     */
     public static class OAuthConsumer extends AbstractOAuthConsumer {
 
+        /**
+         * Constructs a new {@code OAuthConsumer}.
+         * @param consumerKey consumer key
+         * @param consumerSecret consumer secret
+         */
         public OAuthConsumer(String consumerKey, String consumerSecret) {
             super(consumerKey, consumerSecret);
         }
@@ -57,8 +74,8 @@ public final class SignpostAdapters {
         }
     }
 
-    private static class HttpRequest implements oauth.signpost.http.HttpRequest {
-        private final HttpClient request;
+    static final class HttpRequest implements oauth.signpost.http.HttpRequest {
+        final HttpClient request;
 
         HttpRequest(HttpClient request) {
             this.request = request;
@@ -110,8 +127,8 @@ public final class SignpostAdapters {
         }
     }
 
-    private static class HttpResponse implements oauth.signpost.http.HttpResponse {
-        private final HttpClient.Response response;
+    static final class HttpResponse implements oauth.signpost.http.HttpResponse {
+        final HttpClient.Response response;
 
         HttpResponse(HttpClient.Response response) {
             this.response = response;
@@ -137,5 +154,4 @@ public final class SignpostAdapters {
             throw new IllegalStateException();
         }
     }
-
 }
diff --git a/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java b/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
index d52e529..830334a 100644
--- a/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
+++ b/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
@@ -211,7 +211,7 @@ public class DatasetConsistencyTest {
                 writer.println((errorCount - MAX_ERRORS) + " more...");
             }
 
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             writer.println("Exception during dataset integrity test:");
             e.printStackTrace(writer);
         }
diff --git a/src/org/openstreetmap/josm/data/osm/Relation.java b/src/org/openstreetmap/josm/data/osm/Relation.java
index c4c2e18..bbea6d8 100644
--- a/src/org/openstreetmap/josm/data/osm/Relation.java
+++ b/src/org/openstreetmap/josm/data/osm/Relation.java
@@ -266,7 +266,7 @@ public final class Relation extends OsmPrimitive implements IRelation {
 
     @Override
     public String toString() {
-        StringBuilder result = new StringBuilder();
+        StringBuilder result = new StringBuilder(32);
         result.append("{Relation id=")
               .append(getUniqueId())
               .append(" version=")
diff --git a/src/org/openstreetmap/josm/data/osm/RelationMemberData.java b/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
index 585df5d..9f18cc5 100644
--- a/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
+++ b/src/org/openstreetmap/josm/data/osm/RelationMemberData.java
@@ -4,6 +4,8 @@ package org.openstreetmap.josm.data.osm;
 import java.io.Serializable;
 import java.util.Objects;
 
+import org.openstreetmap.josm.tools.CheckParameterUtil;
+
 public class RelationMemberData implements PrimitiveId, Serializable {
 
     private static final long serialVersionUID = 381392198209333319L;
@@ -11,28 +13,58 @@ public class RelationMemberData implements PrimitiveId, Serializable {
     private final long memberId;
     private final OsmPrimitiveType memberType;
 
+    /**
+     * Constructs a new {@code RelationMemberData}.
+     * @param role member role - can be null
+     * @param type member type - cannot be null
+     * @param id member id - cannot be null
+     * @throws IllegalArgumentException is type or id is null
+     */
     public RelationMemberData(String role, OsmPrimitiveType type, long id) {
+        CheckParameterUtil.ensureParameterNotNull(type, "type");
         this.role = role == null ? "" : role;
         this.memberType = type;
         this.memberId = id;
     }
 
+    /**
+     * Constructs a new {@code RelationMemberData}.
+     * @param role member role - can be null
+     * @param primitive member type and id - cannot be null
+     * @throws NullPointerException if primitive is null
+     */
     public RelationMemberData(String role, PrimitiveId primitive) {
         this(role, primitive.getType(), primitive.getUniqueId());
     }
 
+    /**
+     * Get member id.
+     * @return member id
+     */
     public long getMemberId() {
         return memberId;
     }
 
+    /**
+     * Get member role.
+     * @return member role
+     */
     public String getRole() {
         return role;
     }
 
+    /**
+     * Get member type.
+     * @return member type
+     */
     public OsmPrimitiveType getMemberType() {
         return memberType;
     }
 
+    /**
+     * Determines if this member has a role.
+     * @return {@code true} if this member has a role
+     */
     public boolean hasRole() {
         return !"".equals(role);
     }
diff --git a/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java b/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java
index ba02398..a53bd77 100644
--- a/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java
+++ b/src/org/openstreetmap/josm/data/osm/SimplePrimitiveId.java
@@ -56,7 +56,7 @@ public class SimplePrimitiveId implements PrimitiveId, Serializable {
 
     @Override
     public String toString() {
-        return type + " " + id;
+        return type.toString() + ' ' + id;
     }
 
     /**
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 205323e..1b4d4c2 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
@@ -220,10 +220,10 @@ public abstract class AbstractMapRenderer implements Rendering {
                 if (isSegmentVisible(lastP, p) && isLargeSegment(lastP, p, virtualNodeSpace)) {
                     int x = (p.x+lastP.x)/2;
                     int y = (p.y+lastP.y)/2;
-                    path.moveTo(x-virtualNodeSize, y);
-                    path.lineTo(x+virtualNodeSize, y);
-                    path.moveTo(x, y-virtualNodeSize);
-                    path.lineTo(x, y+virtualNodeSize);
+                    path.moveTo((float) x-virtualNodeSize, y);
+                    path.lineTo((float) x+virtualNodeSize, y);
+                    path.moveTo(x, (float) y-virtualNodeSize);
+                    path.lineTo(x, (float) y+virtualNodeSize);
                 }
                 lastP = p;
             }
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/LineClip.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/LineClip.java
index 0f9960c..d259a90 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/LineClip.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/LineClip.java
@@ -38,7 +38,8 @@ public class LineClip {
             return false;
         }
         return cohenSutherland(p1.x, p1.y, p2.x, p2.y, clipBounds.x, clipBounds.y,
-                clipBounds.x + clipBounds.width, clipBounds.y + clipBounds.height);
+                (long) clipBounds.x + clipBounds.width,
+                (long) clipBounds.y + clipBounds.height);
     }
 
     /**
@@ -83,18 +84,19 @@ public class LineClip {
             } else if ((outcode0 & outcode1) > 0) {
                 done = true;
             } else {
-                long x = 0, y = 0;
+                long x = 0;
+                long y = 0;
                 outcodeOut = outcode0 != 0 ? outcode0 : outcode1;
-                if ((outcodeOut & OUT_TOP) > 0) {
+                if ((outcodeOut & OUT_TOP) != 0) {
                     x = x1 + (x2 - x1) * (ymax - y1)/(y2 - y1);
                     y = ymax;
-                } else if ((outcodeOut & OUT_BOTTOM) > 0) {
+                } else if ((outcodeOut & OUT_BOTTOM) != 0) {
                     x = x1 + (x2 - x1) * (ymin - y1)/(y2 - y1);
                     y = ymin;
-                } else if ((outcodeOut & OUT_RIGHT) > 0) {
+                } else if ((outcodeOut & OUT_RIGHT) != 0) {
                     y = y1 + (y2 - y1) * (xmax - x1)/(x2 - x1);
                     x = xmax;
-                } else if ((outcodeOut & OUT_LEFT) > 0) {
+                } else if ((outcodeOut & OUT_LEFT) != 0) {
                     y = y1 + (y2 - y1) * (xmin - x1)/(x2 - x1);
                     x = xmin;
                 }
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 579f8e3..80c0184 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
@@ -143,7 +143,7 @@ public class StyledMapRenderer extends AbstractMapRenderer {
 
             int dxNext = next.x - current.x;
             int dyNext = next.y - current.y;
-            double lenNext = Math.sqrt(dxNext*dxNext + dyNext*dyNext);
+            double lenNext = Math.sqrt((double) dxNext*dxNext + (double) dyNext*dyNext);
 
             if (lenNext == 0) {
                 lenNext = 1; // value does not matter, because dy_next and dx_next is 0
@@ -813,8 +813,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
             if (lastP != null) {
                 final double segmentLength = thisP.distance(lastP);
 
-                final double dx = thisP.x - lastP.x;
-                final double dy = thisP.y - lastP.y;
+                final double dx = (double) thisP.x - lastP.x;
+                final double dy = (double) thisP.y - lastP.y;
 
                 // pos is the position from the beginning of the current segment
                 // where an image should be painted
@@ -1090,6 +1090,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
                         if (via == null) {
                             via = w;
                         }
+                        break;
+                    default: // Do nothing
                     }
                 } else if (m.isNode()) {
                     Node n = m.getNode();
@@ -1262,8 +1264,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
             poly.addPoint(p.x, p.y);
 
             if (lastPoint != null) {
-                dx = p.x - lastPoint.x;
-                dy = p.y - lastPoint.y;
+                dx = (long) p.x - lastPoint.x;
+                dy = (long) p.y - lastPoint.y;
                 double segmentLength = Math.sqrt(dx*dx + dy*dy);
                 if (segmentLength > 2*(rec.getWidth()+4)) {
                     Point center = new Point((lastPoint.x + p.x)/2, (lastPoint.y + p.y)/2);
@@ -1755,8 +1757,8 @@ public class StyledMapRenderer extends AbstractMapRenderer {
         // Yes, it is inefficient to iterate from the beginning for each glyph.
         // Can be optimized if it turns out to be slow.
         for (int i = 1; i < poly.npoints; ++i) {
-            dx = poly.xpoints[i] - poly.xpoints[i-1];
-            dy = poly.ypoints[i] - poly.ypoints[i-1];
+            dx = (long) poly.xpoints[i] - poly.xpoints[i-1];
+            dy = (long) poly.ypoints[i] - poly.ypoints[i-1];
             segLen = Math.sqrt(dx*dx + dy*dy);
             if (totalLen > curLen + segLen) {
                 curLen += segLen;
@@ -1791,10 +1793,10 @@ public class StyledMapRenderer extends AbstractMapRenderer {
     }
 
     private class ComputeStyleListWorker extends RecursiveTask<List<StyleRecord>> implements Visitor {
-        private final List<? extends OsmPrimitive> input;
-        private final List<StyleRecord> output;
+        private final transient List<? extends OsmPrimitive> input;
+        private final transient List<StyleRecord> output;
 
-        private final ElemStyles styles = MapPaintStyles.getStyles();
+        private final transient ElemStyles styles = MapPaintStyles.getStyles();
         private final int directExecutionTaskSize;
 
         private final boolean drawArea = circum <= Main.pref.getInteger("mappaint.fillareas", 10000000);
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 aad01af..115e61a 100644
--- a/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
+++ b/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
@@ -431,8 +431,8 @@ public class WireframeMapRenderer extends AbstractMapRenderer implements Visitor
                 final double sx = l * (p1.x - p2.x);
                 final double sy = l * (p1.y - p2.y);
 
-                path.lineTo(p2.x + (int) Math.round(cosPHI * sx - sinPHI * sy), p2.y + (int) Math.round(sinPHI * sx + cosPHI * sy));
-                path.moveTo(p2.x + (int) Math.round(cosPHI * sx + sinPHI * sy), p2.y + (int) Math.round(-sinPHI * sx + cosPHI * sy));
+                path.lineTo(p2.x + (float) Math.round(cosPHI * sx - sinPHI * sy), p2.y + (float) Math.round(sinPHI * sx + cosPHI * sy));
+                path.moveTo(p2.x + (float) Math.round(cosPHI * sx + sinPHI * sy), p2.y + (float) Math.round(-sinPHI * sx + cosPHI * sy));
                 path.lineTo(p2.x, 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 e2d5a43..590cb36 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
@@ -263,6 +263,8 @@ public class Multipolygon {
                             contains++;
                         }
                         total++;
+                        break;
+                    default: // Do nothing
                 }
             }
             if (contains == total) return Intersection.INSIDE;
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 5a43d55..2d25dec 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
@@ -83,15 +83,18 @@ public final class MultipolygonCache implements DataSetListener, LayerChangeList
         if (nc != null && r != null) {
             Map<DataSet, Map<Relation, Multipolygon>> map1 = cache.get(nc);
             if (map1 == null) {
-                cache.put(nc, map1 = new ConcurrentHashMap<>());
+                map1 = new ConcurrentHashMap<>();
+                cache.put(nc, map1);
             }
             Map<Relation, Multipolygon> map2 = map1.get(r.getDataSet());
             if (map2 == null) {
-                map1.put(r.getDataSet(), map2 = new ConcurrentHashMap<>());
+                map2 = new ConcurrentHashMap<>();
+                map1.put(r.getDataSet(), map2);
             }
             multipolygon = map2.get(r);
             if (multipolygon == null || forceRefresh) {
-                map2.put(r, multipolygon = new Multipolygon(r));
+                multipolygon = new Multipolygon(r);
+                map2.put(r, multipolygon);
                 for (PolyData pd : multipolygon.getCombinedPolygons()) {
                     if (pd.selected) {
                         selectedPolyData.add(pd);
@@ -110,7 +113,6 @@ public final class MultipolygonCache implements DataSetListener, LayerChangeList
         Map<DataSet, Map<Relation, Multipolygon>> map = cache.remove(nc);
         if (map != null) {
             map.clear();
-            map = null;
         }
     }
 
@@ -123,7 +125,6 @@ public final class MultipolygonCache implements DataSetListener, LayerChangeList
             Map<Relation, Multipolygon> map2 = map1.remove(ds);
             if (map2 != null) {
                 map2.clear();
-                map2 = null;
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/data/preferences/ListListSetting.java b/src/org/openstreetmap/josm/data/preferences/ListListSetting.java
index 40a35d4..3a47d02 100644
--- a/src/org/openstreetmap/josm/data/preferences/ListListSetting.java
+++ b/src/org/openstreetmap/josm/data/preferences/ListListSetting.java
@@ -73,10 +73,10 @@ public class ListListSetting extends AbstractSetting<List<List<String>>> {
     private void consistencyTest() {
         if (value != null) {
             if (value.contains(null))
-                throw new RuntimeException("Error: Null as list element in preference setting");
+                throw new IllegalArgumentException("Error: Null as list element in preference setting");
             for (Collection<String> lst : value) {
                 if (lst.contains(null)) {
-                    throw new RuntimeException("Error: Null as inner list element in preference setting");
+                    throw new IllegalArgumentException("Error: Null as inner list element in preference setting");
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/data/preferences/ListSetting.java b/src/org/openstreetmap/josm/data/preferences/ListSetting.java
index 138865e..888bc31 100644
--- a/src/org/openstreetmap/josm/data/preferences/ListSetting.java
+++ b/src/org/openstreetmap/josm/data/preferences/ListSetting.java
@@ -43,7 +43,7 @@ public class ListSetting extends AbstractSetting<List<String>> {
 
     private void consistencyTest() {
         if (value != null && value.contains(null))
-            throw new RuntimeException("Error: Null as list element in preference setting");
+            throw new IllegalArgumentException("Error: Null as list element in preference setting");
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/data/preferences/MapListSetting.java b/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
index b61f782..2f92e3b 100644
--- a/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
+++ b/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
@@ -72,12 +72,12 @@ public class MapListSetting extends AbstractSetting<List<Map<String, String>>> {
         if (value == null)
             return;
         if (value.contains(null))
-            throw new RuntimeException("Error: Null as list element in preference setting");
+            throw new IllegalArgumentException("Error: Null as list element in preference setting");
         for (Map<String, String> map : value) {
             if (map.keySet().contains(null))
-                throw new RuntimeException("Error: Null as map key in preference setting");
+                throw new IllegalArgumentException("Error: Null as map key in preference setting");
             if (map.values().contains(null))
-                throw new RuntimeException("Error: Null as map value in preference setting");
+                throw new IllegalArgumentException("Error: Null as map value in preference setting");
         }
     }
 
diff --git a/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java b/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
index a75afb5..1a5e47a 100644
--- a/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
+++ b/src/org/openstreetmap/josm/data/preferences/PreferencesReader.java
@@ -30,6 +30,7 @@ import javax.xml.validation.Validator;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.CachedFile;
+import org.openstreetmap.josm.io.XmlStreamParsingException;
 import org.xml.sax.SAXException;
 
 /**
@@ -37,8 +38,6 @@ import org.xml.sax.SAXException;
  */
 public class PreferencesReader {
 
-    private static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
-
     private final SortedMap<String, Setting<?>> settings = new TreeMap<>();
     private XMLStreamReader parser;
     private int version;
@@ -117,6 +116,11 @@ public class PreferencesReader {
         return version;
     }
 
+    /**
+     * Parse preferences.
+     * @throws XMLStreamException if any XML parsing error occurs
+     * @throws IOException if any I/O error occurs
+     */
     public void parse() throws XMLStreamException, IOException {
         if (reader != null) {
             this.parser = XMLInputFactory.newInstance().createXMLStreamReader(reader);
@@ -167,7 +171,7 @@ public class PreferencesReader {
                 String localName = parser.getLocalName();
                 switch(localName) {
                 case "tag":
-                    Setting setting;
+                    StringSetting setting;
                     if (defaults && isNil()) {
                         setting = new StringSetting(null);
                     } else {
@@ -220,7 +224,7 @@ public class PreferencesReader {
         List<List<String>> lists = null;
         List<Map<String, String>> maps = null;
         if (defaults && isNil()) {
-            Setting setting;
+            Setting<?> setting;
             switch (name) {
                 case "lists":
                     setting = new ListListSetting(null);
@@ -267,7 +271,7 @@ public class PreferencesReader {
                     break;
                 }
             }
-            Setting setting;
+            Setting<?> setting;
             if (entries != null) {
                 setting = new ListSetting(Collections.unmodifiableList(entries));
             } else if (lists != null) {
@@ -336,18 +340,18 @@ public class PreferencesReader {
      * @see <a href="https://msdn.microsoft.com/en-us/library/2b314yt2(v=vs.85).aspx">Nillable Attribute on MS Developer Network</a>
      */
     private boolean isNil() {
-        String nil = parser.getAttributeValue(XSI_NS, "nil");
+        String nil = parser.getAttributeValue(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "nil");
         return "true".equals(nil) || "1".equals(nil);
     }
 
     /**
-     * Throw RuntimeException with line and column number.
+     * Throw XmlStreamParsingException with line and column number.
      *
      * Only use this for errors that should not be possible after schema validation.
      * @param msg the error message
+     * @throws XmlStreamParsingException always
      */
-    private void throwException(String msg) {
-        throw new RuntimeException(msg + tr(" (at line {0}, column {1})",
-                parser.getLocation().getLineNumber(), parser.getLocation().getColumnNumber()));
+    private void throwException(String msg) throws XmlStreamParsingException {
+        throw new XmlStreamParsingException(msg, parser.getLocation());
     }
 }
diff --git a/src/org/openstreetmap/josm/data/projection/CustomProjection.java b/src/org/openstreetmap/josm/data/projection/CustomProjection.java
index 671fb02..6f02a1f 100644
--- a/src/org/openstreetmap/josm/data/projection/CustomProjection.java
+++ b/src/org/openstreetmap/josm/data/projection/CustomProjection.java
@@ -248,7 +248,7 @@ public class CustomProjection extends AbstractProjection {
                 }
                 if (zone == null || zone < 1 || zone > 60)
                     throw new ProjectionConfigurationException(tr("Expected integer value in range 1-60 for ''+zone=...'' parameter."));
-                this.lon0 = 6 * zone - 183;
+                this.lon0 = 6d * zone - 183d;
                 this.k0 = 0.9996;
                 this.x0 = 500000;
                 this.y0 = parameters.containsKey(Param.south.key) ? 10000000 : 0;
@@ -774,7 +774,7 @@ public class CustomProjection extends AbstractProjection {
             ret.put("athens", parseAngle("23d42'58.815\"E", null));
             ret.put("oslo", parseAngle("10d43'22.5\"E", null));
         } catch (ProjectionConfigurationException ex) {
-            throw new RuntimeException();
+            throw new IllegalStateException(ex);
         }
         return ret;
     }
@@ -813,7 +813,7 @@ public class CustomProjection extends AbstractProjection {
                             polesEN.put(p, enPole);
                         }
                     }
-                } catch (Exception e) {
+                } catch (RuntimeException e) {
                     Main.error(e);
                 }
             }
diff --git a/src/org/openstreetmap/josm/data/projection/Projections.java b/src/org/openstreetmap/josm/data/projection/Projections.java
index 931533a..23af5ed 100644
--- a/src/org/openstreetmap/josm/data/projection/Projections.java
+++ b/src/org/openstreetmap/josm/data/projection/Projections.java
@@ -322,7 +322,7 @@ public final class Projections {
             pc.setPreferences(pref);
             try {
                 proj = pc.getProjection();
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 String cause = e.getMessage();
                 Main.warn("Unable to get projection "+code+" with "+pc + (cause != null ? ". "+cause : ""));
             }
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
index 13e0bfd..d9e9757 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFile.java
@@ -102,7 +102,6 @@ public class NTV2GridShiftFile implements Serializable {
      */
     public void loadGridShiftFile(InputStream in, boolean loadAccuracy) throws IOException {
         byte[] b8 = new byte[8];
-        boolean bigEndian = true;
         fromEllipsoid = "";
         toEllipsoid = "";
         topLevelSubGrid = null;
@@ -110,6 +109,7 @@ public class NTV2GridShiftFile implements Serializable {
         String overviewHeaderCountId = new String(b8, StandardCharsets.UTF_8);
         if (!"NUM_OREC".equals(overviewHeaderCountId))
             throw new IllegalArgumentException("Input file is not an NTv2 grid shift file");
+        boolean bigEndian;
         readBytes(in, b8);
         overviewHeaderCount = NTV2Util.getIntBE(b8, 0);
         if (overviewHeaderCount == 11) {
@@ -203,14 +203,17 @@ public class NTV2GridShiftFile implements Serializable {
      * @return True if the coordinate is within a Sub Grid, false if not
      */
     public boolean gridShiftForward(NTV2GridShift gs) {
-        // Try the last sub grid first, big chance the coord is still within it
-        NTV2SubGrid subGrid = lastSubGrid.getSubGridForCoord(gs.getLonPositiveWestSeconds(), gs.getLatSeconds());
+        NTV2SubGrid subGrid = null;
+        if (lastSubGrid != null) {
+            // Try the last sub grid first, big chance the coord is still within it
+            subGrid = lastSubGrid.getSubGridForCoord(gs.getLonPositiveWestSeconds(), gs.getLatSeconds());
+        }
         if (subGrid == null) {
-            subGrid = getSubGrid(gs.getLonPositiveWestSeconds(), gs.getLatSeconds());
+            subGrid = getSubGrid(topLevelSubGrid, gs.getLonPositiveWestSeconds(), gs.getLatSeconds());
         }
-        if (subGrid == null)
+        if (subGrid == null) {
             return false;
-        else {
+        } else {
             subGrid.interpolateGridShift(gs);
             gs.setSubGridName(subGrid.getSubGridName());
             lastSubGrid = subGrid;
@@ -250,14 +253,13 @@ public class NTV2GridShiftFile implements Serializable {
     }
 
     /**
-     * Find the finest SubGrid containing the coordinate, specified
-     * in Positive West Seconds
-     *
+     * Find the finest SubGrid containing the coordinate, specified in Positive West Seconds
+     * @param topLevelSubGrid top level subgrid
      * @param lon Longitude in Positive West Seconds
      * @param lat Latitude in Seconds
      * @return The SubGrid found or null
      */
-    private NTV2SubGrid getSubGrid(double lon, double lat) {
+    private static NTV2SubGrid getSubGrid(NTV2SubGrid[] topLevelSubGrid, double lon, double lat) {
         NTV2SubGrid sub = null;
         for (int i = 0; i < topLevelSubGrid.length; i++) {
             sub = topLevelSubGrid[i].getSubGridForCoord(lon, lat);
@@ -270,7 +272,7 @@ public class NTV2GridShiftFile implements Serializable {
 
     @Override
     public String toString() {
-        StringBuilder buff = new StringBuilder("Headers  : ");
+        StringBuilder buff = new StringBuilder(256).append("Headers  : ");
         buff.append(overviewHeaderCount)
             .append("\nSub Hdrs : ")
             .append(subGridHeaderCount)
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFileWrapper.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFileWrapper.java
index 30e02dc..7cef6bf 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFileWrapper.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2GridShiftFileWrapper.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.projection.datum;
 
+import java.io.IOException;
 import java.io.InputStream;
 
 import org.openstreetmap.josm.io.CachedFile;
@@ -54,7 +55,7 @@ public class NTV2GridShiftFileWrapper {
             try (CachedFile cf = new CachedFile(gridFileName); InputStream is = cf.getInputStream()) {
                 instance = new NTV2GridShiftFile();
                 instance.loadGridShiftFile(is, false);
-            } catch (Exception e) {
+            } catch (IOException e) {
                 throw new RuntimeException(e);
             }
         }
diff --git a/src/org/openstreetmap/josm/data/projection/datum/NTV2SubGrid.java b/src/org/openstreetmap/josm/data/projection/datum/NTV2SubGrid.java
index c6233c4..b1e1b59 100644
--- a/src/org/openstreetmap/josm/data/projection/datum/NTV2SubGrid.java
+++ b/src/org/openstreetmap/josm/data/projection/datum/NTV2SubGrid.java
@@ -294,7 +294,7 @@ public class NTV2SubGrid implements Serializable {
      * @return textual details about the sub grid
      */
     public String getDetails() {
-        StringBuilder buff = new StringBuilder("Sub Grid : ");
+        StringBuilder buff = new StringBuilder(256).append("Sub Grid : ");
         buff.append(subGridName)
             .append("\nParent   : ")
             .append(parentSubGridName)
diff --git a/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java b/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
index dc00caf..8ebba53 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.data.projection.proj;
 
 import org.openstreetmap.josm.data.projection.Ellipsoid;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * Abstract base class providing utilities for implementations of the Proj
@@ -83,6 +84,8 @@ public abstract class AbstractProj implements Proj {
 
     @Override
     public void initialize(ProjParameters params) throws ProjectionConfigurationException {
+        CheckParameterUtil.ensureParameterNotNull(params, "params");
+        CheckParameterUtil.ensureParameterNotNull(params.ellps, "params.ellps");
         e2 = params.ellps.e2;
         e = params.ellps.e;
         spherical = params.ellps.spherical;
@@ -137,7 +140,7 @@ public abstract class AbstractProj implements Proj {
         phi = arg;
         for (i = MAXIMUM_ITERATIONS; true;) { // rarely goes over 5 iterations
             if (--i < 0) {
-                throw new RuntimeException("Too many iterations");
+                throw new IllegalStateException("Too many iterations");
             }
             s = Math.sin(phi);
             t = 1.0 - e2 * s * s;
@@ -161,7 +164,7 @@ public abstract class AbstractProj implements Proj {
                 return phi;
             }
         }
-        throw new RuntimeException("no convergence");
+        throw new IllegalStateException("no convergence for ts="+ts);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java b/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
index 05fc359..0a32fcc 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/AlbersEqualArea.java
@@ -125,7 +125,7 @@ public class AlbersEqualArea extends AbstractProj {
             if (rho > -EPSILON) {
                 rho = 0.0;
             } else {
-                throw new RuntimeException();
+                throw new AssertionError();
             }
         }
         rho = Math.sqrt(rho) / n;
@@ -183,7 +183,7 @@ public class AlbersEqualArea extends AbstractProj {
                 return phi;
             }
         }
-        throw new RuntimeException("no convergence for q="+qs);
+        throw new IllegalStateException("no convergence for qs="+qs);
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/data/projection/proj/ClassProjFactory.java b/src/org/openstreetmap/josm/data/projection/proj/ClassProjFactory.java
index 3a9ddc2..926a0c1 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/ClassProjFactory.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/ClassProjFactory.java
@@ -8,6 +8,10 @@ public class ClassProjFactory implements ProjFactory {
 
     private final Class<? extends Proj> projClass;
 
+    /**
+     * Constructs a new {@code ClassProjFactory}.
+     * @param projClass projection class
+     */
     public ClassProjFactory(Class<? extends Proj> projClass) {
         this.projClass = projClass;
     }
@@ -16,8 +20,8 @@ public class ClassProjFactory implements ProjFactory {
     public Proj createInstance() {
         Proj proj = null;
         try {
-            proj = projClass.newInstance();
-        } catch (InstantiationException | IllegalAccessException e) {
+            proj = projClass.getConstructor().newInstance();
+        } catch (ReflectiveOperationException e) {
             throw new RuntimeException(e);
         }
         return proj;
diff --git a/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java b/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java
index d1d7d77..032daff 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/DoubleStereographic.java
@@ -99,7 +99,7 @@ public class DoubleStereographic extends AbstractProj {
         double phi = 2 * atan(exp(psi)) - PI/2;
         while (abs(phi - phiprev) > EPSILON) {
             if (++iteration > 10)
-                throw new RuntimeException("Too many iterations");
+                throw new IllegalStateException("Too many iterations");
             phiprev = phi;
             double psii = log(tan(phi/2 + PI/4) * pow((1 - e * sin(phi)) / (1 + e * sin(phi)), e/2));
             phi = phi - (psii - psi) * cos(phi) * (1 - e2 * pow(sin(phi), 2)) / (1 - e2);
diff --git a/src/org/openstreetmap/josm/data/projection/proj/LonLat.java b/src/org/openstreetmap/josm/data/projection/proj/LonLat.java
index a4e5cb2..652aa83 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/LonLat.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/LonLat.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * Simple Lat/Lon (pseudo-)projection.
@@ -25,6 +26,8 @@ public class LonLat implements Proj {
 
     @Override
     public void initialize(ProjParameters params) throws ProjectionConfigurationException {
+        CheckParameterUtil.ensureParameterNotNull(params, "params");
+        CheckParameterUtil.ensureParameterNotNull(params.ellps, "params.ellps");
         a = params.ellps.a;
     }
 
diff --git a/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java b/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
index 2667110..af224ff 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java
@@ -162,7 +162,7 @@ public class PolarStereographic extends AbstractProj {
             }
             phi0 = phi;
             if (--i < 0) {
-                throw new RuntimeException("no convergence");
+                throw new IllegalStateException("no convergence for x="+x+", y="+y);
             }
         }
         return new double[] {y, x};
diff --git a/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java b/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
index fbf0408..576e1fe 100644
--- a/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
+++ b/src/org/openstreetmap/josm/data/projection/proj/TransverseMercator.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * Transverse Mercator Projection (EPSG code 9807). This
@@ -118,6 +119,8 @@ public class TransverseMercator extends AbstractProj {
     @Override
     public void initialize(ProjParameters params) throws ProjectionConfigurationException {
         super.initialize(params);
+        CheckParameterUtil.ensureParameterNotNull(params, "params");
+        CheckParameterUtil.ensureParameterNotNull(params.ellps, "params.ellps");
         eb2 = params.ellps.eb2;
         latitudeOfOrigin = params.lat0 == null ? 0 : Math.toRadians(params.lat0);
         ml0 = mlfn(latitudeOfOrigin, Math.sin(latitudeOfOrigin), Math.cos(latitudeOfOrigin));
diff --git a/src/org/openstreetmap/josm/data/validation/OsmValidator.java b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
index 3e2ec86..192742d 100644
--- a/src/org/openstreetmap/josm/data/validation/OsmValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/OsmValidator.java
@@ -16,6 +16,7 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.SortedMap;
@@ -58,8 +59,10 @@ 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.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.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.ValidatorLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
@@ -84,11 +87,16 @@ public class OsmValidator implements LayerChangeListener {
     private static final Collection<String> ignoredErrors = new TreeSet<>();
 
     /**
-     * All available tests
-     * TODO: is there any way to find out automatically all available tests?
+     * All registered tests
+     */
+    private static final Collection<Class<? extends Test>> allTests = new ArrayList<>();
+    private static final Map<String, Test> allTestsMap = new HashMap<>();
+
+    /**
+     * All available tests in core
      */
     @SuppressWarnings("unchecked")
-    private static final Class<Test>[] allAvailableTests = new Class[] {
+    private static final Class<Test>[] CORE_TEST_CLASSES = new Class[] {
         /* FIXME - unique error numbers for tests aren't properly unique - ignoring will not work as expected */
         DuplicateNode.class, // ID    1 ..   99
         OverlappingWays.class, // ID  101 ..  199
@@ -130,15 +138,18 @@ public class OsmValidator implements LayerChangeListener {
         PublicTransportRouteTest.class, // 3600 .. 3699
     };
 
-    private static Map<String, Test> allTestsMap;
+    public static void addTest(Class<? extends Test> testClass) {
+        allTests.add(testClass);
+        try {
+            allTestsMap.put(testClass.getName(), testClass.getConstructor().newInstance());
+        } catch (ReflectiveOperationException e) {
+            Main.error(e);
+        }
+    }
+
     static {
-        allTestsMap = new HashMap<>();
-        for (Class<Test> testClass : allAvailableTests) {
-            try {
-                allTestsMap.put(testClass.getName(), testClass.newInstance());
-            } catch (Exception e) {
-                Main.error(e);
-            }
+        for (Class<? extends Test> testClass : CORE_TEST_CLASSES) {
+            addTest(testClass);
         }
     }
 
@@ -161,16 +172,12 @@ public class OsmValidator implements LayerChangeListener {
     }
 
     /**
-     * Check if plugin directory exists (store ignored errors file)
+     * Check if validator directory exists (store ignored errors file)
      */
     private static void checkValidatorDir() {
-        try {
-            File pathDir = new File(getValidatorDir());
-            if (!pathDir.exists()) {
-                Utils.mkDirs(pathDir);
-            }
-        } catch (Exception e) {
-            Main.error(e);
+        File pathDir = new File(getValidatorDir());
+        if (!pathDir.exists()) {
+            Utils.mkDirs(pathDir);
         }
     }
 
@@ -209,7 +216,7 @@ public class OsmValidator implements LayerChangeListener {
         }
     }
 
-    public static void initializeErrorLayer() {
+    public static synchronized void initializeErrorLayer() {
         if (!Main.pref.getBoolean(ValidatorPreference.PREF_LAYER, true))
             return;
         if (errorLayer == null) {
@@ -275,10 +282,10 @@ public class OsmValidator implements LayerChangeListener {
     /**
      * Gets the list of all available test classes
      *
-     * @return An array of the test classes
+     * @return A collection of the test classes
      */
-    public static Class<Test>[] getAllAvailableTests() {
-        return Utils.copyArray(allAvailableTests);
+    public static Collection<Class<? extends Test>> getAllAvailableTestClasses() {
+        return Collections.unmodifiableCollection(allTests);
     }
 
     /**
@@ -342,22 +349,22 @@ public class OsmValidator implements LayerChangeListener {
     /* interface LayerChangeListener                                              */
     /* -------------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        // Do nothing
+    public void layerAdded(LayerAddEvent e) {
+        // do nothing
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {
-        // Do nothing
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        // do nothing
     }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {
-        if (oldLayer == errorLayer) {
+    public void layerRemoving(LayerRemoveEvent e) {
+        if (e.getRemovedLayer() == errorLayer) {
             errorLayer = null;
             return;
         }
-        if (Main.map.mapView.getLayersOfType(OsmDataLayer.class).isEmpty()) {
+        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 795b6c1..cb87393 100644
--- a/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
+++ b/src/org/openstreetmap/josm/data/validation/PaintVisitor.java
@@ -122,7 +122,7 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
             Point p = mv.getPoint(n);
 
             if (selected) {
-                g.setColor(getHighlightColor());
+                g.setColor(getHighlightColor(color));
                 g.fillOval(p.x - 5, p.y - 5, 10, 10);
             }
             g.setColor(color);
@@ -140,12 +140,12 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
      */
     protected void drawSegment(Point p1, Point p2, Color color) {
 
-        double t = Math.atan2(p2.x - p1.x, p2.y - p1.y);
+        double t = Math.atan2((double) p2.x - p1.x, (double) p2.y - p1.y);
         double cosT = 5 * Math.cos(t);
         double sinT = 5 * Math.sin(t);
         int deg = (int) Math.toDegrees(t);
         if (selected) {
-            g.setColor(getHighlightColor());
+            g.setColor(getHighlightColor(color));
             int[] x = new int[] {(int) (p1.x + cosT), (int) (p2.x + cosT),
                                  (int) (p2.x - cosT), (int) (p1.x - cosT)};
             int[] y = new int[] {(int) (p1.y - sinT), (int) (p2.y - sinT),
@@ -259,9 +259,10 @@ public class PaintVisitor extends AbstractVisitor implements ValidatorVisitor {
 
     /**
      * Gets the color to draw highlight markers with.
+     * @param color severity color
      * @return The color.
      */
-    private Color getHighlightColor() {
+    private static Color getHighlightColor(Color color) {
         return new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) (color.getAlpha() * .4));
     }
 
diff --git a/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java b/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
index 22d9be3..3f16e28 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/DomainValidator.java
@@ -289,7 +289,7 @@ 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 2016042300, Last Updated Sat Apr 23 07:07:01 2016 UTC
+        // Taken from Version 2016052900, Last Updated Sun May 29 07:07:01 2016 UTC
         "aaa", // aaa American Automobile Association, Inc.
         "aarp", // aarp AARP
         "abb", // abb ABB Ltd
@@ -309,6 +309,7 @@ public final class DomainValidator extends AbstractValidator {
         "adult", // adult ICM Registry AD LLC
         "aeg", // aeg Aktiebolaget Electrolux
         "aero", // aero Societe Internationale de Telecommunications Aeronautique (SITA INC USA)
+        "aetna", // aetna Aetna Life Insurance Company
         "afl", // afl Australian Football League
         "agakhan", // agakhan Fondation Aga Khan (Aga Khan Foundation)
         "agency", // agency Steel Falls, LLC
@@ -379,6 +380,7 @@ public final class DomainValidator extends AbstractValidator {
         "biz", // biz Neustar, Inc.
         "black", // black Afilias Limited
         "blackfriday", // blackfriday Uniregistry, Corp.
+        "blog", // blog Knock Knock WHOIS There, LLC
         "bloomberg", // bloomberg Bloomberg IP Holdings LLC
         "blue", // blue Afilias Limited
         "bms", // bms Bristol-Myers Squibb Company
@@ -509,6 +511,7 @@ public final class DomainValidator extends AbstractValidator {
         "datsun", // datsun NISSAN MOTOR CO., LTD.
         "day", // day Charleston Road Registry Inc.
         "dclk", // dclk Charleston Road Registry Inc.
+        "dds", // dds Minds + Machines Group Limited
         "dealer", // dealer Dealer Dot Com, Inc.
         "deals", // deals Sand Sunset, LLC
         "degree", // degree United TLD Holdco, Ltd
@@ -533,8 +536,10 @@ public final class DomainValidator extends AbstractValidator {
         "dog", // dog Koko Mill, LLC
         "doha", // doha Communications Regulatory Authority (CRA)
         "domains", // domains Sugar Cross, LLC
+        "dot", // dot Dish DBS Corporation
         "download", // download dot Support Limited
         "drive", // drive Charleston Road Registry Inc.
+        "dtv", // dtv Dish DBS Corporation
         "dubai", // dubai Dubai Smart Government Department
         "durban", // durban ZA Central Registry NPC trading as ZA Central Registry
         "dvag", // dvag Deutsche Vermögensberatung Aktiengesellschaft DVAG
@@ -587,6 +592,7 @@ public final class DomainValidator extends AbstractValidator {
         "fitness", // fitness Brice Orchard, LLC
         "flickr", // flickr Yahoo! Domain Services Inc.
         "flights", // flights Fox Station, LLC
+        "flir", // flir FLIR Systems, Inc.
         "florist", // florist Half Cypress, LLC
         "flowers", // flowers Uniregistry, Corp.
         "flsmidth", // flsmidth FLSmidth A/S
@@ -647,6 +653,7 @@ public final class DomainValidator extends AbstractValidator {
         "green", // green Afilias Limited
         "gripe", // gripe Corn Sunset, LLC
         "group", // group Romeo Town, LLC
+        "guardian", // guardian The Guardian Life Insurance Company of America
         "gucci", // gucci Guccio Gucci S.p.a.
         "guge", // guge Charleston Road Registry Inc.
         "guide", // guide Snow Moon, LLC
@@ -665,6 +672,7 @@ public final class DomainValidator extends AbstractValidator {
         "hiphop", // hiphop Uniregistry, Corp.
         "hitachi", // hitachi Hitachi, Ltd.
         "hiv", // hiv dotHIV gemeinnuetziger e.V.
+        "hkt", // hkt PCCW-HKT DataCom Services Limited
         "hockey", // hockey Half Willow, LLC
         "holdings", // holdings John Madison, LLC
         "holiday", // holiday Goose Woods, LLC
@@ -775,11 +783,13 @@ public final class DomainValidator extends AbstractValidator {
         "lincoln", // lincoln Ford Motor Company
         "linde", // linde Linde Aktiengesellschaft
         "link", // link Uniregistry, Corp.
+        "lipsy", // lipsy Lipsy Ltd
         "live", // live United TLD Holdco Ltd.
         "living", // living Lifestyle Domain Holdings, Inc.
         "lixil", // lixil LIXIL Group Corporation
         "loan", // loan dot Loan Limited
         "loans", // loans June Woods, LLC
+        "locker", // locker Dish DBS Corporation
         "locus", // locus Locus Analytics LLC
         "lol", // lol Uniregistry, Corp.
         "london", // london Dot London Domains Limited
@@ -802,6 +812,7 @@ public final class DomainValidator extends AbstractValidator {
         "marketing", // marketing Fern Pass, LLC
         "markets", // markets DOTMARKETS REGISTRY LTD
         "marriott", // marriott Marriott Worldwide Corporation
+        "mattel", // mattel Mattel Sites, Inc.
         "mba", // mba Lone Hollow, LLC
         "med", // med Medistry LLC
         "media", // media Grand Glen, LLC
@@ -812,10 +823,12 @@ public final class DomainValidator extends AbstractValidator {
         "men", // men Exclusive Registry Limited
         "menu", // menu Wedding TLD2, LLC
         "meo", // meo PT Comunicacoes S.A.
+        "metlife", // metlife MetLife Services and Solutions, LLC
         "miami", // miami Top Level Domain Holdings Limited
         "microsoft", // microsoft Microsoft Corporation
         "mil", // mil DoD Network Information Center
         "mini", // mini Bayerische Motoren Werke Aktiengesellschaft
+        "mlb", // mlb MLB Advanced Media DH, LLC
         "mls", // mls The Canadian Real Estate Association
         "mma", // mma MMA IARD
         "mobi", // mobi Afilias Technologies Limited dba dotMobi
@@ -848,10 +861,13 @@ public final class DomainValidator extends AbstractValidator {
         "nec", // nec NEC Corporation
         "net", // net VeriSign Global Registry Services
         "netbank", // netbank COMMONWEALTH BANK OF AUSTRALIA
+        "netflix", // netflix Netflix, Inc.
         "network", // network Trixy Manor, LLC
         "neustar", // neustar NeuStar, Inc.
         "new", // new Charleston Road Registry Inc.
         "news", // news United TLD Holdco Ltd.
+        "next", // next Next plc
+        "nextdirect", // nextdirect Next plc
         "nexus", // nexus Charleston Road Registry Inc.
         "ngo", // ngo Public Interest Registry
         "nhk", // nhk Japan Broadcasting Corporation (NHK)
@@ -864,6 +880,7 @@ public final class DomainValidator extends AbstractValidator {
         "northwesternmutual", // northwesternmutual Northwestern Mutual Registry, LLC
         "norton", // norton Symantec Corporation
         "nowruz", // nowruz Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
+        "nowtv", // nowtv Starbucks (HK) Limited
         "nra", // nra NRA Holdings Company, INC.
         "nrw", // nrw Minds + Machines GmbH
         "ntt", // ntt NIPPON TELEGRAPH AND TELEPHONE CORPORATION
@@ -871,6 +888,9 @@ public final class DomainValidator extends AbstractValidator {
         "obi", // obi OBI Group Holding SE & Co. KGaA
         "office", // office Microsoft Corporation
         "okinawa", // okinawa BusinessRalliart inc.
+        "olayan", // olayan Crescent Holding GmbH
+        "olayangroup", // olayangroup Crescent Holding GmbH
+        "ollo", // ollo Dish DBS Corporation
         "omega", // omega The Swatch Group Ltd
         "one", // one One.com A/S
         "ong", // ong Public Interest Registry
@@ -884,6 +904,7 @@ public final class DomainValidator extends AbstractValidator {
         "origins", // origins The Estée Lauder Companies Inc.
         "osaka", // osaka Interlink Co., Ltd.
         "otsuka", // otsuka Otsuka Holdings Co., Ltd.
+        "ott", // ott Dish DBS Corporation
         "ovh", // ovh OVH SAS
         "page", // page Charleston Road Registry Inc.
         "pamperedchef", // pamperedchef The Pampered Chef, Ltd.
@@ -894,6 +915,7 @@ public final class DomainValidator extends AbstractValidator {
         "parts", // parts Sea Goodbye, LLC
         "party", // party Blue Sky Registry Limited
         "passagens", // passagens Travel Reservations SRL
+        "pccw", // pccw PCCW Enterprises Limited
         "pet", // pet Afilias plc
         "pharmacy", // pharmacy National Association of Boards of Pharmacy
         "philips", // philips Koninklijke Philips N.V.
@@ -937,6 +959,7 @@ public final class DomainValidator extends AbstractValidator {
         "quest", // quest Quest ION Limited
         "racing", // racing Premier Registry Limited
         "read", // read Amazon Registry Services, Inc.
+        "realestate", // realestate dotRealEstate LLC
         "realtor", // realtor Real Estate Domains LLC
         "realty", // realty Fegistry, LLC
         "recipes", // recipes Grand Island, LLC
@@ -959,6 +982,7 @@ public final class DomainValidator extends AbstractValidator {
         "reviews", // reviews United TLD Holdco, Ltd.
         "rexroth", // rexroth Robert Bosch GMBH
         "rich", // rich I-REGISTRY Ltd., Niederlassung Deutschland
+        "richardli", // richardli Pacific Century Asset Management (HK) Limited
         "ricoh", // ricoh Ricoh Company, Ltd.
         "rio", // rio Empresa Municipal de Informática SA - IPLANRIO
         "rip", // rip United TLD Holdco Ltd.
@@ -1016,6 +1040,7 @@ public final class DomainValidator extends AbstractValidator {
         "shia", // shia Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
         "shiksha", // shiksha Afilias Limited
         "shoes", // shoes Binky Galley, LLC
+        "shop", // shop GMO Registry, Inc.
         "shouji", // shouji QIHOO 360 TECHNOLOGY CO. LTD.
         "show", // show Snow Beach, LLC
         "shriram", // shriram Shriram Capital Ltd.
@@ -1159,6 +1184,7 @@ public final class DomainValidator extends AbstractValidator {
         "walter", // walter Sandvik AB
         "wang", // wang Zodiac Registry Limited
         "wanggou", // wanggou Amazon Registry Services, Inc.
+        "warman", // warman Weir Group IP Limited
         "watch", // watch Sand Shadow, LLC
         "watches", // watches Richemont DNS Inc.
         "weather", // weather The Weather Channel, LLC
@@ -1229,6 +1255,7 @@ public final class DomainValidator extends AbstractValidator {
         "xn--fiq64b", // 中信 CITIC Group Corporation
         "xn--fjq720a", // 娱乐 Will Bloom, LLC
         "xn--flw351e", // 谷歌 Charleston Road Registry Inc.
+        "xn--fzys8d69uvgm", // 電訊盈科 PCCW Enterprises Limited
         "xn--g2xx48c", // 购物 Minds + Machines Group Limited
         "xn--gckr3f0f", // クラウド Amazon Registry Services, Inc.
         "xn--hxt814e", // 网店 Zodiac Libra Limited
@@ -1242,6 +1269,7 @@ public final class DomainValidator extends AbstractValidator {
         "xn--kpu716f", // 手表 Richemont DNS Inc.
         "xn--kput3i", // 手机 Beijing RITT-Net Technology Development Co., Ltd
         "xn--mgba3a3ejt", // ارامكو Aramco Services Company
+        "xn--mgba7c0bbn0a", // العليان Crescent Holding GmbH
         "xn--mgbab2bd", // بازار CORE Association
         "xn--mgbb9fbpob", // موبايلي GreenTech Consultancy Company W.L.L.
         "xn--mgbca7dzdo", // ابوظبي Abu Dhabi Systems and Information Centre
@@ -1269,6 +1297,7 @@ public final class DomainValidator extends AbstractValidator {
         "xn--vhquv", // 企业 Dash McCook, LLC
         "xn--vuq861b", // 信息 Beijing Tele-info Network Technology Co., Ltd.
         "xn--w4r85el8fhu5dnra", // 嘉里大酒店 Kerry Trading Co. Limited
+        "xn--w4rs40l", // 嘉里 Kerry Trading Co. Limited
         "xn--xhq521b", // 广东 Guangzhou YU Wei Information Technology Co., Ltd.
         "xn--zfr164b", // 政务 China Organizational Name Administration Center
         "xperia", // xperia Sony Mobile Communications AB
@@ -1785,7 +1814,7 @@ public final class DomainValidator extends AbstractValidator {
                 case '\u3002': // ideographic full stop
                 case '\uFF0E': // fullwidth full stop
                 case '\uFF61': // halfwidth ideographic full stop
-                    return ascii + "."; // restore the missing stop
+                    return ascii + '.'; // restore the missing stop
                 default:
                     return ascii;
             }
diff --git a/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java b/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
index 1829136..f65169b 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/EmailValidator.java
@@ -72,13 +72,6 @@ public class EmailValidator extends AbstractValidator {
      */
     private static final EmailValidator EMAIL_VALIDATOR_WITH_LOCAL = new EmailValidator(true, false);
 
-
-    /**
-     * Singleton instance of this class, which does
-     *  consider local addresses valid.
-     */
-    private static final EmailValidator EMAIL_VALIDATOR_WITH_LOCAL_WITH_TLD = new EmailValidator(true, true);
-
     /**
      * Returns the Singleton instance of this validator.
      *
@@ -98,11 +91,7 @@ public class EmailValidator extends AbstractValidator {
      */
     public static EmailValidator getInstance(boolean allowLocal, boolean allowTld) {
         if (allowLocal) {
-            if (allowTld) {
-                return EMAIL_VALIDATOR_WITH_LOCAL_WITH_TLD;
-            } else {
-                return EMAIL_VALIDATOR_WITH_LOCAL;
-            }
+            return EMAIL_VALIDATOR_WITH_LOCAL;
         } else {
             if (allowTld) {
                 return EMAIL_VALIDATOR_WITH_TLD;
diff --git a/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java b/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
index 2d76a29..80396a8 100644
--- a/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
+++ b/src/org/openstreetmap/josm/data/validation/routines/RegexValidator.java
@@ -218,7 +218,7 @@ public class RegexValidator extends AbstractValidator {
      */
     @Override
     public String toString() {
-        StringBuilder buffer = new StringBuilder();
+        StringBuilder buffer = new StringBuilder(32);
         buffer.append("RegexValidator{");
         for (int i = 0; i < patterns.length; i++) {
             if (i > 0) {
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
index c5fcb0e..29d0aeb 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Addresses.java
@@ -49,23 +49,24 @@ public class Addresses extends Test {
     protected static final String ADDR_STREET        = "addr:street";
     protected static final String ASSOCIATED_STREET  = "associatedStreet";
 
-    protected class AddressError extends TestError {
+    protected static class AddressError extends TestError {
 
-        public AddressError(int code, OsmPrimitive p, String message) {
-            this(code, Collections.singleton(p), message);
+        public AddressError(Addresses tester, int code, OsmPrimitive p, String message) {
+            this(tester, code, Collections.singleton(p), message);
         }
 
-        public AddressError(int code, Collection<OsmPrimitive> collection, String message) {
-            this(code, collection, message, null, null);
+        public AddressError(Addresses tester, int code, Collection<OsmPrimitive> collection, String message) {
+            this(tester, code, collection, message, null, null);
         }
 
-        public AddressError(int code, Collection<OsmPrimitive> collection, String message, String description, String englishDescription) {
-            this(code, Severity.WARNING, collection, message, description, englishDescription);
+        public AddressError(Addresses tester, int code, Collection<OsmPrimitive> collection, String message,
+                String description, String englishDescription) {
+            this(tester, code, Severity.WARNING, collection, message, description, englishDescription);
         }
 
-        public AddressError(int code, Severity severity, Collection<OsmPrimitive> collection, String message, String description,
-                String englishDescription) {
-            super(Addresses.this, severity, message, description, englishDescription, code, collection);
+        public AddressError(Addresses tester, int code, Severity severity, Collection<OsmPrimitive> collection, String message,
+                String description, String englishDescription) {
+            super(tester, severity, message, description, englishDescription, code, collection);
         }
     }
 
@@ -100,7 +101,7 @@ public class Addresses extends Test {
             }
             List<OsmPrimitive> errorList = new ArrayList<OsmPrimitive>(list);
             errorList.add(0, p);
-            errors.add(new AddressError(MULTIPLE_STREET_RELATIONS, level, errorList,
+            errors.add(new AddressError(this, MULTIPLE_STREET_RELATIONS, level, errorList,
                     tr("Multiple associatedStreet relations"), null, null));
         }
         return list;
@@ -121,7 +122,7 @@ public class Addresses extends Test {
                 }
             }
             // No street found
-            errors.add(new AddressError(HOUSE_NUMBER_WITHOUT_STREET, p, tr("House number without street")));
+            errors.add(new AddressError(this, HOUSE_NUMBER_WITHOUT_STREET, p, tr("House number without street")));
         }
     }
 
@@ -157,7 +158,8 @@ public class Addresses extends Test {
                         number = number.trim().toUpperCase(Locale.ENGLISH);
                         List<OsmPrimitive> list = map.get(number);
                         if (list == null) {
-                            map.put(number, list = new ArrayList<>());
+                            list = new ArrayList<>();
+                            map.put(number, list);
                         }
                         list.add(p);
                     }
@@ -184,13 +186,13 @@ public class Addresses extends Test {
             for (Entry<String, List<OsmPrimitive>> entry : map.entrySet()) {
                 List<OsmPrimitive> list = entry.getValue();
                 if (list.size() > 1) {
-                    errors.add(new AddressError(DUPLICATE_HOUSE_NUMBER, list,
+                    errors.add(new AddressError(this, DUPLICATE_HOUSE_NUMBER, list,
                             tr("Duplicate house numbers"), tr(englishDescription, entry.getKey()), englishDescription));
                 }
             }
             // Report wrong street names
             if (!wrongStreetNames.isEmpty()) {
-                errors.add(new AddressError(MULTIPLE_STREET_NAMES, wrongStreetNames,
+                errors.add(new AddressError(this, MULTIPLE_STREET_NAMES, wrongStreetNames,
                         tr("Multiple street names in relation")));
             }
             // Report addresses too far away
@@ -246,7 +248,7 @@ public class Addresses extends Test {
         if (hasIncompleteWays) return;
         List<OsmPrimitive> errorList = new ArrayList<OsmPrimitive>(street);
         errorList.add(0, house);
-        errors.add(new AddressError(HOUSE_NUMBER_TOO_FAR, errorList,
+        errors.add(new AddressError(this, HOUSE_NUMBER_TOO_FAR, errorList,
                 tr("House number too far from street")));
     }
 }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
index ffcc2a4..155141f 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
@@ -103,9 +103,9 @@ public class ConditionalKeys extends Test.TagTest {
         public static List<ConditionalValue> parse(String value) throws ConditionalParsingException {
             // <restriction-value> @ <condition>[;<restriction-value> @ <condition>]
             final List<ConditionalValue> r = new ArrayList<>();
-            final Pattern part = Pattern.compile("([^@\\p{Space}][^@]*?)"
-                    + "\\s*@\\s*" + "(\\([^)\\p{Space}][^)]+?\\)|[^();\\p{Space}][^();]*?)\\s*");
-            final Matcher m = Pattern.compile("(" + part + ")(;\\s*" + part + ")*").matcher(value);
+            final String part = Pattern.compile("([^@\\p{Space}][^@]*?)"
+                    + "\\s*@\\s*" + "(\\([^)\\p{Space}][^)]+?\\)|[^();\\p{Space}][^();]*?)\\s*").toString();
+            final Matcher m = Pattern.compile('(' + part + ")(;\\s*" + part + ")*").matcher(value);
             if (!m.matches()) {
                 throw new ConditionalParsingException(tr("Does not match pattern ''restriction value @ condition''"));
             } else {
diff --git a/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java b/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
index 4eddf32..eee822e 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/CrossingWays.java
@@ -39,11 +39,11 @@ public abstract class CrossingWays extends Test {
     private static final String WATERWAY = "waterway";
 
     /** All way segments, grouped by cells */
-    private Map<Point2D, List<WaySegment>> cellSegments;
+    private final Map<Point2D, List<WaySegment>> cellSegments = new HashMap<>(1000);
     /** The already detected errors */
-    private Set<WaySegment> errorSegments;
+    private final Set<WaySegment> errorSegments = new HashSet<>();
     /** The already detected ways in error */
-    private Map<List<Way>, List<WaySegment>> seenWays;
+    private final Map<List<Way>, List<WaySegment>> seenWays = new HashMap<>(50);
 
     /**
      * General crossing ways test.
@@ -187,17 +187,17 @@ public abstract class CrossingWays extends Test {
     @Override
     public void startTest(ProgressMonitor monitor) {
         super.startTest(monitor);
-        cellSegments = new HashMap<>(1000);
-        errorSegments = new HashSet<>();
-        seenWays = new HashMap<>(50);
+        cellSegments.clear();
+        errorSegments.clear();
+        seenWays.clear();
     }
 
     @Override
     public void endTest() {
         super.endTest();
-        cellSegments = null;
-        errorSegments = null;
-        seenWays = null;
+        cellSegments.clear();
+        errorSegments.clear();
+        seenWays.clear();
     }
 
     static String getLayer(OsmPrimitive w) {
diff --git a/src/org/openstreetmap/josm/data/validation/tests/Highways.java b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
index a381c8a..6b966da 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/Highways.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/Highways.java
@@ -74,12 +74,12 @@ public class Highways extends Test {
         super(tr("Highways"), tr("Performs semantic checks on highways."));
     }
 
-    protected class WrongRoundaboutHighway extends TestError {
+    protected static class WrongRoundaboutHighway extends TestError {
 
         public final String correctValue;
 
-        public WrongRoundaboutHighway(Way w, String key) {
-            super(Highways.this, Severity.WARNING,
+        public WrongRoundaboutHighway(Highways tester, Way w, String key) {
+            super(tester, Severity.WARNING,
                     tr("Incorrect roundabout (highway: {0} instead of {1})", w.get("highway"), key),
                     WRONG_ROUNDABOUT_HIGHWAY, w);
             this.correctValue = key;
@@ -105,8 +105,9 @@ public class Highways extends Test {
     @Override
     public void visit(Way w) {
         if (w.isUsable()) {
-            if (w.hasKey("highway") && CLASSIFIED_HIGHWAYS.contains(w.get("highway"))
+            if (w.isClosed() && w.hasKey("highway") && CLASSIFIED_HIGHWAYS.contains(w.get("highway"))
                     && w.hasKey("junction") && "roundabout".equals(w.get("junction"))) {
+                // TODO: find out how to handle splitted roundabouts (see #12841)
                 testWrongRoundabout(w);
             }
             if (w.hasKey(SOURCE_MAXSPEED)) {
@@ -127,7 +128,8 @@ public class Highways extends Test {
                 if (h != w && value != null && !value.endsWith("_link")) {
                     List<Way> list = map.get(value);
                     if (list == null) {
-                        map.put(value, list = new ArrayList<>());
+                        list = new ArrayList<>();
+                        map.put(value, list);
                     }
                     list.add(h);
                 }
@@ -143,7 +145,7 @@ public class Highways extends Test {
                 if (list.size() > 2 || oneway1 == null || oneway2 == null || !oneway1 || !oneway2) {
                     // Error when the highway tags do not match
                     if (!w.get("highway").equals(s)) {
-                        errors.add(new WrongRoundaboutHighway(w, s));
+                        errors.add(new WrongRoundaboutHighway(this, w, s));
                     }
                     break;
                 }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
index b7a98c4..64439f6 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
@@ -749,7 +749,7 @@ public class MapCSSTagChecker extends Test.TagTest {
             } catch (IOException ex) {
                 Main.warn(tr("Failed to add {0} to tag checker", i));
                 Main.warn(ex, false);
-            } catch (Exception ex) {
+            } catch (ParseException ex) {
                 Main.warn(tr("Failed to add {0} to tag checker", i));
                 Main.warn(ex);
             }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java b/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java
index 595c93e..c73727d 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/OpeningHourTest.java
@@ -206,8 +206,8 @@ public class OpeningHourTest extends Test.TagTest {
             String prettifiedValue = null;
             try {
                 prettifiedValue = (String) ((Invocable) ENGINE).invokeMethod(r, "prettifyValue");
-            } catch (Exception e) {
-                Main.debug(e.getMessage());
+            } catch (ScriptException | NoSuchMethodException e) {
+                Main.warn(e);
             }
             for (final Object i : getList(((Invocable) ENGINE).invokeMethod(r, "getErrors"))) {
                 errors.add(new OpeningHoursTestError(getErrorMessage(key, i), Severity.ERROR, prettifiedValue));
diff --git a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
index 4f85a2a..47f55ee 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/PowerLines.java
@@ -69,7 +69,7 @@ public class PowerLines extends Test {
                     if (!isPowerTower(n)) {
                         if (!isPowerAllowed(n) && IN_DOWNLOADED_AREA.evaluate(n)) {
                             if (!w.isFirstLastNode(n) || !isPowerStation(n)) {
-                                potentialErrors.add(new PowerLineError(n, w));
+                                potentialErrors.add(new PowerLineError(this, n, w));
                                 erroneous = true;
                             }
                         }
@@ -205,11 +205,11 @@ public class PowerLines extends Test {
         return v != null && values != null && values.contains(v);
     }
 
-    protected class PowerLineError extends TestError {
+    protected static class PowerLineError extends TestError {
         private final Way line;
 
-        public PowerLineError(Node n, Way line) {
-            super(PowerLines.this, Severity.WARNING,
+        public PowerLineError(PowerLines tester, Node n, Way line) {
+            super(tester, Severity.WARNING,
                     tr("Missing power tower/pole within power line"), POWER_LINES, n);
             this.line = line;
         }
diff --git a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
index b790e51..69e68d3 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
@@ -210,6 +210,11 @@ public class TagChecker extends TagTest {
                             break;
                         case "K:":
                             ignoreDataTag.add(Tag.ofString(line));
+                            break;
+                        default:
+                            if (!key.startsWith(";")) {
+                                Main.warn("Unsupported TagChecker key: " + key);
+                            }
                         }
                     } else if (tagcheckerfile) {
                         if (!line.isEmpty()) {
diff --git a/src/org/openstreetmap/josm/data/validation/util/Entities.java b/src/org/openstreetmap/josm/data/validation/util/Entities.java
index f4d16fa..3c7b375 100644
--- a/src/org/openstreetmap/josm/data/validation/util/Entities.java
+++ b/src/org/openstreetmap/josm/data/validation/util/Entities.java
@@ -390,13 +390,7 @@ public final class Entities {
                             }
                         }
                     } else { // escaped value content is an entity name
-                        if (mapNameToValue == null) {
-                            mapNameToValue = new HashMap<>();
-                            for (String[] pair : ARRAY) {
-                                mapNameToValue.put(pair[0], pair[1]);
-                            }
-                        }
-                        String value = mapNameToValue.get(entityContent);
+                        String value = getMapNameToValue().get(entityContent);
                         entityValue = value == null ? -1 : Integer.parseInt(value);
                     }
                 }
@@ -413,4 +407,14 @@ public final class Entities {
         }
         return res.toString();
     }
+
+    private static synchronized Map<String, String> getMapNameToValue() {
+        if (mapNameToValue == null) {
+            mapNameToValue = new HashMap<>();
+            for (String[] pair : ARRAY) {
+                mapNameToValue.put(pair[0], pair[1]);
+            }
+        }
+        return mapNameToValue;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java b/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
index c3eee35..663ed88 100644
--- a/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
+++ b/src/org/openstreetmap/josm/gui/DefaultNameFormatter.java
@@ -94,7 +94,7 @@ public class DefaultNameFormatter implements NameFormatter, HistoryNameFormatter
     /** The default list of tags which are used as naming tags in relations.
      * A ? prefix indicates a boolean value, for which the key (instead of the value) is used.
      */
-    protected static final String[] DEFAULT_NAMING_TAGS_FOR_RELATIONS = {"name", "ref", "restriction", "landuse", "natural",
+    private static final String[] DEFAULT_NAMING_TAGS_FOR_RELATIONS = {"name", "ref", "restriction", "landuse", "natural",
         "public_transport", ":LocationCode", "note", "?building"};
 
     /** the current list of tags used as naming tags in relations */
@@ -480,7 +480,7 @@ public class DefaultNameFormatter implements NameFormatter, HistoryNameFormatter
     }
 
     private static String buildDefaultToolTip(long id, Map<String, String> tags) {
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(128);
         sb.append("<html><strong>id</strong>=")
           .append(id)
           .append("<br>");
diff --git a/src/org/openstreetmap/josm/gui/FileDrop.java b/src/org/openstreetmap/josm/gui/FileDrop.java
index 928d522..7bb31c2 100644
--- a/src/org/openstreetmap/josm/gui/FileDrop.java
+++ b/src/org/openstreetmap/josm/gui/FileDrop.java
@@ -22,6 +22,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.Reader;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -33,6 +34,7 @@ import javax.swing.border.Border;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.OpenFileAction;
+import org.openstreetmap.josm.gui.FileDrop.TransferableObject;
 
 // CHECKSTYLE.OFF: HideUtilityClassConstructor
 
@@ -137,7 +139,7 @@ public class FileDrop {
     private static File[] createFileArray(BufferedReader bReader) {
         try {
             List<File> list = new ArrayList<>();
-            String line = null;
+            String line;
             while ((line = bReader.readLine()) != null) {
                 try {
                     // kde seems to append a 0 char to the end of the reader
@@ -145,9 +147,8 @@ public class FileDrop {
                         continue;
                     }
 
-                    File file = new File(new URI(line));
-                    list.add(file);
-                } catch (Exception ex) {
+                    list.add(new File(new URI(line)));
+                } catch (URISyntaxException ex) {
                     Main.warn("Error with " + line + ": " + ex.getMessage());
                 }
             }
diff --git a/src/org/openstreetmap/josm/gui/ImageryMenu.java b/src/org/openstreetmap/josm/gui/ImageryMenu.java
index e3189e7..45ee187 100644
--- a/src/org/openstreetmap/josm/gui/ImageryMenu.java
+++ b/src/org/openstreetmap/josm/gui/ImageryMenu.java
@@ -120,10 +120,12 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
 
             @Override
             public void menuDeselected(MenuEvent e) {
+                // Do nothing
             }
 
             @Override
             public void menuCanceled(MenuEvent e) {
+                // Do nothing
             }
         });
         MainMenu.add(subMenu, rectaction);
@@ -237,6 +239,7 @@ public class ImageryMenu extends JMenu implements LayerChangeListener {
 
     @Override
     public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java b/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java
index 64c16f9..b6aef69 100644
--- a/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java
+++ b/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java
@@ -65,7 +65,7 @@ public final class JosmUserIdentityManager implements PreferenceChangedListener
                     !Main.isOffline(OnlineResource.OSM_API)) {
                 try {
                     instance.initFromOAuth();
-                } catch (Exception e) {
+                } catch (RuntimeException e) {
                     Main.error(e);
                     // Fall back to preferences if OAuth identification fails for any reason
                     instance.initFromPreferences();
@@ -277,7 +277,6 @@ public final class JosmUserIdentityManager implements PreferenceChangedListener
                 }
             }
             return;
-
         case "osm-server.url":
             String newUrl = null;
             if (evt.getNewValue() instanceof StringSetting) {
@@ -289,25 +288,20 @@ public final class JosmUserIdentityManager implements PreferenceChangedListener
                 setPartiallyIdentified(getUserName());
             }
             break;
-
         case "oauth.access-token.key":
             accessTokenKeyChanged = true;
             break;
-
         case "oauth.access-token.secret":
             accessTokenSecretChanged = true;
             break;
+        default: // Do nothing
         }
 
         if (accessTokenKeyChanged && accessTokenSecretChanged) {
             accessTokenKeyChanged = false;
             accessTokenSecretChanged = false;
             if (OsmApi.isUsingOAuth()) {
-                try {
-                    getInstance().initFromOAuth();
-                } catch (Exception e) {
-                    Main.error(e);
-                }
+                getInstance().initFromOAuth();
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index fdd4ade..400c83f 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -21,6 +21,7 @@ import java.net.Socket;
 import java.net.URL;
 import java.security.AllPermission;
 import java.security.CodeSource;
+import java.security.GeneralSecurityException;
 import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.PermissionCollection;
@@ -236,7 +237,12 @@ public class MainApplication extends Main {
         }
     }
 
-    private static Map<Option, Collection<String>> buildCommandLineArgumentMap(String[] args) {
+    /**
+     * Builds the command-line argument map.
+     * @param args command-line arguments array
+     * @return command-line argument map
+     */
+    public static Map<Option, Collection<String>> buildCommandLineArgumentMap(String[] args) {
 
         List<LongOpt> los = new ArrayList<>();
         for (Option o : Option.values()) {
@@ -249,7 +255,7 @@ public class MainApplication extends Main {
 
         int c;
         while ((c = g.getopt()) != -1) {
-            Option opt = null;
+            Option opt;
             switch (c) {
                 case 'h':
                     opt = Option.HELP;
@@ -260,6 +266,8 @@ public class MainApplication extends Main {
                 case 0:
                     opt = Option.values()[g.getLongind()];
                     break;
+                default:
+                    opt = null;
             }
             if (opt != null) {
                 Collection<String> values = argMap.get(opt);
@@ -397,7 +405,7 @@ public class MainApplication extends Main {
                 info("Reading preferences from " + i);
                 try (InputStream is = HttpClient.create(new URL(i)).connect().getContent()) {
                     config.openAndReadXML(is);
-                } catch (Exception ex) {
+                } catch (IOException ex) {
                     throw new RuntimeException(ex);
                 }
             }
@@ -405,8 +413,8 @@ public class MainApplication extends Main {
 
         try {
             CertificateAmendment.addMissingCertificates();
-        } catch (IOException ex) {
-            ex.printStackTrace();
+        } catch (IOException | GeneralSecurityException ex) {
+            Main.warn(ex);
             Main.warn(getErrorMessage(Utils.getRootCause(ex)));
         }
         Authenticator.setDefault(DefaultAuthenticator.getInstance());
@@ -564,6 +572,7 @@ public class MainApplication extends Main {
     private static void checkIPv6() {
         if ("auto".equals(Main.pref.get("prefer.ipv6", "auto"))) {
              new Thread(new Runnable() { /* this may take some time (DNS, Connect) */
+                @Override
                 public void run() {
                     boolean hasv6 = false;
                     boolean wasv6 = Main.pref.getBoolean("validated.ipv6", false);
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
index 8267bbe..15115e1 100644
--- a/src/org/openstreetmap/josm/gui/MainMenu.java
+++ b/src/org/openstreetmap/josm/gui/MainMenu.java
@@ -32,13 +32,13 @@ import org.openstreetmap.josm.actions.AlignInLineAction;
 import org.openstreetmap.josm.actions.AutoScaleAction;
 import org.openstreetmap.josm.actions.ChangesetManagerToggleAction;
 import org.openstreetmap.josm.actions.CloseChangesetAction;
-import org.openstreetmap.josm.actions.DeleteLayerAction;
 import org.openstreetmap.josm.actions.CombineWayAction;
 import org.openstreetmap.josm.actions.CopyAction;
 import org.openstreetmap.josm.actions.CopyCoordinatesAction;
 import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.actions.CreateMultipolygonAction;
 import org.openstreetmap.josm.actions.DeleteAction;
+import org.openstreetmap.josm.actions.DeleteLayerAction;
 import org.openstreetmap.josm.actions.DialogsToggleAction;
 import org.openstreetmap.josm.actions.DistributeAction;
 import org.openstreetmap.josm.actions.DownloadAction;
@@ -402,10 +402,14 @@ public class MainMenu extends JMenuBar {
      */
     public static final MenuListener menuSeparatorHandler = new MenuListener() {
         @Override
-        public void menuCanceled(MenuEvent e) {}
+        public void menuCanceled(MenuEvent e) {
+            // Do nothing
+        }
 
         @Override
-        public void menuDeselected(MenuEvent e) {}
+        public void menuDeselected(MenuEvent e) {
+            // Do nothing
+        }
 
         @Override
         public void menuSelected(MenuEvent a) {
@@ -819,17 +823,6 @@ public class MainMenu extends JMenuBar {
         new PresetsMenuEnabler(presetsMenu).refreshEnabled();
     }
 
-    private int getMaximumAvailableWidth() {
-        int maxWidth = getSize().width;
-        for (int i = 0; i < getMenuCount(); i++) {
-            JMenu menu = getMenu(i);
-            if (menu != null) {
-                maxWidth -= menu.getPreferredSize().width;
-            }
-        }
-        return maxWidth;
-    }
-
     /**
      * Search main menu for items with {@code textToFind} in title.
      * @param textToFind The text to find
diff --git a/src/org/openstreetmap/josm/gui/MapFrame.java b/src/org/openstreetmap/josm/gui/MapFrame.java
index f5e195b..6c0e557 100644
--- a/src/org/openstreetmap/josm/gui/MapFrame.java
+++ b/src/org/openstreetmap/josm/gui/MapFrame.java
@@ -75,6 +75,7 @@ import org.openstreetmap.josm.gui.dialogs.UserListDialog;
 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.util.AdvancedKeyPressDetector;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -97,6 +98,8 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
     /**
      * The view control displayed.
+     * <p>
+     * Accessing this is discouraged. Use the {@link LayerManager} to access map data.
      */
     public final MapView mapView;
 
@@ -132,21 +135,21 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
     // Toggle dialogs
 
     /** Conflict dialog */
-    public ConflictDialog conflictDialog;
+    public final ConflictDialog conflictDialog;
     /** Filter dialog */
-    public FilterDialog filterDialog;
+    public final FilterDialog filterDialog;
     /** Relation list dialog */
-    public RelationListDialog relationListDialog;
+    public final RelationListDialog relationListDialog;
     /** Validator dialog */
-    public ValidatorDialog validatorDialog;
+    public final ValidatorDialog validatorDialog;
     /** Selection list dialog */
-    public SelectionListDialog selectionListDialog;
+    public final SelectionListDialog selectionListDialog;
     /** Properties dialog */
-    public PropertiesDialog propertiesDialog;
+    public final PropertiesDialog propertiesDialog;
     /** Map paint dialog */
-    public MapPaintDialog mapPaintDialog;
+    public final MapPaintDialog mapPaintDialog;
     /** Notes dialog */
-    public NotesDialog noteDialog;
+    public final NotesDialog noteDialog;
 
     // Map modes
 
@@ -189,7 +192,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
         setSize(400, 400);
         setLayout(new BorderLayout());
 
-        mapView = new MapView(contentPane, viewportData);
+        mapView = new MapView(Main.getLayerManager(), contentPane, viewportData);
         if (!GraphicsEnvironment.isHeadless()) {
             new FileDrop(mapView);
         }
@@ -219,6 +222,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
                 return new BasicSplitPaneDivider(this) {
                     @Override
                     public void setBorder(Border b) {
+                        // Do nothing
                     }
                 };
             }
@@ -236,10 +240,15 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
         mapView.setMinimumSize(new Dimension(10, 0));
 
         // toolBarActions, map mode buttons
-        addMapMode(new IconToggleButton(mapModeSelect = new SelectAction(this)));
-        addMapMode(new IconToggleButton(mapModeSelectLasso = new LassoModeAction(), true));
-        addMapMode(new IconToggleButton(mapModeDraw = new DrawAction(this)));
-        addMapMode(new IconToggleButton(mapModeZoom = new ZoomAction(this)));
+        mapModeSelect = new SelectAction(this);
+        mapModeSelectLasso = new LassoModeAction();
+        mapModeDraw = new DrawAction(this);
+        mapModeZoom = new ZoomAction(this);
+
+        addMapMode(new IconToggleButton(mapModeSelect));
+        addMapMode(new IconToggleButton(mapModeSelectLasso, true));
+        addMapMode(new IconToggleButton(mapModeDraw));
+        addMapMode(new IconToggleButton(mapModeZoom, true));
         addMapMode(new IconToggleButton(new DeleteAction(this), true));
         addMapMode(new IconToggleButton(new ParallelWayAction(this), true));
         addMapMode(new IconToggleButton(new ExtrudeAction(this), true));
@@ -249,19 +258,28 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
         // toolBarToggles, toggle dialog buttons
         LayerListDialog.createInstance(this);
+        propertiesDialog = new PropertiesDialog();
+        selectionListDialog = new SelectionListDialog();
+        relationListDialog = new RelationListDialog();
+        conflictDialog = new ConflictDialog();
+        validatorDialog = new ValidatorDialog();
+        filterDialog = new FilterDialog();
+        mapPaintDialog = new MapPaintDialog();
+        noteDialog = new NotesDialog();
+
         addToggleDialog(LayerListDialog.getInstance());
-        addToggleDialog(propertiesDialog = new PropertiesDialog());
-        addToggleDialog(selectionListDialog = new SelectionListDialog());
-        addToggleDialog(relationListDialog = new RelationListDialog());
+        addToggleDialog(propertiesDialog);
+        addToggleDialog(selectionListDialog);
+        addToggleDialog(relationListDialog);
         addToggleDialog(new MinimapDialog());
         addToggleDialog(new CommandStackDialog());
         addToggleDialog(new UserListDialog());
-        addToggleDialog(conflictDialog = new ConflictDialog());
-        addToggleDialog(validatorDialog = new ValidatorDialog());
-        addToggleDialog(filterDialog = new FilterDialog());
+        addToggleDialog(conflictDialog);
+        addToggleDialog(validatorDialog);
+        addToggleDialog(filterDialog);
         addToggleDialog(new ChangesetDialog(), true);
-        addToggleDialog(mapPaintDialog = new MapPaintDialog());
-        addToggleDialog(noteDialog = new NotesDialog());
+        addToggleDialog(mapPaintDialog);
+        addToggleDialog(noteDialog);
         toolBarToggle.setFloatable(false);
 
         // status line below the map
@@ -270,8 +288,12 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
 
         boolean unregisterTab = Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null;
         if (unregisterTab) {
-            for (JComponent c: allDialogButtons) c.setFocusTraversalKeysEnabled(false);
-            for (JComponent c: allMapModeButtons) c.setFocusTraversalKeysEnabled(false);
+            for (JComponent c: allDialogButtons) {
+                c.setFocusTraversalKeysEnabled(false);
+            }
+            for (JComponent c: allMapModeButtons) {
+                c.setFocusTraversalKeysEnabled(false);
+            }
         }
 
         if (Main.pref.getBoolean("debug.advanced-keypress-detector.enable", true)) {
@@ -545,7 +567,9 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
                 }
 
                 @Override
-                public void popupMenuCanceled(PopupMenuEvent e) {}
+                public void popupMenuCanceled(PopupMenuEvent e) {
+                    // Do nothing
+                }
             });
 
             add(new AbstractAction(tr("Hide edit toolbar")) {
@@ -598,8 +622,10 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
                     }
                 }));
             }
-            Rectangle bounds = button.getBounds();
-            menu.show(button, bounds.x + bounds.width, 0);
+            if (button != null) {
+                Rectangle bounds = button.getBounds();
+                menu.show(button, bounds.x + bounds.width, 0);
+            }
         }
     }
 
@@ -751,7 +777,7 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
                 mapMode.enterMode();
             }
             // invalidate repaint cache
-            Main.map.mapView.preferenceChanged(null);
+            mapView.preferenceChanged(null);
         }
 
         // After all listeners notice new layer, some buttons will be disabled/enabled
@@ -776,7 +802,9 @@ public class MapFrame extends JPanel implements Destroyable, LayerChangeListener
     }
 
     @Override
-    public void layerAdded(Layer newLayer) { }
+    public void layerAdded(Layer newLayer) {
+        // Do nothing
+    }
 
     @Override
     public void layerRemoved(Layer oldLayer) {
diff --git a/src/org/openstreetmap/josm/gui/MapMover.java b/src/org/openstreetmap/josm/gui/MapMover.java
index 6f88df6..377580f 100644
--- a/src/org/openstreetmap/josm/gui/MapMover.java
+++ b/src/org/openstreetmap/josm/gui/MapMover.java
@@ -91,6 +91,7 @@ public class MapMover extends MouseAdapter implements Destroyable {
                 case "down":
                     nc.zoomTo(new EastNorth(center.east(), newcenter.north()));
                     break;
+                default: // Do nothing
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/MapStatus.java b/src/org/openstreetmap/josm/gui/MapStatus.java
index 5a61fda..c46580e 100644
--- a/src/org/openstreetmap/josm/gui/MapStatus.java
+++ b/src/org/openstreetmap/josm/gui/MapStatus.java
@@ -20,6 +20,8 @@ import java.awt.SystemColor;
 import java.awt.Toolkit;
 import java.awt.event.AWTEventListener;
 import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
@@ -90,7 +92,7 @@ import org.openstreetmap.josm.tools.Predicate;
  *
  * @author imi
  */
-public class MapStatus extends JPanel implements Helpful, Destroyable, PreferenceChangedListener {
+public final class MapStatus extends JPanel implements Helpful, Destroyable, PreferenceChangedListener, SoMChangeListener {
 
     private final DecimalFormat DECIMAL_FORMAT = new DecimalFormat(Main.pref.get("statusbar.decimal-format", "0.0"));
     private final double DISTANCE_THRESHOLD = Main.pref.getDouble("statusbar.distance-threshold", 0.01);
@@ -196,13 +198,12 @@ public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc
     private final ImageLabel distText = new ImageLabel("dist",
             tr("The length of the new way segment being drawn."), 10, PROP_BACKGROUND_COLOR.get());
     private final ImageLabel nameText = new ImageLabel("name",
-            tr("The name of the object at the mouse pointer."), 20, PROP_BACKGROUND_COLOR.get());
+            tr("The name of the object at the mouse pointer."), getNameLabelCharacterCount(Main.parent), PROP_BACKGROUND_COLOR.get());
     private final JosmTextField helpText = new JosmTextField();
     private final JProgressBar progressBar = new JProgressBar();
+    private final transient ComponentAdapter mvComponentAdapter;
     public final transient BackgroundProgressMonitor progressMonitor = new BackgroundProgressMonitor();
 
-    private final transient SoMChangeListener somListener;
-
     // Distance value displayed in distText, stored if refresh needed after a change of system of measurement
     private double distValue;
 
@@ -923,12 +924,7 @@ public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc
             });
         }
 
-        SystemOfMeasurement.addSoMChangeListener(somListener = new SoMChangeListener() {
-            @Override
-            public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
-                setDist(distValue);
-            }
-        });
+        SystemOfMeasurement.addSoMChangeListener(this);
 
         latText.addMouseListener(jumpToOnLeftClick);
         lonText.addMouseListener(jumpToOnLeftClick);
@@ -954,12 +950,26 @@ public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc
 
         Main.pref.addPreferenceChangeListener(this);
 
+        mvComponentAdapter = new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                nameText.setCharCount(getNameLabelCharacterCount(Main.parent));
+                revalidate();
+            }
+        };
+        mv.addComponentListener(mvComponentAdapter);
+
         // The background thread
         thread = new Thread(collector, "Map Status Collector");
         thread.setDaemon(true);
         thread.start();
     }
 
+    @Override
+    public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
+        setDist(distValue);
+    }
+
     /**
      * Updates the system of measurement and displays a notification.
      * @param newsom The new system of measurement to set
@@ -1077,15 +1087,16 @@ public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc
 
     @Override
     public void destroy() {
-        SystemOfMeasurement.removeSoMChangeListener(somListener);
+        SystemOfMeasurement.removeSoMChangeListener(this);
         Main.pref.removePreferenceChangeListener(this);
+        mv.removeComponentListener(mvComponentAdapter);
 
         // MapFrame gets destroyed when the last layer is removed, but the status line background
         // thread that collects the information doesn't get destroyed automatically.
         if (thread != null) {
             try {
                 thread.interrupt();
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 Main.error(e);
             }
         }
@@ -1118,4 +1129,9 @@ public class MapStatus extends JPanel implements Helpful, Destroyable, Preferenc
         PROP_ACTIVE_BACKGROUND_COLOR.get();
         PROP_ACTIVE_FOREGROUND_COLOR.get();
     }
+
+    private static int getNameLabelCharacterCount(Component parent) {
+        int w = parent != null ? parent.getWidth() : 800;
+        return Math.min(80, 20 + Math.max(0, w-1280) * 60 / (1920-1280));
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index 11ade19..a999166 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -25,10 +25,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.EnumSet;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -58,11 +56,16 @@ import org.openstreetmap.josm.gui.layer.AbstractMapViewPaintable;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.LayerPositionStrategy;
+import org.openstreetmap.josm.gui.layer.LayerManager;
+import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
+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.MapViewPaintable;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationEvent;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationListener;
-import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
@@ -71,6 +74,7 @@ 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;
+import org.openstreetmap.josm.tools.bugreport.BugReport;
 import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
 
 /**
@@ -86,12 +90,16 @@ import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
  * @author imi
  */
 public class MapView extends NavigatableComponent
-implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.LayerStateChangeListener {
-
+implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.LayerStateChangeListener,
+LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
     /**
      * Interface to notify listeners of a layer change.
+     * <p>
+     * To be removed: end of 2016.
+     * @deprecated Use {@link org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener} instead.
      * @author imi
      */
+    @Deprecated
     public interface LayerChangeListener {
 
         /**
@@ -116,7 +124,11 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
 
     /**
      * An interface that needs to be implemented in order to listen for changes to the active edit layer.
+     * <p>
+     * To be removed: end of 2016.
+     * @deprecated Use {@link ActiveLayerChangeListener} instead.
      */
+    @Deprecated
     public interface EditLayerChangeListener {
 
         /**
@@ -130,6 +142,7 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
     /**
      * An invalidation listener that simply calls repaint() for now.
      * @author Michael Zangl
+     * @since 10271
      */
     private class LayerInvalidatedListener implements PaintableInvalidationListener {
         private boolean ignoreRepaint;
@@ -171,111 +184,259 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
         }
     }
 
-    public boolean viewportFollowing;
+    /**
+     * This class is an adapter for the old layer change interface.
+     * <p>
+     * New implementations should use {@link org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener}
+     * @author Michael Zangl
+     * @since 10271
+     */
+    protected static class LayerChangeAdapter implements ActiveLayerChangeListener, LayerManager.LayerChangeListener {
+
+        private final LayerChangeListener wrapped;
+        private boolean receiveOneInitialFire;
+
+        public LayerChangeAdapter(LayerChangeListener wrapped) {
+            this.wrapped = wrapped;
+        }
+
+        public LayerChangeAdapter(LayerChangeListener wrapped, boolean initialFire) {
+            this(wrapped);
+            this.receiveOneInitialFire = initialFire;
+        }
+
+        @Override
+        public void layerAdded(LayerAddEvent e) {
+            wrapped.layerAdded(e.getAddedLayer());
+        }
+
+        @Override
+        public void layerRemoving(LayerRemoveEvent e) {
+            wrapped.layerRemoved(e.getRemovedLayer());
+        }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // not in old API
+        }
+
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            Layer oldActive = receiveOneInitialFire ? null : e.getPreviousActiveLayer();
+            Layer newActive = e.getSource().getActiveLayer();
+            if (oldActive != newActive) {
+                wrapped.activeLayerChange(oldActive, newActive);
+            }
+            receiveOneInitialFire = false;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((wrapped == null) ? 0 : wrapped.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            LayerChangeAdapter other = (LayerChangeAdapter) obj;
+            if (wrapped == null) {
+                if (other.wrapped != null)
+                    return false;
+            } else if (!wrapped.equals(other.wrapped))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "LayerChangeAdapter [wrapped=" + wrapped + ']';
+        }
+    }
 
     /**
-     * the layer listeners
+     * This class is an adapter for the old layer change interface.
+     * <p>
+     * New implementations should use {@link org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener}
+     * @author Michael Zangl
+     * @since 10271
      */
-    private static final CopyOnWriteArrayList<LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<>();
-    private static final CopyOnWriteArrayList<EditLayerChangeListener> editLayerChangeListeners = new CopyOnWriteArrayList<>();
+    protected static class EditLayerChangeAdapter implements ActiveLayerChangeListener {
+
+        private final EditLayerChangeListener wrapped;
+
+        public EditLayerChangeAdapter(EditLayerChangeListener wrapped) {
+            this.wrapped = wrapped;
+        }
+
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            OsmDataLayer oldLayer = e.getPreviousEditLayer();
+            OsmDataLayer newLayer = e.getSource().getEditLayer();
+            if (oldLayer != newLayer) {
+                wrapped.editLayerChanged(oldLayer, newLayer);
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + ((wrapped == null) ? 0 : wrapped.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            EditLayerChangeAdapter other = (EditLayerChangeAdapter) obj;
+            if (wrapped == null) {
+                if (other.wrapped != null)
+                    return false;
+            } else if (!wrapped.equals(other.wrapped))
+                return false;
+            return true;
+        }
+
+        @Override
+        public String toString() {
+            return "EditLayerChangeAdapter [wrapped=" + wrapped + ']';
+        }
+    }
 
     /**
      * Removes a layer change listener
+     * <p>
+     * To be removed: end of 2016.
      *
-     * @param listener the listener. Ignored if null or already registered.
+     * @param listener the listener. Ignored if null or not registered.
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public static void removeLayerChangeListener(LayerChangeListener listener) {
-        layerChangeListeners.remove(listener);
+        LayerChangeAdapter adapter = new LayerChangeAdapter(listener);
+        try {
+            Main.getLayerManager().removeLayerChangeListener(adapter);
+        } catch (IllegalArgumentException e) {
+            // Ignored in old implementation
+            if (Main.isDebugEnabled()) {
+                Main.debug(e.getMessage());
+            }
+        }
+        try {
+            Main.getLayerManager().removeActiveLayerChangeListener(adapter);
+        } catch (IllegalArgumentException e) {
+            // Ignored in old implementation
+            if (Main.isDebugEnabled()) {
+                Main.debug(e.getMessage());
+            }
+        }
     }
 
+    /**
+     * Removes an edit layer change listener
+     * <p>
+     * To be removed: end of 2016.
+     *
+     * @param listener the listener. Ignored if null or not registered.
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
+     */
+    @Deprecated
     public static void removeEditLayerChangeListener(EditLayerChangeListener listener) {
-        editLayerChangeListeners.remove(listener);
+        try {
+            Main.getLayerManager().removeActiveLayerChangeListener(new EditLayerChangeAdapter(listener));
+        } catch (IllegalArgumentException e) {
+            // Ignored in old implementation
+            if (Main.isDebugEnabled()) {
+                Main.debug(e.getMessage());
+            }
+        }
     }
 
     /**
      * Adds a layer change listener
+     * <p>
+     * To be removed: end of 2016.
      *
      * @param listener the listener. Ignored if null or already registered.
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener) {
-        if (listener != null) {
-            layerChangeListeners.addIfAbsent(listener);
-        }
+        addLayerChangeListener(listener, false);
     }
 
     /**
      * Adds a layer change listener
+     * <p>
+     * To be removed: end of 2016.
      *
      * @param listener the listener. Ignored if null or already registered.
      * @param initialFire fire an active-layer-changed-event right after adding
      * the listener in case there is a layer present (should be)
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public static void addLayerChangeListener(LayerChangeListener listener, boolean initialFire) {
-        addLayerChangeListener(listener);
-        if (initialFire && Main.isDisplayingMapView()) {
-            listener.activeLayerChange(null, Main.map.mapView.getActiveLayer());
+        if (listener != null) {
+            initialFire = initialFire && Main.isDisplayingMapView();
+
+            LayerChangeAdapter adapter = new LayerChangeAdapter(listener, initialFire);
+            Main.getLayerManager().addLayerChangeListener(adapter, false);
+            Main.getLayerManager().addActiveLayerChangeListener(adapter, initialFire);
+            adapter.receiveOneInitialFire = false;
         }
     }
 
     /**
      * Adds an edit layer change listener
+     * <p>
+     * To be removed: end of 2016.
      *
      * @param listener the listener. Ignored if null or already registered.
      * @param initialFire fire an edit-layer-changed-event right after adding
      * the listener in case there is an edit layer present
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public static void addEditLayerChangeListener(EditLayerChangeListener listener, boolean initialFire) {
-        addEditLayerChangeListener(listener);
-        if (initialFire && Main.isDisplayingMapView() && Main.map.mapView.getEditLayer() != null) {
-            listener.editLayerChanged(null, Main.map.mapView.getEditLayer());
+        if (listener != null) {
+            Main.getLayerManager().addActiveLayerChangeListener(new EditLayerChangeAdapter(listener),
+                    initialFire && Main.isDisplayingMapView() && Main.map.mapView.getEditLayer() != null);
         }
     }
 
     /**
      * Adds an edit layer change listener
+     * <p>
+     * To be removed: end of 2016.
      *
      * @param listener the listener. Ignored if null or already registered.
+     * @deprecated You should register the listener on {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public static void addEditLayerChangeListener(EditLayerChangeListener listener) {
-        if (listener != null) {
-            editLayerChangeListeners.addIfAbsent(listener);
-        }
-    }
-
-    /**
-     * Calls the {@link LayerChangeListener#activeLayerChange(Layer, Layer)} method of all listeners.
-     *
-     * @param oldLayer The old layer
-     * @param newLayer The new active layer.
-     */
-    protected void fireActiveLayerChanged(Layer oldLayer, Layer newLayer) {
-        for (LayerChangeListener l : layerChangeListeners) {
-            l.activeLayerChange(oldLayer, newLayer);
-        }
-    }
-
-    protected void fireLayerAdded(Layer newLayer) {
-        for (MapView.LayerChangeListener l : MapView.layerChangeListeners) {
-            l.layerAdded(newLayer);
-        }
-    }
-
-    protected void fireLayerRemoved(Layer layer) {
-        for (MapView.LayerChangeListener l : MapView.layerChangeListeners) {
-            l.layerRemoved(layer);
-        }
+        addEditLayerChangeListener(listener, false);
     }
 
-    protected void fireEditLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        for (EditLayerChangeListener l : editLayerChangeListeners) {
-            l.editLayerChanged(oldLayer, newLayer);
-        }
-    }
+    public boolean viewportFollowing = false;
 
     /**
-     * A list of all layers currently loaded.
+     * A list of all layers currently loaded. If we support multiple map views, this list may be different for each of them.
      */
-    private final transient List<Layer> layers = new ArrayList<>();
+    private final MainLayerManager layerManager;
 
     /**
      * The play head marker: there is only one of these so it isn't in any specific layer
@@ -283,16 +444,6 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
     public transient PlayHeadMarker playHeadMarker;
 
     /**
-     * The layer from the layers list that is currently active.
-     */
-    private transient Layer activeLayer;
-
-    /**
-     * The edit layer is the current active data layer.
-     */
-    private transient OsmDataLayer editLayer;
-
-    /**
      * The last event performed by mouse.
      */
     public MouseEvent lastMEvent = new MouseEvent(this, 0, 0, 0, 0, 0, 0, false); // In case somebody reads it before first mouse move
@@ -321,13 +472,18 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
 
     /**
      * 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 viewportData the initial viewport of the map. Can be null, then
      * the viewport is derived from the layer data.
+     * @since 10279
      */
-    public MapView(final JPanel contentPane, final ViewportData viewportData) {
+    public MapView(MainLayerManager layerManager, final JPanel contentPane, final ViewportData viewportData) {
+        this.layerManager = layerManager;
         initialViewport = viewportData;
+        layerManager.addLayerChangeListener(this);
+        layerManager.addActiveLayerChangeListener(this, false);
         Main.pref.addPreferenceChangeListener(this);
 
         addComponentListener(new ComponentAdapter() {
@@ -404,84 +560,45 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
     }
 
     /**
-     * Add a layer to the current MapView. The layer will be added at topmost
-     * position.
+     * Add a layer to the current MapView.
+     * <p>
+     * To be removed: end of 2016.
      * @param layer The layer to add
+     * @deprecated Use {@link Main#getLayerManager()}.addLayer() instead.
      */
+    @Deprecated
     public void addLayer(Layer layer) {
-        boolean isOsmDataLayer = layer instanceof OsmDataLayer;
-        EnumSet<LayerListenerType> listenersToFire = EnumSet.noneOf(LayerListenerType.class);
-        Layer oldActiveLayer = activeLayer;
-        OsmDataLayer oldEditLayer = editLayer;
-
-        synchronized (layers) {
-            if (layer instanceof MarkerLayer && playHeadMarker == null) {
-                playHeadMarker = PlayHeadMarker.create();
-            }
-
-            LayerPositionStrategy positionStrategy = layer.getDefaultLayerPosition();
-            int position = positionStrategy.getPosition(this);
-            checkPosition(position);
-            insertLayerAt(layer, position);
-
-            if (isOsmDataLayer || oldActiveLayer == null) {
-                // autoselect the new layer
-                listenersToFire.addAll(setActiveLayer(layer, true));
-            }
-
-            if (isOsmDataLayer) {
-                ((OsmDataLayer) layer).addLayerStateChangeListener(this);
-            }
-
-            if (layer instanceof NativeScaleLayer) {
-                Main.map.mapView.setNativeScaleLayer((NativeScaleLayer) layer);
-            }
+        layerManager.addLayer(layer);
+    }
 
-            layer.addPropertyChangeListener(this);
-            invalidatedListener.addTo(layer);
-            Main.addProjectionChangeListener(layer);
-            AudioPlayer.reset();
+    @Override
+    public void layerAdded(LayerAddEvent e) {
+        Layer layer = e.getAddedLayer();
+        if (layer instanceof MarkerLayer && playHeadMarker == null) {
+            playHeadMarker = PlayHeadMarker.create();
         }
-        fireLayerAdded(layer);
-        onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
 
-        if (!listenersToFire.isEmpty()) {
-            repaint();
+        boolean isOsmDataLayer = layer instanceof OsmDataLayer;
+        if (isOsmDataLayer) {
+            ((OsmDataLayer) layer).addLayerStateChangeListener(this);
         }
-    }
 
-    /**
-     * Check if the (new) position is valid
-     * @param position The position index
-     * @throws IndexOutOfBoundsException if it is not.
-     */
-    private void checkPosition(int position) {
-        if (position < 0 || position > layers.size()) {
-            throw new IndexOutOfBoundsException("Position " + position + " out of range.");
-        }
+        layer.addPropertyChangeListener(this);
+        Main.addProjectionChangeListener(layer);
+        invalidatedListener.addTo(layer);
+        AudioPlayer.reset();
+
+        repaint();
     }
 
     /**
-     * Insert a layer at a given position.
-     * @param layer The layer to add.
-     * @param position The position on which we should add it.
+     * Returns current data set. To be removed: end of 2016.
+     * @deprecated Use {@link Main#getLayerManager()} instead.
      */
-    private void insertLayerAt(Layer layer, int position) {
-        if (position == layers.size()) {
-            layers.add(layer);
-        } else {
-            layers.add(position, layer);
-        }
-    }
-
     @Override
+    @Deprecated
     protected DataSet getCurrentDataSet() {
-        synchronized (layers) {
-            if (editLayer != null)
-                return editLayer.data;
-            else
-                return null;
-        }
+        return layerManager.getEditDataSet();
     }
 
     /**
@@ -490,9 +607,7 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      * @return true if the active data layer (edit layer) is drawable, false otherwise
      */
     public boolean isActiveLayerDrawable() {
-        synchronized (layers) {
-            return editLayer != null;
-        }
+         return getEditLayer() != null;
     }
 
     /**
@@ -501,23 +616,24 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      * @return true if the active data layer (edit layer) is visible, false otherwise
      */
     public boolean isActiveLayerVisible() {
-        synchronized (layers) {
-            return isActiveLayerDrawable() && editLayer.isVisible();
-        }
+        OsmDataLayer e = getEditLayer();
+        return e != null && e.isVisible();
     }
 
     /**
-     * Determines the next active data layer according to the following
-     * rules:
+     * Determines the next active data layer according to the following rules:
      * <ul>
      *   <li>if there is at least one {@link OsmDataLayer} the first one
      *     becomes active</li>
      *   <li>otherwise, the top most layer of any type becomes active</li>
      * </ul>
+     * To be removed: end of 2016.
      * @param layersList lit of layers
      *
      * @return the next active data layer
+     * @deprecated now handled by {@link MainLayerManager}
      */
+    @Deprecated
     protected Layer determineNextActiveLayer(List<Layer> layersList) {
         // First look for data layer
         for (Layer layer:layersList) {
@@ -531,51 +647,35 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
 
         // and then give up
         return null;
-
     }
 
     /**
      * Remove the layer from the mapview. If the layer was in the list before,
      * an LayerChange event is fired.
+     * <p>
+     * To be removed: end of 2016.
      * @param layer The layer to remove
+     * @deprecated Use {@link Main#getLayerManager()}.removeLayer() instead.
      */
+    @Deprecated
     public void removeLayer(Layer layer) {
-        EnumSet<LayerListenerType> listenersToFire = EnumSet.noneOf(LayerListenerType.class);
-        Layer oldActiveLayer = activeLayer;
-        OsmDataLayer oldEditLayer = editLayer;
-
-        synchronized (layers) {
-            List<Layer> layersList = new ArrayList<>(layers);
-
-            if (!layersList.remove(layer))
-                return;
-
-            listenersToFire = setEditLayer(layersList);
-
-            if (layer == activeLayer) {
-                listenersToFire.addAll(setActiveLayer(determineNextActiveLayer(layersList), false));
-            }
-
-            if (layer instanceof OsmDataLayer) {
-                ((OsmDataLayer) layer).removeLayerPropertyChangeListener(this);
-            }
+        layerManager.removeLayer(layer);
+    }
 
-            layers.remove(layer);
-            Main.removeProjectionChangeListener(layer);
-            layer.removePropertyChangeListener(this);
-            invalidatedListener.removeFrom(layer);
-            layer.destroy();
-            AudioPlayer.reset();
+    @Override
+    public void layerRemoving(LayerRemoveEvent e) {
+        Layer layer = e.getRemovedLayer();
+        if (layer instanceof OsmDataLayer) {
+            ((OsmDataLayer) layer).removeLayerPropertyChangeListener(this);
         }
-        onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
-        fireLayerRemoved(layer);
 
-        repaint();
-    }
+        Main.removeProjectionChangeListener(layer);
+        layer.removePropertyChangeListener(this);
+        invalidatedListener.removeFrom(layer);
+        layer.destroy();
+        AudioPlayer.reset();
 
-    private void onEditLayerChanged(OsmDataLayer oldEditLayer) {
-        fireEditLayerChanged(oldEditLayer, editLayer);
-        refreshTitle();
+        repaint();
     }
 
     private boolean virtualNodesEnabled;
@@ -604,41 +704,27 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      * @param pos       The new position of the layer
      */
     public void moveLayer(Layer layer, int pos) {
-        EnumSet<LayerListenerType> listenersToFire;
-        Layer oldActiveLayer = activeLayer;
-        OsmDataLayer oldEditLayer = editLayer;
-
-        synchronized (layers) {
-            int curLayerPos = layers.indexOf(layer);
-            if (curLayerPos == -1)
-                throw new IllegalArgumentException(tr("Layer not in list."));
-            if (pos == curLayerPos)
-                return; // already in place.
-            layers.remove(curLayerPos);
-            if (pos >= layers.size()) {
-                layers.add(layer);
-            } else {
-                layers.add(pos, layer);
-            }
-            listenersToFire = setEditLayer(layers);
-            AudioPlayer.reset();
-        }
-        onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
+        layerManager.moveLayer(layer, pos);
+    }
 
+    @Override
+    public void layerOrderChanged(LayerOrderChangeEvent e) {
+        AudioPlayer.reset();
         repaint();
     }
 
     /**
      * Gets the index of the layer in the layer list.
+     * <p>
+     * To be removed: end of 2016.
      * @param layer The layer to search for.
      * @return The index in the list.
      * @throws IllegalArgumentException if that layer does not belong to this view.
+     * @deprecated Access the layer list using {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public int getLayerPos(Layer layer) {
-        int curLayerPos;
-        synchronized (layers) {
-            curLayerPos = layers.indexOf(layer);
-        }
+        int curLayerPos = layerManager.getLayers().indexOf(layer);
         if (curLayerPos == -1)
             throw new IllegalArgumentException(tr("Layer not in list."));
         return curLayerPos;
@@ -649,45 +735,28 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      * first, layer with the highest Z-Order last.
      * <p>
      * The active data layer is pulled above all adjacent data layers.
+     * <p>
+     * To be removed: end of 2016.
      *
      * @return a list of the visible in Z-Order, the layer with the lowest Z-Order
      * first, layer with the highest Z-Order last.
+     * @deprecated Access the layer list using {@link Main#getLayerManager()} instead.
      */
+    @Deprecated
     public List<Layer> getVisibleLayersInZOrder() {
-        synchronized (layers) {
-            List<Layer> ret = new ArrayList<>();
-            // This is set while we delay the addition of the active layer.
-            boolean activeLayerDelayed = false;
-            for (ListIterator<Layer> iterator = layers.listIterator(layers.size()); iterator.hasPrevious();) {
-                Layer l = iterator.previous();
-                if (!l.isVisible()) {
-                    // ignored
-                } else if (l == activeLayer && l instanceof OsmDataLayer) {
-                    // delay and add after the current block of OsmDataLayer
-                    activeLayerDelayed = true;
-                } else {
-                    if (activeLayerDelayed && !(l instanceof OsmDataLayer)) {
-                        // add active layer before the current one.
-                        ret.add(activeLayer);
-                        activeLayerDelayed = false;
-                    }
-                    // Add this layer now
-                    ret.add(l);
-                }
-            }
-            if (activeLayerDelayed) {
-                ret.add(activeLayer);
-            }
-            return ret;
-        }
+        return layerManager.getVisibleLayersInZOrder();
     }
 
     private void paintLayer(Layer layer, Graphics2D g, Bounds box) {
-        if (layer.getOpacity() < 1) {
-            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) layer.getOpacity()));
+        try {
+            if (layer.getOpacity() < 1) {
+                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) layer.getOpacity()));
+            }
+            layer.paint(g, this, box);
+            g.setPaintMode();
+        } catch (RuntimeException t) {
+            throw BugReport.intercept(t).put("layer", layer).put("bounds", box);
         }
-        layer.paint(g, this, box);
-        g.setPaintMode();
     }
 
     /**
@@ -699,7 +768,7 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
             return;
         }
 
-        List<Layer> visibleLayers = getVisibleLayersInZOrder();
+        List<Layer> visibleLayers = layerManager.getVisibleLayersInZOrder();
 
         int nonChangedLayersCount = 0;
         for (Layer l: visibleLayers) {
@@ -831,7 +900,34 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
             playHeadMarker.paint(tempG, this);
         }
 
-        g.drawImage(offscreenBuffer, 0, 0, null);
+        try {
+            g.drawImage(offscreenBuffer, 0, 0, null);
+        } catch (ClassCastException e) {
+            // See #11002 and duplicate tickets. On Linux with Java >= 8 Many users face this error here:
+            //
+            // java.lang.ClassCastException: sun.awt.image.BufImgSurfaceData cannot be cast to sun.java2d.xr.XRSurfaceData
+            //   at sun.java2d.xr.XRPMBlitLoops.cacheToTmpSurface(XRPMBlitLoops.java:145)
+            //   at sun.java2d.xr.XrSwToPMBlit.Blit(XRPMBlitLoops.java:353)
+            //   at sun.java2d.pipe.DrawImage.blitSurfaceData(DrawImage.java:959)
+            //   at sun.java2d.pipe.DrawImage.renderImageCopy(DrawImage.java:577)
+            //   at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:67)
+            //   at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1014)
+            //   at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:186)
+            //   at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3318)
+            //   at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3296)
+            //   at org.openstreetmap.josm.gui.MapView.paint(MapView.java:834)
+            //
+            // It seems to be this JDK bug, but Oracle does not seem to be fixing it:
+            // https://bugs.openjdk.java.net/browse/JDK-7172749
+            //
+            // According to bug reports it can happen for a variety of reasons such as:
+            // - long period of time
+            // - change of screen resolution
+            // - addition/removal of a secondary monitor
+            //
+            // But the application seems to work fine after, so let's just log the error
+            Main.error(e);
+        }
         super.paint(g);
     }
 
@@ -865,186 +961,105 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
     }
 
     /**
+     * Returns all layers. To be removed: end of 2016.
+     *
      * @return An unmodifiable collection of all layers
+     * @deprecated Use {@link LayerManager#getLayers()} instead.
      */
+    @Deprecated
     public Collection<Layer> getAllLayers() {
-        synchronized (layers) {
-            return Collections.unmodifiableCollection(new ArrayList<>(layers));
-        }
+        return layerManager.getLayers();
     }
 
     /**
+     * Returns all layers as list. To be removed: end of 2016.
+     *
      * @return An unmodifiable ordered list of all layers
+     * @deprecated Use {@link LayerManager#getLayers()} instead.
      */
+    @Deprecated
     public List<Layer> getAllLayersAsList() {
-        synchronized (layers) {
-            return Collections.unmodifiableList(new ArrayList<>(layers));
-        }
+        return layerManager.getLayers();
     }
 
     /**
-     * Replies an unmodifiable list of layers of a certain type.
+     * Replies an unmodifiable list of layers of a certain type. To be removed: end of 2016.
      *
      * Example:
      * <pre>
      *     List<WMSLayer> wmsLayers = getLayersOfType(WMSLayer.class);
      * </pre>
+     *
      * @param <T> layer type
      *
      * @param ofType The layer type.
      * @return an unmodifiable list of layers of a certain type.
+     * @deprecated Use {@link LayerManager#getLayersOfType(Class)} instead.
      */
+    @Deprecated
     public <T extends Layer> List<T> getLayersOfType(Class<T> ofType) {
-        return new ArrayList<>(Utils.filteredCollection(getAllLayers(), ofType));
+        return layerManager.getLayersOfType(ofType);
     }
 
     /**
-     * Replies the number of layers managed by this map view
+     * Replies the number of layers managed by this map view. To be removed: end of 2016.
+     * <p>
      *
      * @return the number of layers managed by this map view
+     * @deprecated Use {@link Main#getLayerManager()}.getLayers().size() instead.
      */
+    @Deprecated
     public int getNumLayers() {
-        synchronized (layers) {
-            return layers.size();
-        }
+        return getAllLayers().size();
     }
 
     /**
      * Replies true if there is at least one layer in this map view
+     * <p>
      *
      * @return true if there is at least one layer in this map view
+     * @deprecated Use !{@link Main#getLayerManager()}.getLayers().isEmpty() instead.
      */
+    @Deprecated
     public boolean hasLayers() {
         return getNumLayers() > 0;
     }
 
     /**
-     * Sets the active edit layer.
-     * <p>
-     * @param layersList A list to select that layer from.
-     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, OsmDataLayer, EnumSet)}
-     */
-    private EnumSet<LayerListenerType> setEditLayer(List<Layer> layersList) {
-        final OsmDataLayer newEditLayer = findNewEditLayer(layersList);
-
-        // Set new edit layer
-        if (newEditLayer != editLayer) {
-            if (newEditLayer == null) {
-                // Note: Unsafe to call while layer write lock is held.
-                getCurrentDataSet().setSelected();
-            }
-
-            editLayer = newEditLayer;
-            return EnumSet.of(LayerListenerType.EDIT_LAYER_CHANGE);
-        } else {
-            return EnumSet.noneOf(LayerListenerType.class);
-        }
-
-    }
-
-    private OsmDataLayer findNewEditLayer(List<Layer> layersList) {
-        OsmDataLayer newEditLayer = layersList.contains(editLayer) ? editLayer : null;
-        // Find new edit layer
-        if (activeLayer != editLayer || !layersList.contains(editLayer)) {
-            if (activeLayer instanceof OsmDataLayer && layersList.contains(activeLayer)) {
-                newEditLayer = (OsmDataLayer) activeLayer;
-            } else {
-                for (Layer layer:layersList) {
-                    if (layer instanceof OsmDataLayer) {
-                        newEditLayer = (OsmDataLayer) layer;
-                        break;
-                    }
-                }
-            }
-        }
-        return newEditLayer;
-    }
-
-    /**
      * Sets the active layer to <code>layer</code>. If <code>layer</code> is an instance
-     * of {@link OsmDataLayer} also sets {@link #editLayer} to <code>layer</code>.
+     * of {@link OsmDataLayer} also sets editLayer to <code>layer</code>.
+     * <p>
      *
      * @param layer the layer to be activate; must be one of the layers in the list of layers
      * @throws IllegalArgumentException if layer is not in the list of layers
+     * @deprecated Use !{@link Main#getLayerManager()}.setActiveLayer() instead.
      */
+    @Deprecated
     public void setActiveLayer(Layer layer) {
-        EnumSet<LayerListenerType> listenersToFire;
-        Layer oldActiveLayer;
-        OsmDataLayer oldEditLayer;
-
-        synchronized (layers) {
-            oldActiveLayer = activeLayer;
-            oldEditLayer = editLayer;
-            listenersToFire = setActiveLayer(layer, true);
-        }
-        onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire);
-
-        repaint();
-    }
-
-    /**
-     * Sets the active layer. Propagates this change to all map buttons.
-     * @param layer The layer to be active.
-     * @param setEditLayer if this is <code>true</code>, the edit layer is also set.
-     * @return A list of change listeners that should be fired using {@link #onActiveEditLayerChanged(Layer, OsmDataLayer, EnumSet)}
-     */
-    private EnumSet<LayerListenerType> setActiveLayer(final Layer layer, boolean setEditLayer) {
-        if (layer != null && !layers.contains(layer))
-            throw new IllegalArgumentException(tr("Layer ''{0}'' must be in list of layers", layer.toString()));
-
-        if (layer == activeLayer)
-            return EnumSet.noneOf(LayerListenerType.class);
-
-        activeLayer = layer;
-        EnumSet<LayerListenerType> listenersToFire = EnumSet.of(LayerListenerType.ACTIVE_LAYER_CHANGE);
-        if (setEditLayer) {
-            listenersToFire.addAll(setEditLayer(layers));
-        }
-
-        return listenersToFire;
+        layerManager.setActiveLayer(layer);
     }
 
     /**
      * Replies the currently active layer
+     * <p>
      *
      * @return the currently active layer (may be null)
+     * @deprecated Use !{@link Main#getLayerManager()}.getActiveLayer() instead.
      */
+    @Deprecated
     public Layer getActiveLayer() {
-        synchronized (layers) {
-            return activeLayer;
-        }
-    }
-
-    private enum LayerListenerType {
-        ACTIVE_LAYER_CHANGE,
-        EDIT_LAYER_CHANGE
+        return layerManager.getActiveLayer();
     }
 
-    /**
-     * This is called whenever one of active layer/edit layer or both may have been changed,
-     * @param oldActive The old active layer
-     * @param oldEdit The old edit layer.
-     * @param listenersToFire A mask of listeners to fire using {@link LayerListenerType}s
-     */
-    private void onActiveEditLayerChanged(final Layer oldActive, final OsmDataLayer oldEdit, EnumSet<LayerListenerType> listenersToFire) {
-        if (listenersToFire.contains(LayerListenerType.EDIT_LAYER_CHANGE)) {
-            onEditLayerChanged(oldEdit);
-        }
-        if (listenersToFire.contains(LayerListenerType.ACTIVE_LAYER_CHANGE)) {
-            onActiveLayerChanged(oldActive);
-        }
-    }
-
-    private void onActiveLayerChanged(final Layer old) {
-        fireActiveLayerChanged(old, activeLayer);
-
+    @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(activeLayer);
+            final boolean activeLayerSupported = mode.layerIsSupported(layerManager.getActiveLayer());
             if (activeLayerSupported) {
                 Main.registerActionShortcut(mode, mode.getShortcut()); //fix #6876
             } else {
@@ -1057,30 +1072,33 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
             });
         }
         AudioPlayer.reset();
+        refreshTitle();
         repaint();
     }
 
     /**
      * Replies the current edit layer, if any
+     * <p>
      *
      * @return the current edit layer. May be null.
+     * @deprecated Use !{@link Main#getLayerManager()}.getEditLayer() instead. To be made private: end of 2016.
      */
+    @Deprecated
     public OsmDataLayer getEditLayer() {
-        synchronized (layers) {
-            return editLayer;
-        }
+        return layerManager.getEditLayer();
     }
 
     /**
      * replies true if the list of layers managed by this map view contain layer
+     * <p>
      *
      * @param layer the layer
      * @return true if the list of layers managed by this map view contain layer
+     * @deprecated Use !{@link Main#getLayerManager()}.containsLayer() instead.
      */
+    @Deprecated
     public boolean hasLayer(Layer layer) {
-        synchronized (layers) {
-            return layers.contains(layer);
-        }
+        return layerManager.containsLayer(layer);
     }
 
     /**
@@ -1152,12 +1170,11 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      */
     protected void refreshTitle() {
         if (Main.parent != null) {
-            synchronized (layers) {
-                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);
-            }
+            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);
         }
     }
 
@@ -1176,19 +1193,15 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
     };
 
     public void destroy() {
+        layerManager.removeLayerChangeListener(this);
+        layerManager.removeActiveLayerChangeListener(this);
         Main.pref.removePreferenceChangeListener(this);
         DataSet.removeSelectionListener(repaintSelectionChangedListener);
         MultipolygonCache.getInstance().clear(this);
         if (mapMover != null) {
             mapMover.destroy();
         }
-        synchronized (layers) {
-            activeLayer = null;
-            changedLayer = null;
-            editLayer = null;
-            layers.clear();
-            nonChangedLayers.clear();
-        }
+        nonChangedLayers.clear();
         synchronized (temporaryLayers) {
             temporaryLayers.clear();
         }
@@ -1196,7 +1209,7 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
 
     @Override
     public void uploadDiscouragedChanged(OsmDataLayer layer, boolean newValue) {
-        if (layer == getEditLayer()) {
+        if (layer == layerManager.getEditLayer()) {
             refreshTitle();
         }
     }
@@ -1280,4 +1293,13 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
         }
         super.repaint();
     }
+
+    /**
+     * Returns the layer manager.
+     * @return the layer manager
+     * @since 10282
+     */
+    public final MainLayerManager getLayerManager() {
+        return layerManager;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
index 1322c1f..9334562 100644
--- a/src/org/openstreetmap/josm/gui/NavigatableComponent.java
+++ b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
@@ -634,7 +634,7 @@ public class NavigatableComponent extends JComponent implements Helpful {
                         // FIXME - not use zoom history here
                         zoomTo(oldCenter.interpolate(finalNewCenter, (i+1) / frames));
                         try {
-                            Thread.sleep(1000 / fps);
+                            Thread.sleep(1000L / fps);
                         } catch (InterruptedException ex) {
                             Main.warn("InterruptedException in "+NavigatableComponent.class.getSimpleName()+" during smooth scrolling");
                         }
@@ -1117,7 +1117,8 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @see #getNearestWaySegments(Point, Collection, Predicate)
      */
     public final WaySegment getNearestWaySegment(Point p, Predicate<OsmPrimitive> predicate, boolean useSelected) {
-        WaySegment wayseg = null, ntsel = null;
+        WaySegment wayseg = null;
+        WaySegment ntsel = null;
 
         for (List<WaySegment> wslist : getNearestWaySegmentsImpl(p, predicate).values()) {
             if (wayseg != null && ntsel != null) {
@@ -1152,9 +1153,12 @@ public class NavigatableComponent extends JComponent implements Helpful {
      * @since 6065
      */
     public final WaySegment getNearestWaySegment(Point p, Predicate<OsmPrimitive> predicate,
-            boolean useSelected,  Collection<OsmPrimitive> preferredRefs) {
-        WaySegment wayseg = null, ntsel = null, ntref = null;
-        if (preferredRefs != null && preferredRefs.isEmpty()) preferredRefs = null;
+            boolean useSelected, Collection<OsmPrimitive> preferredRefs) {
+        WaySegment wayseg = null;
+        WaySegment ntsel = null;
+        WaySegment ntref = null;
+        if (preferredRefs != null && preferredRefs.isEmpty())
+            preferredRefs = null;
 
         searchLoop: for (List<WaySegment> wslist : getNearestWaySegmentsImpl(p, predicate).values()) {
             for (WaySegment ws : wslist) {
diff --git a/src/org/openstreetmap/josm/gui/NotificationManager.java b/src/org/openstreetmap/josm/gui/NotificationManager.java
index 06d5d65..f8c1f23 100644
--- a/src/org/openstreetmap/josm/gui/NotificationManager.java
+++ b/src/org/openstreetmap/josm/gui/NotificationManager.java
@@ -108,21 +108,24 @@ class NotificationManager {
         currentNotificationPanel.validate();
 
         int margin = 5;
-        int x, y;
         JFrame parentWindow = (JFrame) Main.parent;
         Dimension size = currentNotificationPanel.getPreferredSize();
-        if (Main.isDisplayingMapView() && Main.map.mapView.getHeight() > 0) {
-            MapView mv = Main.map.mapView;
-            Point mapViewPos = SwingUtilities.convertPoint(mv.getParent(), mv.getX(), mv.getY(), Main.parent);
-            x = mapViewPos.x + margin;
-            y = mapViewPos.y + mv.getHeight() - Main.map.statusLine.getHeight() - size.height - margin;
-        } else {
-            x = margin;
-            y = parentWindow.getHeight() - Main.toolbar.control.getSize().height - size.height - margin;
-        }
-        parentWindow.getLayeredPane().add(currentNotificationPanel, JLayeredPane.POPUP_LAYER, 0);
+        if (parentWindow != null) {
+            int x;
+            int y;
+            if (Main.isDisplayingMapView() && Main.map.mapView.getHeight() > 0) {
+                MapView mv = Main.map.mapView;
+                Point mapViewPos = SwingUtilities.convertPoint(mv.getParent(), mv.getX(), mv.getY(), Main.parent);
+                x = mapViewPos.x + margin;
+                y = mapViewPos.y + mv.getHeight() - Main.map.statusLine.getHeight() - size.height - margin;
+            } else {
+                x = margin;
+                y = parentWindow.getHeight() - Main.toolbar.control.getSize().height - size.height - margin;
+            }
+            parentWindow.getLayeredPane().add(currentNotificationPanel, JLayeredPane.POPUP_LAYER, 0);
 
-        currentNotificationPanel.setLocation(x, y);
+            currentNotificationPanel.setLocation(x, y);
+        }
         currentNotificationPanel.setSize(size);
 
         currentNotificationPanel.setVisible(true);
diff --git a/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java b/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java
index 77c2188..5b81af7 100644
--- a/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java
+++ b/src/org/openstreetmap/josm/gui/PleaseWaitDialog.java
@@ -7,8 +7,8 @@ import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
 
 import javax.swing.BorderFactory;
 import javax.swing.BoundedRangeModel;
@@ -38,7 +38,7 @@ public class PleaseWaitDialog extends JDialog implements ProgressMonitorDialog {
     private JButton btnInBackground;
     /** the text area and the scroll pane for the log */
     private final JosmTextArea taLog = new JosmTextArea(5, 50);
-    private  JScrollPane spLog;
+    private final JScrollPane spLog = new JScrollPane(taLog);
 
     private void initDialog() {
         setLayout(new GridBagLayout());
@@ -59,21 +59,12 @@ public class PleaseWaitDialog extends JDialog implements ProgressMonitorDialog {
         GridBagConstraints gc = GBC.eol().fill(GBC.BOTH);
         gc.weighty = 1.0;
         gc.weightx = 1.0;
-        pane.add(spLog = new JScrollPane(taLog), gc);
+        pane.add(spLog, gc);
         spLog.setVisible(false);
         setContentPane(pane);
         setCustomText("");
         setLocationRelativeTo(getParent());
-        addComponentListener(new ComponentListener() {
-            @Override
-            public void componentHidden(ComponentEvent e) {}
-
-            @Override
-            public void componentMoved(ComponentEvent e) {}
-
-            @Override
-            public void componentShown(ComponentEvent e) {}
-
+        addComponentListener(new ComponentAdapter() {
             @Override
             public void componentResized(ComponentEvent ev) {
                 int w = getWidth();
diff --git a/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java b/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
index 5a2f9ce..8e91f3d 100644
--- a/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
+++ b/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
@@ -4,6 +4,7 @@ package org.openstreetmap.josm.gui;
 import java.awt.Component;
 import java.awt.EventQueue;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 
 import javax.swing.SwingUtilities;
 
@@ -23,7 +24,6 @@ import org.xml.sax.SAXException;
  * @author Imi
  */
 public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
-    private boolean canceled;
     private boolean ignoreException;
     private final String title;
 
@@ -121,7 +121,8 @@ public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
                     });
                 }
             }
-        } catch (final Exception e) {
+        } catch (final RuntimeException |
+                OsmTransferException | IOException | SAXException | InvocationTargetException | InterruptedException e) {
             if (!ignoreException) {
                 // Exception has to thrown in EDT to be shown to user
                 SwingUtilities.invokeLater(new Runnable() {
@@ -147,9 +148,6 @@ public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
 
     @Override
     public final void run() {
-        if (canceled)
-            return; // since realRun isn't executed, do not call to finish
-
         if (EventQueue.isDispatchThread()) {
             new Thread(new Runnable() {
                 @Override
diff --git a/src/org/openstreetmap/josm/gui/ScrollViewport.java b/src/org/openstreetmap/josm/gui/ScrollViewport.java
index 66a1803..ab8204a 100644
--- a/src/org/openstreetmap/josm/gui/ScrollViewport.java
+++ b/src/org/openstreetmap/josm/gui/ScrollViewport.java
@@ -89,7 +89,7 @@ public class ScrollViewport extends JPanel {
         JButton button;
 
         // UP
-        if ((direction & UP_DIRECTION) > 0) {
+        if ((direction & UP_DIRECTION) != 0) {
             button = new JButton();
             button.addMouseListener(new ScrollViewPortMouseListener(UP_DIRECTION));
             button.setPreferredSize(new Dimension(10, 10));
@@ -99,7 +99,7 @@ public class ScrollViewport extends JPanel {
         }
 
         // DOWN
-        if ((direction & DOWN_DIRECTION) > 0) {
+        if ((direction & DOWN_DIRECTION) != 0) {
             button = new JButton();
             button.addMouseListener(new ScrollViewPortMouseListener(DOWN_DIRECTION));
             button.setPreferredSize(new Dimension(10, 10));
@@ -109,7 +109,7 @@ public class ScrollViewport extends JPanel {
         }
 
         // LEFT
-        if ((direction & LEFT_DIRECTION) > 0) {
+        if ((direction & LEFT_DIRECTION) != 0) {
             button = new JButton();
             button.addMouseListener(new ScrollViewPortMouseListener(LEFT_DIRECTION));
             button.setPreferredSize(new Dimension(10, 10));
@@ -119,7 +119,7 @@ public class ScrollViewport extends JPanel {
         }
 
         // RIGHT
-        if ((direction & RIGHT_DIRECTION) > 0) {
+        if ((direction & RIGHT_DIRECTION) != 0) {
             button = new JButton();
             button.addMouseListener(new ScrollViewPortMouseListener(RIGHT_DIRECTION));
             button.setPreferredSize(new Dimension(10, 10));
@@ -166,6 +166,7 @@ public class ScrollViewport extends JPanel {
         case LEFT_DIRECTION :
             deltaX *= -1;
             break;
+        default: // Do nothing
         }
 
         scroll(deltaX, deltaY);
diff --git a/src/org/openstreetmap/josm/gui/SelectionManager.java b/src/org/openstreetmap/josm/gui/SelectionManager.java
index eacb9ba..94301d7 100644
--- a/src/org/openstreetmap/josm/gui/SelectionManager.java
+++ b/src/org/openstreetmap/josm/gui/SelectionManager.java
@@ -200,8 +200,8 @@ public class SelectionManager implements MouseListener, MouseMotionListener, Pro
     public void mousePressed(MouseEvent e) {
         if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() > 1 && Main.main.getCurrentDataSet() != 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);
+                    (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0,
+                    (e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) != 0);
         } else if (e.getButton() == MouseEvent.BUTTON1) {
             mousePosStart = mousePos = e.getPoint();
 
@@ -452,14 +452,22 @@ public class SelectionManager implements MouseListener, MouseMotionListener, Pro
     }
 
     @Override
-    public void mouseClicked(MouseEvent e) {}
+    public void mouseClicked(MouseEvent e) {
+        // Do nothing
+    }
 
     @Override
-    public void mouseEntered(MouseEvent e) {}
+    public void mouseEntered(MouseEvent e) {
+        // Do nothing
+    }
 
     @Override
-    public void mouseExited(MouseEvent e) {}
+    public void mouseExited(MouseEvent e) {
+        // Do nothing
+    }
 
     @Override
-    public void mouseMoved(MouseEvent e) {}
+    public void mouseMoved(MouseEvent e) {
+        // Do nothing
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/SideButton.java b/src/org/openstreetmap/josm/gui/SideButton.java
index 55602d5..5760f1f 100644
--- a/src/org/openstreetmap/josm/gui/SideButton.java
+++ b/src/org/openstreetmap/josm/gui/SideButton.java
@@ -21,19 +21,29 @@ import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
- * Button that is usually used in toggle dialogs
+ * 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
+     */
     public SideButton(Action action) {
         super(action);
         fixIcon(action);
         doStyle();
     }
 
+    /**
+     * Constructs a new {@code SideButton}.
+     * @param action action used to specify the new button
+     * @param usename use action name
+     */
     public SideButton(Action action, boolean usename) {
         super(action);
         if (!usename) {
@@ -43,9 +53,14 @@ 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
+     */
     public SideButton(Action action, String imagename) {
         super(action);
-        setIcon(makeIcon(imagename));
+        setIcon(getScaledImage(ImageProvider.get("dialogs", imagename).getImage()));
         doStyle();
     }
 
@@ -53,14 +68,15 @@ public class SideButton extends JButton implements Destroyable {
         // need to listen for changes, so that putValue() that are called after the
         // SideButton is constructed get the proper icon size
         if (action != null) {
-            action.addPropertyChangeListener(propertyChangeListener = new PropertyChangeListener() {
+            propertyChangeListener = new PropertyChangeListener() {
                 @Override
                 public void propertyChange(PropertyChangeEvent evt) {
                     if (javax.swing.Action.SMALL_ICON.equals(evt.getPropertyName())) {
                         fixIcon(null);
                     }
                 }
-            });
+            };
+            action.addPropertyChangeListener(propertyChangeListener);
         }
         Icon i = getIcon();
         if (i instanceof ImageIcon && i.getIconHeight() != iconHeight) {
@@ -78,11 +94,6 @@ public class SideButton extends JButton implements Destroyable {
         return new ImageIcon(im.getScaledInstance(newWidth, iconHeight, Image.SCALE_SMOOTH));
     }
 
-    public static ImageIcon makeIcon(String imagename) {
-        Image im = ImageProvider.get("dialogs", imagename).getImage();
-        return getScaledImage(im);
-    }
-
     private void doStyle() {
         setLayout(new BorderLayout());
         setIconTextGap(2);
diff --git a/src/org/openstreetmap/josm/gui/SplashScreen.java b/src/org/openstreetmap/josm/gui/SplashScreen.java
index d992dd9..656fc63 100644
--- a/src/org/openstreetmap/josm/gui/SplashScreen.java
+++ b/src/org/openstreetmap/josm/gui/SplashScreen.java
@@ -49,7 +49,7 @@ import org.openstreetmap.josm.tools.WindowGeometry;
  */
 public class SplashScreen extends JFrame implements ChangeListener {
 
-    private final SplashProgressMonitor progressMonitor;
+    private final transient SplashProgressMonitor progressMonitor;
     private final SplashScreenProgressRenderer progressRenderer;
 
     /**
@@ -309,6 +309,7 @@ public class SplashScreen extends JFrame implements ChangeListener {
 
         @Override
         public void setTicks(int ticks) {
+            // Not used
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
index a625fd5..e742cf4 100644
--- a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
+++ b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
@@ -198,22 +198,18 @@ public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser {
      */
     @Override
     public void paint(Graphics g) {
-        try {
-            super.paint(g);
+        super.paint(g);
 
-            // draw selection rectangle
-            if (iSelectionRectStart != null && iSelectionRectEnd != null) {
-                Rectangle box = new Rectangle(getMapPosition(iSelectionRectStart, false));
-                box.add(getMapPosition(iSelectionRectEnd, false));
+        // draw selection rectangle
+        if (iSelectionRectStart != null && iSelectionRectEnd != null) {
+            Rectangle box = new Rectangle(getMapPosition(iSelectionRectStart, false));
+            box.add(getMapPosition(iSelectionRectEnd, false));
 
-                g.setColor(new Color(0.9f, 0.7f, 0.7f, 0.6f));
-                g.fillRect(box.x, box.y, box.width, box.height);
+            g.setColor(new Color(0.9f, 0.7f, 0.7f, 0.6f));
+            g.fillRect(box.x, box.y, box.width, box.height);
 
-                g.setColor(Color.BLACK);
-                g.drawRect(box.x, box.y, box.width, box.height);
-            }
-        } catch (Exception e) {
-            Main.error(e);
+            g.setColor(Color.BLACK);
+            g.drawRect(box.x, box.y, box.width, box.height);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
index 23330eb..4d3885e 100644
--- a/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
+++ b/src/org/openstreetmap/josm/gui/bbox/SlippyMapControler.java
@@ -264,6 +264,8 @@ public class SlippyMapControler extends MouseAdapter {
                     speedX += ACCELERATION;
                 }
                 break;
+            default:
+                throw new IllegalStateException(Integer.toString(directionX));
             }
 
             // update the y speed
@@ -287,6 +289,8 @@ public class SlippyMapControler extends MouseAdapter {
                     speedY += ACCELERATION;
                 }
                 break;
+            default:
+                throw new IllegalStateException(Integer.toString(directionY));
             }
 
             // move the map
diff --git a/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
index d369cca..c2f50b2 100644
--- a/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
+++ b/src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
@@ -44,7 +44,6 @@ import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
 import org.openstreetmap.gui.jmapviewer.OsmTileLoader;
 import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
 import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -84,13 +83,11 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
     /** the current bounding box */
     private transient Bounds bbox;
     /** the map viewer showing the selected bounding box */
-    private TileBoundsMapView mapViewer;
+    private final TileBoundsMapView mapViewer = new TileBoundsMapView();
     /** a panel for entering a bounding box given by a  tile grid and a zoom level */
-    private TileGridInputPanel pnlTileGrid;
-    /** a panel for entering a bounding box given by the address of an individual OSM tile at
-     *  a given zoom level
-     */
-    private TileAddressInputPanel pnlTileAddress;
+    private final TileGridInputPanel pnlTileGrid = new TileGridInputPanel();
+    /** a panel for entering a bounding box given by the address of an individual OSM tile at a given zoom level */
+    private final TileAddressInputPanel pnlTileAddress = new TileAddressInputPanel();
 
     /**
      * builds the UI
@@ -102,10 +99,10 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
         gc.weightx = 0.5;
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.NORTHWEST;
-        add(pnlTileGrid = new TileGridInputPanel(), gc);
+        add(pnlTileGrid, gc);
 
         gc.gridx = 1;
-        add(pnlTileAddress = new TileAddressInputPanel(), gc);
+        add(pnlTileAddress, gc);
 
         gc.gridx = 0;
         gc.gridy = 1;
@@ -114,7 +111,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
         gc.weighty = 1.0;
         gc.fill = GridBagConstraints.BOTH;
         gc.insets = new Insets(2, 2, 2, 2);
-        add(mapViewer = new TileBoundsMapView(), gc);
+        add(mapViewer, gc);
         mapViewer.setFocusable(false);
         mapViewer.setZoomContolsVisible(false);
         mapViewer.setMapMarkerVisible(false);
@@ -216,15 +213,15 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
     private static class TileGridInputPanel extends JPanel implements PropertyChangeListener {
         public static final String TILE_BOUNDS_PROP = TileGridInputPanel.class.getName() + ".tileBounds";
 
-        private JosmTextField tfMaxY;
-        private JosmTextField tfMinY;
-        private JosmTextField tfMaxX;
-        private JosmTextField tfMinX;
+        private final JosmTextField tfMaxY = new JosmTextField();
+        private final JosmTextField tfMinY = new JosmTextField();
+        private final JosmTextField tfMaxX = new JosmTextField();
+        private final JosmTextField tfMinX = new JosmTextField();
         private transient TileCoordinateValidator valMaxY;
         private transient TileCoordinateValidator valMinY;
         private transient TileCoordinateValidator valMaxX;
         private transient TileCoordinateValidator valMinX;
-        private JSpinner spZoomLevel;
+        private final JSpinner spZoomLevel = new JSpinner(new SpinnerNumberModel(0, 0, 18, 1));
         private final transient TileBoundsBuilder tileBoundsBuilder = new TileBoundsBuilder();
         private boolean doFireTileBoundChanged = true;
 
@@ -239,7 +236,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
         protected JPanel buildZoomLevelPanel() {
             JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
             pnl.add(new JLabel(tr("Zoom level:")));
-            pnl.add(spZoomLevel = new JSpinner(new SpinnerNumberModel(0, 0, 18, 1)));
+            pnl.add(spZoomLevel);
             spZoomLevel.addChangeListener(new ZomeLevelChangeHandler());
             spZoomLevel.addChangeListener(tileBoundsBuilder);
             return pnl;
@@ -273,7 +270,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
 
             gc.gridx = 1;
             gc.weightx = 0.5;
-            pnl.add(tfMinX = new JosmTextField(), gc);
+            pnl.add(tfMinX, gc);
             valMinX = new TileCoordinateValidator(tfMinX);
             SelectAllOnFocusGainedDecorator.decorate(tfMinX);
             tfMinX.addActionListener(tileBoundsBuilder);
@@ -281,7 +278,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
 
             gc.gridx = 2;
             gc.weightx = 0.5;
-            pnl.add(tfMaxX = new JosmTextField(), gc);
+            pnl.add(tfMaxX, gc);
             valMaxX = new TileCoordinateValidator(tfMaxX);
             SelectAllOnFocusGainedDecorator.decorate(tfMaxX);
             tfMaxX.addActionListener(tileBoundsBuilder);
@@ -294,7 +291,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
 
             gc.gridx = 1;
             gc.weightx = 0.5;
-            pnl.add(tfMinY = new JosmTextField(), gc);
+            pnl.add(tfMinY, gc);
             valMinY = new TileCoordinateValidator(tfMinY);
             SelectAllOnFocusGainedDecorator.decorate(tfMinY);
             tfMinY.addActionListener(tileBoundsBuilder);
@@ -302,7 +299,7 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
 
             gc.gridx = 2;
             gc.weightx = 0.5;
-            pnl.add(tfMaxY = new JosmTextField(), gc);
+            pnl.add(tfMaxY, gc);
             valMaxY = new TileCoordinateValidator(tfMaxY);
             SelectAllOnFocusGainedDecorator.decorate(tfMaxY);
             tfMaxY.addActionListener(tileBoundsBuilder);
@@ -695,26 +692,22 @@ public class TileSelectionBBoxChooser extends JPanel implements BBoxChooser {
          */
         @Override
         public void paint(Graphics g) {
-            try {
-                super.paint(g);
-                if (min == null || max == null) return;
-                int zoomDiff = MAX_ZOOM - zoom;
-                Point tlc = getTopLeftCoordinates();
-                int xMin = (min.x >> zoomDiff) - tlc.x;
-                int yMin = (min.y >> zoomDiff) - tlc.y;
-                int xMax = (max.x >> zoomDiff) - tlc.x;
-                int yMax = (max.y >> zoomDiff) - tlc.y;
-
-                int w = xMax - xMin;
-                int h = yMax - yMin;
-                g.setColor(new Color(0.9f, 0.7f, 0.7f, 0.6f));
-                g.fillRect(xMin, yMin, w, h);
-
-                g.setColor(Color.BLACK);
-                g.drawRect(xMin, yMin, w, h);
-            } catch (Exception e) {
-                Main.error(e);
-            }
+            super.paint(g);
+            if (min == null || max == null) return;
+            int zoomDiff = MAX_ZOOM - zoom;
+            Point tlc = getTopLeftCoordinates();
+            int xMin = (min.x >> zoomDiff) - tlc.x;
+            int yMin = (min.y >> zoomDiff) - tlc.y;
+            int xMax = (max.x >> zoomDiff) - tlc.x;
+            int yMax = (max.y >> zoomDiff) - tlc.y;
+
+            int w = xMax - xMin;
+            int h = yMax - yMin;
+            g.setColor(new Color(0.9f, 0.7f, 0.7f, 0.6f));
+            g.fillRect(xMin, yMin, w, h);
+
+            g.setColor(Color.BLACK);
+            g.drawRect(xMin, yMin, w, h);
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java b/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
index 438b149..e7f1544 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
@@ -16,7 +16,6 @@ import java.util.EnumMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Observable;
 import java.util.Set;
 
 import javax.swing.AbstractListModel;
@@ -35,6 +34,7 @@ import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Utils;
@@ -71,7 +71,7 @@ import org.openstreetmap.josm.tools.Utils;
  * @param <T>  the type of the list entries
  * @see ListMerger
  */
-public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
+public abstract class ListMergeModel<T extends PrimitiveId> extends ChangeNotifier {
     public static final String FROZEN_PROP = ListMergeModel.class.getName() + ".frozen";
 
     private static final int MAX_DELETED_PRIMITIVE_IN_DIALOG = 5;
@@ -269,8 +269,7 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
         myEntriesTableModel.fireTableDataChanged();
         theirEntriesTableModel.fireTableDataChanged();
         mergedEntriesTableModel.fireTableDataChanged();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     protected void copyToTop(ListRole role, int[] rows) {
@@ -457,7 +456,7 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
     protected void copyAfterCurrent(ListRole source, int[] rows, int current) {
         copy(source, rows, current + 1);
         mergedEntriesSelectionModel.setSelectionInterval(current+1, current + rows.length-1);
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -504,7 +503,6 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
             mergedEntries.add(row -1, n);
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
         for (int row: rows) {
             mergedEntriesSelectionModel.addSelectionInterval(row-1, row-1);
@@ -531,7 +529,6 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
             mergedEntries.add(row +1, n);
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
         for (int row: rows) {
             mergedEntriesSelectionModel.addSelectionInterval(row+1, row+1);
@@ -554,7 +551,6 @@ public abstract class ListMergeModel<T extends PrimitiveId> extends Observable {
             mergedEntries.remove(rows[i]);
         }
         fireModelDataChanged();
-        notifyObservers();
         mergedEntriesSelectionModel.clearSelection();
     }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
index 8d0203f..468b2ee 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
@@ -14,8 +14,6 @@ import java.awt.event.ItemListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.Collection;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -27,6 +25,8 @@ import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.JToggleButton;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
@@ -48,7 +48,7 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * @see ListMergeModel
  * @since 1631
  */
-public abstract class ListMerger<T extends PrimitiveId> extends JPanel implements PropertyChangeListener, Observer, IConflictResolver {
+public abstract class ListMerger<T extends PrimitiveId> extends JPanel implements PropertyChangeListener, ChangeListener, IConflictResolver {
     protected OsmPrimitivesTable myEntriesTable;
     protected OsmPrimitivesTable mergedEntriesTable;
     protected OsmPrimitivesTable theirEntriesTable;
@@ -119,8 +119,8 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         mergedEntriesTable.getSelectionModel().addListSelectionListener(moveDownMergedAction);
         mergedEntriesTable.getSelectionModel().addListSelectionListener(removeMergedAction);
 
-        model.addObserver(copyAllLeft);
-        model.addObserver(copyAllRight);
+        model.addChangeListener(copyAllLeft);
+        model.addChangeListener(copyAllRight);
         model.addPropertyChangeListener(copyAllLeft);
         model.addPropertyChangeListener(copyAllRight);
     }
@@ -407,7 +407,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
      */
     public ListMerger(ListMergeModel<T> model) {
         this.model = model;
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
         model.addPropertyChangeListener(this);
     }
@@ -620,7 +620,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         }
     }
 
-    class CopyAllLeft extends AbstractAction implements Observer, PropertyChangeListener {
+    class CopyAllLeft extends AbstractAction implements ChangeListener, PropertyChangeListener {
 
         CopyAllLeft() {
             ImageIcon icon = ImageProvider.get("dialogs/conflict", "useallleft");
@@ -639,7 +639,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             updateEnabledState();
         }
 
@@ -649,7 +649,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         }
     }
 
-    class CopyAllRight extends AbstractAction implements Observer, PropertyChangeListener {
+    class CopyAllRight extends AbstractAction implements ChangeListener, PropertyChangeListener {
 
         CopyAllRight() {
             ImageIcon icon = ImageProvider.get("dialogs/conflict", "useallright");
@@ -668,7 +668,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             updateEnabledState();
         }
 
@@ -870,7 +870,7 @@ public abstract class ListMerger<T extends PrimitiveId> extends JPanel implement
     }
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         lblMyVersion.setText(
                 trn("My version ({0} entry)", "My version ({0} entries)", model.getMyEntriesSize(), model.getMyEntriesSize())
         );
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 0412196..be8631e 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
@@ -8,7 +8,6 @@ import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Observable;
 
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.conflict.CoordinateConflictResolveCommand;
@@ -18,6 +17,7 @@ import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -25,7 +25,7 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
  * {@link OsmPrimitive}s. In particular, it represents conflicts in the coordinates of {@link Node}s and
  * the deleted or visible state of {@link OsmPrimitive}s.
  *
- * This model is an {@link Observable}. It notifies registered {@link java.util.Observer}s whenever the
+ * This model is a {@link ChangeNotifier}. It notifies registered {@link javax.swing.event.ChangeListener}s whenever the
  * internal state changes.
  *
  * This model also emits property changes for {@link #RESOLVED_COMPLETELY_PROP}. Property change
@@ -36,7 +36,7 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
  * @see OsmPrimitive#isVisible
  *
  */
-public class PropertiesMergeModel extends Observable {
+public class PropertiesMergeModel extends ChangeNotifier {
 
     public static final String RESOLVED_COMPLETELY_PROP = PropertiesMergeModel.class.getName() + ".resolvedCompletely";
     public static final String DELETE_PRIMITIVE_PROP = PropertiesMergeModel.class.getName() + ".deletePrimitive";
@@ -144,8 +144,7 @@ public class PropertiesMergeModel extends Observable {
 
         coordMergeDecision = UNDECIDED;
         deletedMergeDecision = UNDECIDED;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
     }
 
@@ -195,8 +194,7 @@ public class PropertiesMergeModel extends Observable {
      */
     public void decideCoordsConflict(MergeDecisionType decision) {
         coordMergeDecision = decision;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
     }
 
@@ -270,8 +268,7 @@ public class PropertiesMergeModel extends Observable {
         boolean newMergedDeletedState = getMergedDeletedState(decision);
 
         this.deletedMergeDecision = decision;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         fireCompletelyResolved();
 
         if (oldMergedDeletedState != newMergedDeletedState) {
diff --git a/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java b/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
index c51c65b..4dce0a9 100644
--- a/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
+++ b/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
@@ -9,8 +9,6 @@ import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.text.DecimalFormat;
 import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -18,6 +16,8 @@ import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -33,19 +33,19 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * This class represents a UI component for resolving conflicts in some properties of {@link OsmPrimitive}.
  * @since 1654
  */
-public class PropertiesMerger extends JPanel implements Observer, IConflictResolver {
+public class PropertiesMerger extends JPanel implements ChangeListener, IConflictResolver {
     private static final DecimalFormat COORD_FORMATTER = new DecimalFormat("###0.0000000");
 
-    private JLabel lblMyCoordinates;
-    private JLabel lblMergedCoordinates;
-    private JLabel lblTheirCoordinates;
+    private final JLabel lblMyCoordinates = buildValueLabel("label.mycoordinates");
+    private final JLabel lblMergedCoordinates = buildValueLabel("label.mergedcoordinates");
+    private final JLabel lblTheirCoordinates = buildValueLabel("label.theircoordinates");
 
-    private JLabel lblMyDeletedState;
-    private JLabel lblMergedDeletedState;
-    private JLabel lblTheirDeletedState;
+    private final JLabel lblMyDeletedState = buildValueLabel("label.mydeletedstate");
+    private final JLabel lblMergedDeletedState = buildValueLabel("label.mergeddeletedstate");
+    private final JLabel lblTheirDeletedState = buildValueLabel("label.theirdeletedstate");
 
-    private JLabel lblMyReferrers;
-    private JLabel lblTheirReferrers;
+    private final JLabel lblMyReferrers = buildValueLabel("label.myreferrers");
+    private final JLabel lblTheirReferrers = buildValueLabel("label.theirreferrers");
 
     private final transient PropertiesMergeModel model;
     private final VersionInfoPanel mineVersionInfo = new VersionInfoPanel();
@@ -56,11 +56,11 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
      */
     public PropertiesMerger() {
         model = new PropertiesMergeModel();
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
     }
 
-    protected JLabel buildValueLabel(String name) {
+    protected static JLabel buildValueLabel(String name) {
         JLabel lbl = new JLabel();
         lbl.setName(name);
         lbl.setHorizontalAlignment(JLabel.CENTER);
@@ -128,7 +128,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblMyCoordinates = buildValueLabel("label.mycoordinates"), gc);
+        add(lblMyCoordinates, gc);
 
         gc.gridx = 2;
         gc.fill = GridBagConstraints.NONE;
@@ -136,7 +136,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         KeepMyCoordinatesAction actKeepMyCoordinates = new KeepMyCoordinatesAction();
-        model.addObserver(actKeepMyCoordinates);
+        model.addChangeListener(actKeepMyCoordinates);
         JButton btnKeepMyCoordinates = new JButton(actKeepMyCoordinates);
         btnKeepMyCoordinates.setName("button.keepmycoordinates");
         add(btnKeepMyCoordinates, gc);
@@ -146,7 +146,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblMergedCoordinates = buildValueLabel("label.mergedcoordinates"), gc);
+        add(lblMergedCoordinates, gc);
 
         gc.gridx = 4;
         gc.fill = GridBagConstraints.NONE;
@@ -154,7 +154,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         KeepTheirCoordinatesAction actKeepTheirCoordinates = new KeepTheirCoordinatesAction();
-        model.addObserver(actKeepTheirCoordinates);
+        model.addChangeListener(actKeepTheirCoordinates);
         JButton btnKeepTheirCoordinates = new JButton(actKeepTheirCoordinates);
         add(btnKeepTheirCoordinates, gc);
 
@@ -163,7 +163,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblTheirCoordinates = buildValueLabel("label.theircoordinates"), gc);
+        add(lblTheirCoordinates, gc);
 
         // ---------------------------------------------------
         gc.gridx = 3;
@@ -173,7 +173,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         UndecideCoordinateConflictAction actUndecideCoordinates = new UndecideCoordinateConflictAction();
-        model.addObserver(actUndecideCoordinates);
+        model.addChangeListener(actUndecideCoordinates);
         JButton btnUndecideCoordinates = new JButton(actUndecideCoordinates);
         add(btnUndecideCoordinates, gc);
     }
@@ -197,7 +197,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblMyDeletedState = buildValueLabel("label.mydeletedstate"), gc);
+        add(lblMyDeletedState, gc);
 
         gc.gridx = 2;
         gc.fill = GridBagConstraints.NONE;
@@ -205,7 +205,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         KeepMyDeletedStateAction actKeepMyDeletedState = new KeepMyDeletedStateAction();
-        model.addObserver(actKeepMyDeletedState);
+        model.addChangeListener(actKeepMyDeletedState);
         JButton btnKeepMyDeletedState = new JButton(actKeepMyDeletedState);
         btnKeepMyDeletedState.setName("button.keepmydeletedstate");
         add(btnKeepMyDeletedState, gc);
@@ -215,7 +215,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblMergedDeletedState = buildValueLabel("label.mergeddeletedstate"), gc);
+        add(lblMergedDeletedState, gc);
 
         gc.gridx = 4;
         gc.fill = GridBagConstraints.NONE;
@@ -223,7 +223,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         KeepTheirDeletedStateAction actKeepTheirDeletedState = new KeepTheirDeletedStateAction();
-        model.addObserver(actKeepTheirDeletedState);
+        model.addChangeListener(actKeepTheirDeletedState);
         JButton btnKeepTheirDeletedState = new JButton(actKeepTheirDeletedState);
         btnKeepTheirDeletedState.setName("button.keeptheirdeletedstate");
         add(btnKeepTheirDeletedState, gc);
@@ -233,7 +233,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblTheirDeletedState = buildValueLabel("label.theirdeletedstate"), gc);
+        add(lblTheirDeletedState, gc);
 
         // ---------------------------------------------------
         gc.gridx = 3;
@@ -243,7 +243,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         UndecideDeletedStateConflictAction actUndecideDeletedState = new UndecideDeletedStateConflictAction();
-        model.addObserver(actUndecideDeletedState);
+        model.addChangeListener(actUndecideDeletedState);
         JButton btnUndecideDeletedState = new JButton(actUndecideDeletedState);
         btnUndecideDeletedState.setName("button.undecidedeletedstate");
         add(btnUndecideDeletedState, gc);
@@ -269,7 +269,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblMyReferrers = buildValueLabel("label.myreferrers"), gc);
+        add(lblMyReferrers, gc);
 
         gc.gridx = 5;
         gc.gridy = 7;
@@ -277,7 +277,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         gc.anchor = GridBagConstraints.CENTER;
         gc.weightx = 0.33;
         gc.weighty = 0.0;
-        add(lblTheirReferrers = buildValueLabel("label.theirreferrers"), gc);
+        add(lblTheirReferrers, gc);
     }
 
     protected final void build() {
@@ -288,7 +288,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         buildReferrersRow();
     }
 
-    public String coordToString(LatLon coord) {
+    protected static String coordToString(LatLon coord) {
         if (coord == null)
             return tr("(none)");
         StringBuilder sb = new StringBuilder();
@@ -300,7 +300,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         return sb.toString();
     }
 
-    public String deletedStateToString(Boolean deleted) {
+    protected static String deletedStateToString(Boolean deleted) {
         if (deleted == null)
             return tr("(none)");
         if (deleted)
@@ -309,7 +309,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
             return tr("not deleted");
     }
 
-    public String referrersToString(List<OsmPrimitive> referrers) {
+    protected static String referrersToString(List<OsmPrimitive> referrers) {
         if (referrers.isEmpty())
             return tr("(none)");
         StringBuilder str = new StringBuilder("<html>");
@@ -383,17 +383,21 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
     }
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         updateCoordinates();
         updateDeletedState();
         updateReferrers();
     }
 
+    /**
+     * Returns properties merge model.
+     * @return properties merge model
+     */
     public PropertiesMergeModel getModel() {
         return model;
     }
 
-    class KeepMyCoordinatesAction extends AbstractAction implements Observer {
+    class KeepMyCoordinatesAction extends AbstractAction implements ChangeListener {
         KeepMyCoordinatesAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeepmine"));
             putValue(Action.SHORT_DESCRIPTION, tr("Keep my coordinates"));
@@ -405,12 +409,12 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && !model.isDecidedCoord() && model.getMyCoords() != null);
         }
     }
 
-    class KeepTheirCoordinatesAction extends AbstractAction implements Observer {
+    class KeepTheirCoordinatesAction extends AbstractAction implements ChangeListener {
         KeepTheirCoordinatesAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeeptheir"));
             putValue(Action.SHORT_DESCRIPTION, tr("Keep their coordinates"));
@@ -422,12 +426,12 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && !model.isDecidedCoord() && model.getTheirCoords() != null);
         }
     }
 
-    class UndecideCoordinateConflictAction extends AbstractAction implements Observer {
+    class UndecideCoordinateConflictAction extends AbstractAction implements ChangeListener {
         UndecideCoordinateConflictAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagundecide"));
             putValue(Action.SHORT_DESCRIPTION, tr("Undecide conflict between different coordinates"));
@@ -439,12 +443,12 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasCoordConflict() && model.isDecidedCoord());
         }
     }
 
-    class KeepMyDeletedStateAction extends AbstractAction implements Observer {
+    class KeepMyDeletedStateAction extends AbstractAction implements ChangeListener {
         KeepMyDeletedStateAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeepmine"));
             putValue(Action.SHORT_DESCRIPTION, tr("Keep my deleted state"));
@@ -456,12 +460,12 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && !model.isDecidedDeletedState());
         }
     }
 
-    class KeepTheirDeletedStateAction extends AbstractAction implements Observer {
+    class KeepTheirDeletedStateAction extends AbstractAction implements ChangeListener {
         KeepTheirDeletedStateAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagkeeptheir"));
             putValue(Action.SHORT_DESCRIPTION, tr("Keep their deleted state"));
@@ -473,12 +477,12 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && !model.isDecidedDeletedState());
         }
     }
 
-    class UndecideDeletedStateConflictAction extends AbstractAction implements Observer {
+    class UndecideDeletedStateConflictAction extends AbstractAction implements ChangeListener {
         UndecideDeletedStateConflictAction() {
             putValue(Action.SMALL_ICON, ImageProvider.get("dialogs/conflict", "tagundecide"));
             putValue(Action.SHORT_DESCRIPTION, tr("Undecide conflict between deleted state"));
@@ -490,7 +494,7 @@ public class PropertiesMerger extends JPanel implements Observer, IConflictResol
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(model.hasDeletedStateConflict() && model.isDecidedDeletedState());
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java b/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
index 60f341b..6aa9ca9 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java
@@ -171,7 +171,8 @@ public class CombinePrimitiveResolverDialog extends JDialog {
         spTagConflictTypes = new AutoAdjustingSplitPane(JSplitPane.VERTICAL_SPLIT);
         spTagConflictTypes.setTopComponent(buildTagConflictResolverPanel());
         spTagConflictTypes.setBottomComponent(buildRelationMemberConflictResolverPanel());
-        getContentPane().add(pnlButtons = buildButtonPanel(), BorderLayout.SOUTH);
+        pnlButtons = buildButtonPanel();
+        getContentPane().add(pnlButtons, BorderLayout.SOUTH);
         addWindowListener(new AdjustDividerLocationAction());
         HelpUtil.setHelpContext(getRootPane(), ht("/"));
     }
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java b/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
index 1875345..383b4ad 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialog.java
@@ -56,16 +56,16 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
         RESOLVING_TYPED_TAGCOLLECTIONS
     }
 
-    private TagConflictResolver allPrimitivesResolver;
-    private transient Map<OsmPrimitiveType, TagConflictResolver> resolvers;
-    private JTabbedPane tpResolvers;
+    private final TagConflictResolver allPrimitivesResolver = new TagConflictResolver();
+    private final transient Map<OsmPrimitiveType, TagConflictResolver> resolvers = new EnumMap<>(OsmPrimitiveType.class);
+    private final JTabbedPane tpResolvers = new JTabbedPane();
     private Mode mode;
     private boolean canceled;
 
-    private final ImageIcon iconResolved;
-    private final ImageIcon iconUnresolved;
-    private StatisticsTableModel statisticsModel;
-    private JPanel pnlTagResolver;
+    private final ImageIcon iconResolved = ImageProvider.get("dialogs/conflict", "tagconflictresolved");
+    private final ImageIcon iconUnresolved = ImageProvider.get("dialogs/conflict", "tagconflictunresolved");
+    private final StatisticsTableModel statisticsModel = new StatisticsTableModel();
+    private final JPanel pnlTagResolver = new JPanel(new BorderLayout());
 
     /**
      * Constructs a new {@code PasteTagsConflictResolverDialog}.
@@ -74,19 +74,14 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
     public PasteTagsConflictResolverDialog(Component owner) {
         super(GuiHelper.getFrameForComponent(owner), ModalityType.DOCUMENT_MODAL);
         build();
-        iconResolved = ImageProvider.get("dialogs/conflict", "tagconflictresolved");
-        iconUnresolved = ImageProvider.get("dialogs/conflict", "tagconflictunresolved");
     }
 
     protected final void build() {
         setTitle(tr("Conflicts in pasted tags"));
-        allPrimitivesResolver = new TagConflictResolver();
-        resolvers = new EnumMap<>(OsmPrimitiveType.class);
         for (OsmPrimitiveType type: OsmPrimitiveType.dataValues()) {
             resolvers.put(type, new TagConflictResolver());
             resolvers.get(type).getModel().addPropertyChangeListener(this);
         }
-        tpResolvers = new JTabbedPane();
         getContentPane().setLayout(new GridBagLayout());
         mode = null;
         GridBagConstraints gc = new GridBagConstraints();
@@ -101,7 +96,7 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
         gc.fill = GridBagConstraints.BOTH;
         gc.weightx = 1.0;
         gc.weighty = 1.0;
-        getContentPane().add(pnlTagResolver = new JPanel(new BorderLayout()), gc);
+        getContentPane().add(pnlTagResolver, gc);
         gc.gridx = 0;
         gc.gridy = 2;
         gc.fill = GridBagConstraints.HORIZONTAL;
@@ -130,7 +125,6 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
 
     protected JPanel buildSourceAndTargetInfoPanel() {
         JPanel pnl = new JPanel(new BorderLayout());
-        statisticsModel = new StatisticsTableModel();
         pnl.add(new StatisticsInfoTable(statisticsModel), BorderLayout.CENTER);
         return pnl;
     }
@@ -330,6 +324,10 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
         super.setVisible(visible);
     }
 
+    /**
+     * Returns conflict resolution.
+     * @return conflict resolution
+     */
     public TagCollection getResolution() {
         return allPrimitivesResolver.getModel().getResolution();
     }
@@ -356,9 +354,9 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
     }
 
     static final class StatisticsInfo {
-        public int numTags;
-        public final Map<OsmPrimitiveType, Integer> sourceInfo;
-        public final Map<OsmPrimitiveType, Integer> targetInfo;
+        int numTags;
+        final Map<OsmPrimitiveType, Integer> sourceInfo;
+        final Map<OsmPrimitiveType, Integer> targetInfo;
 
         StatisticsInfo() {
             sourceInfo = new EnumMap<>(OsmPrimitiveType.class);
@@ -390,29 +388,29 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
             return data == null ? 1 : data.size() + 1;
         }
 
-        public void reset() {
+        void reset() {
             data.clear();
         }
 
-        public void append(StatisticsInfo info) {
+        void append(StatisticsInfo info) {
             data.add(info);
             fireTableDataChanged();
         }
     }
 
     static final class StatisticsInfoRenderer extends JLabel implements TableCellRenderer {
-        protected void reset() {
+        private void reset() {
             setIcon(null);
             setText("");
             setFont(UIManager.getFont("Table.font"));
         }
 
-        protected void renderNumTags(StatisticsInfo info) {
+        private void renderNumTags(StatisticsInfo info) {
             if (info == null) return;
             setText(trn("{0} tag", "{0} tags", info.numTags, info.numTags));
         }
 
-        protected void renderStatistics(Map<OsmPrimitiveType, Integer> stat) {
+        private void renderStatistics(Map<OsmPrimitiveType, Integer> stat) {
             if (stat == null) return;
             if (stat.isEmpty()) return;
             if (stat.size() == 1) {
@@ -427,11 +425,12 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
                 if (numPrimitives == 0) {
                     continue;
                 }
-                String msg = "";
+                String msg;
                 switch(type) {
                 case NODE: msg = trn("{0} node", "{0} nodes", numPrimitives, numPrimitives); break;
                 case WAY: msg = trn("{0} way", "{0} ways", numPrimitives, numPrimitives); break;
                 case RELATION: msg = trn("{0} relation", "{0} relations", numPrimitives, numPrimitives); break;
+                default: throw new AssertionError();
                 }
                 if (text.length() > 0) {
                     text.append(", ");
@@ -441,11 +440,11 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
             setText(text.toString());
         }
 
-        protected void renderFrom(StatisticsInfo info) {
+        private void renderFrom(StatisticsInfo info) {
             renderStatistics(info.sourceInfo);
         }
 
-        protected void renderTo(StatisticsInfo info) {
+        private void renderTo(StatisticsInfo info) {
             renderStatistics(info.targetInfo);
         }
 
@@ -466,6 +465,7 @@ public class PasteTagsConflictResolverDialog extends JDialog  implements Propert
                 case 0: renderNumTags(info); break;
                 case 1: renderFrom(info); break;
                 case 2: renderTo(info); break;
+                default: // Do nothing
                 }
             }
             return this;
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
index 8665e1a..e8f119f 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolver.java
@@ -39,18 +39,18 @@ import org.openstreetmap.josm.tools.ImageProvider;
 
 public class RelationMemberConflictResolver extends JPanel {
 
-    private AutoCompletingTextField tfRole;
-    private AutoCompletingTextField tfKey;
-    private AutoCompletingTextField tfValue;
+    private final AutoCompletingTextField tfRole = new AutoCompletingTextField(10);
+    private final AutoCompletingTextField tfKey = new AutoCompletingTextField(10);
+    private final AutoCompletingTextField tfValue = new AutoCompletingTextField(10);
     private JCheckBox cbTagRelations;
     private final RelationMemberConflictResolverModel model;
-    private RelationMemberConflictResolverTable tblResolver;
-    private JMultilineLabel lblHeader;
+    private final RelationMemberConflictResolverTable tblResolver;
+    private final JMultilineLabel lblHeader = new JMultilineLabel("");
 
     protected final void build() {
         setLayout(new GridBagLayout());
         final JPanel pnl = new JPanel(new BorderLayout());
-        pnl.add(lblHeader = new JMultilineLabel(""));
+        pnl.add(lblHeader);
         GridBagConstraints gc = new GridBagConstraints();
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weighty = 0.0;
@@ -62,7 +62,7 @@ public class RelationMemberConflictResolver extends JPanel {
         gc.weighty = 1.0;
         gc.fill = GridBagConstraints.BOTH;
         gc.insets = new Insets(0, 0, 0, 0);
-        add(new JScrollPane(tblResolver = new RelationMemberConflictResolverTable(model)), gc);
+        add(new JScrollPane(tblResolver), gc);
 
         final JPanel pnl2 = new JPanel();
         pnl2.setLayout(new BoxLayout(pnl2, BoxLayout.Y_AXIS));
@@ -77,7 +77,7 @@ public class RelationMemberConflictResolver extends JPanel {
     protected JPanel buildRoleEditingPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
         pnl.add(new JLabel(tr("Role:")));
-        pnl.add(tfRole = new AutoCompletingTextField(10));
+        pnl.add(tfRole);
         tfRole.setToolTipText(tr("Enter a role for all relation memberships"));
         pnl.add(new JButton(new ApplyRoleAction()));
         tfRole.addActionListener(new ApplyRoleAction());
@@ -101,10 +101,10 @@ public class RelationMemberConflictResolver extends JPanel {
                         + "to all modified relations.</html>"));
         pnl.add(cbTagRelations);
         pnl.add(new JLabel(trc("tag", "Key:")));
-        pnl.add(tfKey = new AutoCompletingTextField(10));
+        pnl.add(tfKey);
         tfKey.setToolTipText(tr("<html>Enter a tag key, e.g. <strong><tt>fixme</tt></strong></html>"));
         pnl.add(new JLabel(tr("Value:")));
-        pnl.add(tfValue = new AutoCompletingTextField(10));
+        pnl.add(tfValue);
         tfValue.setToolTipText(tr("<html>Enter a tag value, e.g. <strong><tt>check members</tt></strong></html>"));
         cbTagRelations.setSelected(false);
         tfKey.setEnabled(false);
@@ -119,6 +119,7 @@ public class RelationMemberConflictResolver extends JPanel {
      */
     public RelationMemberConflictResolver(RelationMemberConflictResolverModel model) {
         this.model = model;
+        this.tblResolver = new RelationMemberConflictResolverTable(model);
         build();
     }
 
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
index f4a6087..acc04cd 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModel.java
@@ -131,6 +131,7 @@ public class RelationMemberConflictResolverModel extends DefaultTableModel {
             d.decide((RelationMemberConflictDecisionType) value);
             refresh();
             break;
+        default: // Do nothing
         }
         fireTableDataChanged();
     }
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java b/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java
index 45aa457..71ad6a8 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolver.java
@@ -20,16 +20,23 @@ import org.openstreetmap.josm.Main;
 /**
  * This is a UI widget for resolving tag conflicts, i.e. differences of the tag values
  * of multiple {@link org.openstreetmap.josm.data.osm.OsmPrimitive}s.
- *
- *
+ * @since 2008
  */
 public class TagConflictResolver extends JPanel {
 
     /** the model for the tag conflict resolver */
     private final TagConflictResolverModel model;
     /** selects whether only tags with conflicts are displayed */
-    private JCheckBox cbShowTagsWithConflictsOnly;
-    private JCheckBox cbShowTagsWithMultiValuesOnly;
+    private final JCheckBox cbShowTagsWithConflictsOnly = new JCheckBox(tr("Show tags with conflicts only"));
+    private final JCheckBox cbShowTagsWithMultiValuesOnly = new JCheckBox(tr("Show tags with multiple values only"));
+
+    /**
+     * Constructs a new {@code TagConflictResolver}.
+     */
+    public TagConflictResolver() {
+        this.model = new TagConflictResolverModel();
+        build();
+    }
 
     protected JPanel buildInfoPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
@@ -46,8 +53,8 @@ public class TagConflictResolver extends JPanel {
         gc.gridy = 1;
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weighty = 0.0;
-        pnl.add(cbShowTagsWithConflictsOnly = new JCheckBox(tr("Show tags with conflicts only")), gc);
-        pnl.add(cbShowTagsWithMultiValuesOnly = new JCheckBox(tr("Show tags with multiple values only")), gc);
+        pnl.add(cbShowTagsWithConflictsOnly, gc);
+        pnl.add(cbShowTagsWithMultiValuesOnly, gc);
         cbShowTagsWithConflictsOnly.addChangeListener(
                 new ChangeListener() {
                     @Override
@@ -91,14 +98,6 @@ public class TagConflictResolver extends JPanel {
     }
 
     /**
-     * Constructs a new {@code TagConflictResolver}.
-     */
-    public TagConflictResolver() {
-        this.model = new TagConflictResolverModel();
-        build();
-    }
-
-    /**
      * Replies the model used by this dialog
      *
      * @return the model
diff --git a/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverModel.java b/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverModel.java
index 4bf1d6e..e283bc7 100644
--- a/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverModel.java
+++ b/src/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolverModel.java
@@ -180,6 +180,7 @@ public class TagConflictResolverModel extends DefaultTableModel {
             case SUM_ALL_NUMERIC:
                 decision.sumAllNumeric();
                 break;
+            default: // Do nothing
             }
         }
         GuiHelper.runInEDTAndWait(new Runnable() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
index 79ba49f..d137cb3 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
@@ -71,7 +71,7 @@ import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
  * The dialog offers actions to download and to close changesets. It can also launch an external
  * browser with information about a changeset. Furthermore, it can select all objects in
  * the current data layer being assigned to a specific changeset.
- *
+ * @since 2613
  */
 public class ChangesetDialog extends ToggleDialog {
     private ChangesetInSelectionListModel inSelectionModel;
@@ -161,7 +161,8 @@ public class ChangesetDialog extends ToggleDialog {
     protected JPanel buildFilterPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
         pnl.setBorder(null);
-        pnl.add(cbInSelectionOnly = new JCheckBox(tr("For selected objects only")));
+        cbInSelectionOnly = new JCheckBox(tr("For selected objects only"));
+        pnl.add(cbInSelectionOnly);
         cbInSelectionOnly.setToolTipText(tr("<html>Select to show changesets for the currently selected objects only.<br>"
                 + "Unselect to show all changesets for objects in the current data layer.</html>"));
         cbInSelectionOnly.setSelected(Main.pref.getBoolean("changeset-dialog.for-selected-objects-only", false));
@@ -182,7 +183,8 @@ public class ChangesetDialog extends ToggleDialog {
     protected void build() {
         JPanel pnl = new JPanel(new BorderLayout());
         pnl.add(buildFilterPanel(), BorderLayout.NORTH);
-        pnl.add(pnlList = buildListPanel(), BorderLayout.CENTER);
+        pnlList = buildListPanel();
+        pnl.add(pnlList, BorderLayout.CENTER);
 
         cbInSelectionOnly.addItemListener(new FilterChangeHandler());
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java b/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
index a16346f..065f035 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
@@ -68,9 +68,9 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
 
     /** the data model */
     private RelationMemberTableModel model;
-    private HtmlPanel htmlPanel;
+    private final HtmlPanel htmlPanel = new HtmlPanel();
     private boolean canceled;
-    private SideButton btnOK;
+    private final SideButton btnOK = new SideButton(new OKAction());
 
     protected JPanel buildRelationMemberTablePanel() {
         JTable table = new JTable(model, new RelationMemberTableColumnModel());
@@ -81,7 +81,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
 
     protected JPanel buildButtonPanel() {
         JPanel pnl = new JPanel(new FlowLayout());
-        pnl.add(btnOK = new SideButton(new OKAction()));
+        pnl.add(btnOK);
         btnOK.setFocusable(true);
         pnl.add(new SideButton(new CancelAction()));
         pnl.add(new SideButton(new ContextSensitiveHelpAction(ht("/Action/Delete#DeleteFromRelations"))));
@@ -92,7 +92,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
         model = new RelationMemberTableModel();
         model.addTableModelListener(this);
         getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(htmlPanel = new HtmlPanel(), BorderLayout.NORTH);
+        getContentPane().add(htmlPanel, BorderLayout.NORTH);
         getContentPane().add(buildRelationMemberTablePanel(), BorderLayout.CENTER);
         getContentPane().add(buildButtonPanel(), BorderLayout.SOUTH);
 
@@ -113,7 +113,7 @@ public class DeleteFromRelationConfirmationDialog extends JDialog implements Tab
                 "{0} relations are affected.",
                 numParentRelations, numParentRelations);
         @I18n.QuirkyPluralString
-        final String msg = "<html>" + msg1 + " " + msg2 + "</html>";
+        final String msg = "<html>" + msg1 + ' ' + msg2 + "</html>";
         htmlPanel.getEditorPane().setText(msg);
         invalidate();
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
index 049ed86..82b7edb 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
@@ -18,9 +18,9 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Destroyable;
 
 public class DialogsPanel extends JPanel implements Destroyable {
-    protected List<ToggleDialog> allDialogs = new ArrayList<>();
-    protected MultiSplitPane mSpltPane = new MultiSplitPane();
-    protected static final int DIVIDER_SIZE = 5;
+    private final List<ToggleDialog> allDialogs = new ArrayList<>();
+    private final MultiSplitPane mSpltPane = new MultiSplitPane();
+    private static final int DIVIDER_SIZE = 5;
 
     /**
      * Panels that are added to the multisplitpane.
@@ -39,7 +39,7 @@ public class DialogsPanel extends JPanel implements Destroyable {
         if (initialized)
             throw new IllegalStateException();
         initialized = true;
-        allDialogs = new ArrayList<>();
+        allDialogs.clear();
 
         for (ToggleDialog dialog: pAllDialogs) {
             add(dialog, false);
@@ -71,7 +71,7 @@ public class DialogsPanel extends JPanel implements Destroyable {
         p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
         p.setVisible(false);
 
-        mSpltPane.add(p, "L"+i);
+        mSpltPane.add(p, 'L'+Integer.toString(i));
         panels.add(p);
 
         if (dlg.isDialogShowing()) {
@@ -256,7 +256,7 @@ public class DialogsPanel extends JPanel implements Destroyable {
             if (i != k) {
                 ch.add(new Divider());
             }
-            Leaf l = new Leaf("L"+i);
+            Leaf l = new Leaf('L'+Integer.toString(i));
             l.setWeight(1.0 / numPanels);
             ch.add(l);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
index a7f3f1d..1be255e 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
@@ -396,7 +396,7 @@ public class FilterDialog extends ToggleDialog implements DataSetListener {
             return result;
         }
 
-        protected boolean isLastFilterValid() {
+        protected final boolean isLastFilterValid() {
             return lastFilter != null && filterModel.getFilters().contains(lastFilter);
         }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
index d71b87a..79a56b2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
@@ -314,6 +314,7 @@ public class FilterTableModel extends AbstractTableModel {
             savePrefs();
             updateFilters();
             break;
+        default: // Do nothing
         }
         if (column != 0) {
             fireTableCellUpdated(row, column);
@@ -345,7 +346,11 @@ public class FilterTableModel extends AbstractTableModel {
                 return trc("filter", "D");
             case in_selection: /* filter mode: in selection */
                 return trc("filter", "F");
+            default:
+                Main.warn("Unknown filter mode: " + f.mode);
             }
+            break;
+        default: // Do nothing
         }
         return null;
     }
@@ -405,6 +410,10 @@ public class FilterTableModel extends AbstractTableModel {
         g.translate(-dx, -dy);
     }
 
+    /**
+     * Returns the list of filters.
+     * @return the list of filters
+     */
     public List<Filter> getFilters() {
         return filters;
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
new file mode 100644
index 0000000..11cb3f9
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
@@ -0,0 +1,239 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.osm.BBox;
+import org.openstreetmap.josm.data.osm.Node;
+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.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.Geometry;
+import org.openstreetmap.josm.tools.date.DateUtils;
+
+/**
+ * Textual representation of primitive contents, used in {@code InspectPrimitiveDialog}.
+ * @since 10198
+ */
+public class InspectPrimitiveDataText {
+    private static final String INDENT = "  ";
+    private static final char NL = '\n';
+
+    private final StringBuilder s = new StringBuilder();
+    private final OsmDataLayer layer;
+
+    InspectPrimitiveDataText(OsmDataLayer layer) {
+        this.layer = layer;
+    }
+
+    private InspectPrimitiveDataText add(String title, String... values) {
+        s.append(INDENT).append(title);
+        for (String v : values) {
+            s.append(v);
+        }
+        s.append(NL);
+        return this;
+    }
+
+    private static String getNameAndId(String name, long id) {
+        if (name != null) {
+            return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id));
+        } else {
+            return Long.toString(id);
+        }
+    }
+
+    /**
+     * Adds a new OSM primitive.
+     * @param o primitive to add
+     */
+    public void addPrimitive(OsmPrimitive o) {
+
+        addHeadline(o);
+
+        if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) {
+            s.append(NL).append(INDENT).append(tr("not in data set")).append(NL);
+            return;
+        }
+        if (o.isIncomplete()) {
+            s.append(NL).append(INDENT).append(tr("incomplete")).append(NL);
+            return;
+        }
+        s.append(NL);
+
+        addState(o);
+        addCommon(o);
+        addAttributes(o);
+        addSpecial(o);
+        addReferrers(s, o);
+        addConflicts(o);
+        s.append(NL);
+    }
+
+    void addHeadline(OsmPrimitive o) {
+        addType(o);
+        addNameAndId(o);
+    }
+
+    void addType(OsmPrimitive o) {
+        if (o instanceof Node) {
+            s.append(tr("Node: "));
+        } else if (o instanceof Way) {
+            s.append(tr("Way: "));
+        } else if (o instanceof Relation) {
+            s.append(tr("Relation: "));
+        }
+    }
+
+    void addNameAndId(OsmPrimitive o) {
+        String name = o.get("name");
+        if (name == null) {
+            s.append(o.getUniqueId());
+        } else {
+            s.append(getNameAndId(name, o.getUniqueId()));
+        }
+    }
+
+    void addState(OsmPrimitive o) {
+        StringBuilder sb = new StringBuilder(INDENT);
+        /* selected state is left out: not interesting as it is always selected */
+        if (o.isDeleted()) {
+            sb.append(tr("deleted")).append(INDENT);
+        }
+        if (!o.isVisible()) {
+            sb.append(tr("deleted-on-server")).append(INDENT);
+        }
+        if (o.isModified()) {
+            sb.append(tr("modified")).append(INDENT);
+        }
+        if (o.isDisabledAndHidden()) {
+            sb.append(tr("filtered/hidden")).append(INDENT);
+        }
+        if (o.isDisabled()) {
+            sb.append(tr("filtered/disabled")).append(INDENT);
+        }
+        if (o.hasDirectionKeys()) {
+            if (o.reversedDirection()) {
+                sb.append(tr("has direction keys (reversed)")).append(INDENT);
+            } else {
+                sb.append(tr("has direction keys")).append(INDENT);
+            }
+        }
+        String state = sb.toString().trim();
+        if (!state.isEmpty()) {
+            add(tr("State: "), sb.toString().trim());
+        }
+    }
+
+    void addCommon(OsmPrimitive o) {
+        add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
+        add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
+                : DateUtils.fromTimestamp(o.getRawTimestamp()));
+        add(tr("Edited by: "), o.getUser() == null ? tr("<new object>")
+                : getNameAndId(o.getUser().getName(), o.getUser().getId()));
+        add(tr("Version: "), Integer.toString(o.getVersion()));
+        add(tr("In changeset: "), Integer.toString(o.getChangesetId()));
+    }
+
+    void addAttributes(OsmPrimitive o) {
+        if (o.hasKeys()) {
+            add(tr("Tags: "));
+            for (String key : o.keySet()) {
+                s.append(INDENT).append(INDENT);
+                s.append(String.format("\"%s\"=\"%s\"%n", key, o.get(key)));
+            }
+        }
+    }
+
+    void addSpecial(OsmPrimitive o) {
+        if (o instanceof Node) {
+            addCoordinates((Node) o);
+        } else if (o instanceof Way) {
+            addBbox(o);
+            add(tr("Centroid: "), Main.getProjection().eastNorth2latlon(
+                    Geometry.getCentroid(((Way) o).getNodes())).toStringCSV(", "));
+            addWayNodes((Way) o);
+        } else if (o instanceof Relation) {
+            addBbox(o);
+            addRelationMembers((Relation) o);
+        }
+    }
+
+    void addRelationMembers(Relation r) {
+        add(trn("{0} Member: ", "{0} Members: ", r.getMembersCount(), r.getMembersCount()));
+        for (RelationMember m : r.getMembers()) {
+            s.append(INDENT).append(INDENT);
+            addHeadline(m.getMember());
+            s.append(tr(" as \"{0}\"", m.getRole()));
+            s.append(NL);
+        }
+    }
+
+    void addWayNodes(Way w) {
+        add(tr("{0} Nodes: ", w.getNodesCount()));
+        for (Node n : w.getNodes()) {
+            s.append(INDENT).append(INDENT);
+            addNameAndId(n);
+            s.append(NL);
+        }
+    }
+
+    void addBbox(OsmPrimitive o) {
+        BBox bbox = o.getBBox();
+        if (bbox != null) {
+            add(tr("Bounding box: "), bbox.toStringCSV(", "));
+            EastNorth bottomRigth = Main.getProjection().latlon2eastNorth(bbox.getBottomRight());
+            EastNorth topLeft = Main.getProjection().latlon2eastNorth(bbox.getTopLeft());
+            add(tr("Bounding box (projected): "),
+                    Double.toString(topLeft.east()), ", ",
+                    Double.toString(bottomRigth.north()), ", ",
+                    Double.toString(bottomRigth.east()), ", ",
+                    Double.toString(topLeft.north()));
+            add(tr("Center of bounding box: "), bbox.getCenter().toStringCSV(", "));
+        }
+    }
+
+    void addCoordinates(Node n) {
+        if (n.getCoor() != null) {
+            add(tr("Coordinates: "),
+                    Double.toString(n.getCoor().lat()), ", ",
+                    Double.toString(n.getCoor().lon()));
+            add(tr("Coordinates (projected): "),
+                    Double.toString(n.getEastNorth().east()), ", ",
+                    Double.toString(n.getEastNorth().north()));
+        }
+    }
+
+    void addReferrers(StringBuilder s, OsmPrimitive o) {
+        List<OsmPrimitive> refs = o.getReferrers();
+        if (!refs.isEmpty()) {
+            add(tr("Part of: "));
+            for (OsmPrimitive p : refs) {
+                s.append(INDENT).append(INDENT);
+                addHeadline(p);
+                s.append(NL);
+            }
+        }
+    }
+
+    void addConflicts(OsmPrimitive o) {
+        Conflict<?> c = layer.getConflicts().getConflictForMy(o);
+        if (c != null) {
+            add(tr("In conflict with: "));
+            addNameAndId(c.getTheir());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return s.toString();
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
index 54828f0..657a698 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
@@ -24,15 +24,8 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.osm.BBox;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
-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.DefaultNameFormatter;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.NavigatableComponent;
@@ -49,9 +42,7 @@ import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.WindowGeometry;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
  * Panel to inspect one or more OsmPrimitives.
@@ -67,7 +58,12 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
     private boolean mappaintTabLoaded;
     private boolean editcountTabLoaded;
 
-    public InspectPrimitiveDialog(Collection<OsmPrimitive> primitives, OsmDataLayer layer) {
+    /**
+     * Constructs a new {@code InspectPrimitiveDialog}.
+     * @param primitives collection of primitives
+     * @param layer data layer
+     */
+    public InspectPrimitiveDialog(final Collection<OsmPrimitive> primitives, OsmDataLayer layer) {
         super(Main.parent, tr("Advanced object info"), new String[] {tr("Close")});
         this.primitives = new ArrayList<>(primitives);
         this.layer = layer;
@@ -77,7 +73,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         setButtonIcons(new String[]{"ok.png"});
         final JTabbedPane tabs = new JTabbedPane();
 
-        tabs.addTab(tr("data"), genericMonospacePanel(new JPanel(), buildDataText()));
+        tabs.addTab(tr("data"), genericMonospacePanel(new JPanel(), buildDataText(layer, this.primitives)));
 
         final JPanel pMapPaint = new JPanel();
         tabs.addTab(tr("map style"), pMapPaint);
@@ -100,7 +96,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
             public void stateChanged(ChangeEvent e) {
                 if (!editcountTabLoaded && ((SingleSelectionModel) e.getSource()).getSelectedIndex() == 2) {
                     editcountTabLoaded = true;
-                    genericMonospacePanel(pEditCounts, buildListOfEditorsText());
+                    genericMonospacePanel(pEditCounts, buildListOfEditorsText(primitives));
                 }
             }
         });
@@ -108,7 +104,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         setContent(tabs, false);
     }
 
-    protected JPanel genericMonospacePanel(JPanel p, String s) {
+    protected static JPanel genericMonospacePanel(JPanel p, String s) {
         p.setLayout(new GridBagLayout());
         JosmTextArea jte = new JosmTextArea();
         jte.setFont(GuiHelper.getMonospacedFont(jte));
@@ -118,8 +114,8 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         return p;
     }
 
-    protected String buildDataText() {
-        DataText dt = new DataText();
+    protected static String buildDataText(OsmDataLayer layer, List<OsmPrimitive> primitives) {
+        InspectPrimitiveDataText dt = new InspectPrimitiveDataText(layer);
         Collections.sort(primitives, new OsmPrimitiveComparator());
         for (OsmPrimitive o : primitives) {
             dt.addPrimitive(o);
@@ -127,213 +123,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         return dt.toString();
     }
 
-    class DataText {
-        private static final String INDENT = "  ";
-        private static final char NL = '\n';
-
-        private final StringBuilder s = new StringBuilder();
-
-        private DataText add(String title, String... values) {
-            s.append(INDENT).append(title);
-            for (String v : values) {
-                s.append(v);
-            }
-            s.append(NL);
-            return this;
-        }
-
-        private String getNameAndId(String name, long id) {
-            if (name != null) {
-                return name + tr(" ({0})", /* sic to avoid thousand seperators */ Long.toString(id));
-            } else {
-                return Long.toString(id);
-            }
-        }
-
-        public void addPrimitive(OsmPrimitive o) {
-
-            addHeadline(o);
-
-            if (!(o.getDataSet() != null && o.getDataSet().getPrimitiveById(o) != null)) {
-                s.append(NL).append(INDENT).append(tr("not in data set")).append(NL);
-                return;
-            }
-            if (o.isIncomplete()) {
-                s.append(NL).append(INDENT).append(tr("incomplete")).append(NL);
-                return;
-            }
-            s.append(NL);
-
-            addState(o);
-            addCommon(o);
-            addAttributes(o);
-            addSpecial(o);
-            addReferrers(s, o);
-            addConflicts(o);
-            s.append(NL);
-        }
-
-        void addHeadline(OsmPrimitive o) {
-            addType(o);
-            addNameAndId(o);
-        }
-
-        void addType(OsmPrimitive o) {
-            if (o instanceof Node) {
-                s.append(tr("Node: "));
-            } else if (o instanceof Way) {
-                s.append(tr("Way: "));
-            } else if (o instanceof Relation) {
-                s.append(tr("Relation: "));
-            }
-        }
-
-        void addNameAndId(OsmPrimitive o) {
-            String name = o.get("name");
-            if (name == null) {
-                s.append(o.getUniqueId());
-            } else {
-                s.append(getNameAndId(name, o.getUniqueId()));
-            }
-        }
-
-        void addState(OsmPrimitive o) {
-            StringBuilder sb = new StringBuilder(INDENT);
-            /* selected state is left out: not interesting as it is always selected */
-            if (o.isDeleted()) {
-                sb.append(tr("deleted")).append(INDENT);
-            }
-            if (!o.isVisible()) {
-                sb.append(tr("deleted-on-server")).append(INDENT);
-            }
-            if (o.isModified()) {
-                sb.append(tr("modified")).append(INDENT);
-            }
-            if (o.isDisabledAndHidden()) {
-                sb.append(tr("filtered/hidden")).append(INDENT);
-            }
-            if (o.isDisabled()) {
-                sb.append(tr("filtered/disabled")).append(INDENT);
-            }
-            if (o.hasDirectionKeys()) {
-                if (o.reversedDirection()) {
-                    sb.append(tr("has direction keys (reversed)")).append(INDENT);
-                } else {
-                    sb.append(tr("has direction keys")).append(INDENT);
-                }
-            }
-            String state = sb.toString().trim();
-            if (!state.isEmpty()) {
-                add(tr("State: "), sb.toString().trim());
-            }
-        }
-
-        void addCommon(OsmPrimitive o) {
-            add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
-            add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
-                    : DateUtils.fromTimestamp(o.getRawTimestamp()));
-            add(tr("Edited by: "), o.getUser() == null ? tr("<new object>")
-                    : getNameAndId(o.getUser().getName(), o.getUser().getId()));
-            add(tr("Version: "), Integer.toString(o.getVersion()));
-            add(tr("In changeset: "), Integer.toString(o.getChangesetId()));
-        }
-
-        void addAttributes(OsmPrimitive o) {
-            if (o.hasKeys()) {
-                add(tr("Tags: "));
-                for (String key : o.keySet()) {
-                    s.append(INDENT).append(INDENT);
-                    s.append(String.format("\"%s\"=\"%s\"%n", key, o.get(key)));
-                }
-            }
-        }
-
-        void addSpecial(OsmPrimitive o) {
-            if (o instanceof Node) {
-                addCoordinates((Node) o);
-            } else if (o instanceof Way) {
-                addBbox(o);
-                add(tr("Centroid: "), Main.getProjection().eastNorth2latlon(
-                        Geometry.getCentroid(((Way) o).getNodes())).toStringCSV(", "));
-                addWayNodes((Way) o);
-            } else if (o instanceof Relation) {
-                addBbox(o);
-                addRelationMembers((Relation) o);
-            }
-        }
-
-        void addRelationMembers(Relation r) {
-            add(trn("{0} Member: ", "{0} Members: ", r.getMembersCount(), r.getMembersCount()));
-            for (RelationMember m : r.getMembers()) {
-                s.append(INDENT).append(INDENT);
-                addHeadline(m.getMember());
-                s.append(tr(" as \"{0}\"", m.getRole()));
-                s.append(NL);
-            }
-        }
-
-        void addWayNodes(Way w) {
-            add(tr("{0} Nodes: ", w.getNodesCount()));
-            for (Node n : w.getNodes()) {
-                s.append(INDENT).append(INDENT);
-                addNameAndId(n);
-                s.append(NL);
-            }
-        }
-
-        void addBbox(OsmPrimitive o) {
-            BBox bbox = o.getBBox();
-            if (bbox != null) {
-                add(tr("Bounding box: "), bbox.toStringCSV(", "));
-                EastNorth bottomRigth = Main.getProjection().latlon2eastNorth(bbox.getBottomRight());
-                EastNorth topLeft = Main.getProjection().latlon2eastNorth(bbox.getTopLeft());
-                add(tr("Bounding box (projected): "),
-                        Double.toString(topLeft.east()), ", ",
-                        Double.toString(bottomRigth.north()), ", ",
-                        Double.toString(bottomRigth.east()), ", ",
-                        Double.toString(topLeft.north()));
-                add(tr("Center of bounding box: "), bbox.getCenter().toStringCSV(", "));
-            }
-        }
-
-        void addCoordinates(Node n) {
-            if (n.getCoor() != null) {
-                add(tr("Coordinates: "),
-                        Double.toString(n.getCoor().lat()), ", ",
-                        Double.toString(n.getCoor().lon()));
-                add(tr("Coordinates (projected): "),
-                        Double.toString(n.getEastNorth().east()), ", ",
-                        Double.toString(n.getEastNorth().north()));
-            }
-        }
-
-        void addReferrers(StringBuilder s, OsmPrimitive o) {
-            List<OsmPrimitive> refs = o.getReferrers();
-            if (!refs.isEmpty()) {
-                add(tr("Part of: "));
-                for (OsmPrimitive p : refs) {
-                    s.append(INDENT).append(INDENT);
-                    addHeadline(p);
-                    s.append(NL);
-                }
-            }
-        }
-
-        void addConflicts(OsmPrimitive o) {
-            Conflict<?> c = layer.getConflicts().getConflictForMy(o);
-            if (c != null) {
-                add(tr("In conflict with: "));
-                addNameAndId(c.getTheir());
-            }
-        }
-
-        @Override
-        public String toString() {
-            return s.toString();
-        }
-    }
-
-    protected String buildMapPaintText() {
+    protected static String buildMapPaintText() {
         final Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getAllSelected();
         ElemStyles elemstyles = MapPaintStyles.getStyles();
         NavigatableComponent nc = Main.map.mapView;
@@ -391,7 +181,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         Sort by the count for presentation, so the most active editors are on top.
         Count only tagged nodes (so empty way nodes don't inflate counts).
     */
-    protected String buildListOfEditorsText() {
+    protected static String buildListOfEditorsText(Iterable<OsmPrimitive> primitives) {
         final StringBuilder s = new StringBuilder();
         final Map<String, Integer> editCountByUser = new TreeMap<>(Collator.getInstance(Locale.getDefault()));
 
@@ -415,7 +205,7 @@ public class InspectPrimitiveDialog extends ExtendedDialog {
         for (Map.Entry<String, Integer> entry : editCountByUser.entrySet()) {
             final String username = entry.getKey();
             final Integer editCount = entry.getValue();
-            s.append(String.format("%6d  %s%n", editCount, username));
+            s.append(String.format("%6d  %s", editCount, username)).append('\n');
         }
         return s.toString();
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java
index a3c9bfc..940fd27 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java
@@ -199,7 +199,7 @@ public class LatLonDialog extends ExtendedDialog {
         this.latLonCoordinates = ll;
         tfLatLon.setText(ll.latToString(CoordinateFormat.getDefaultFormat()) + ' ' + ll.lonToString(CoordinateFormat.getDefaultFormat()));
         EastNorth en = Main.getProjection().latlon2eastNorth(ll);
-        tfEastNorth.setText(en.east()+" "+en.north());
+        tfEastNorth.setText(Double.toString(en.east()) + ' ' + Double.toString(en.north()));
         setOkEnabled(true);
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
index 7ed2541..d1917bd 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
@@ -59,6 +59,13 @@ import org.openstreetmap.josm.gui.dialogs.layer.MoveUpAction;
 import org.openstreetmap.josm.gui.dialogs.layer.ShowHideLayerAction;
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions;
 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.NativeScaleLayer;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
@@ -74,6 +81,8 @@ import org.openstreetmap.josm.tools.Shortcut;
  * This is a toggle dialog which displays the list of layers. Actions allow to
  * change the ordering of the layers, to hide/show layers, to activate layers,
  * and to delete layers.
+ * <p>
+ * Support for multiple {@link LayerListDialog} is currently not complete but intended for the future.
  * @since 17
  */
 public class LayerListDialog extends ToggleDialog {
@@ -135,6 +144,11 @@ public class LayerListDialog extends ToggleDialog {
     private final ToggleLayerIndexVisibility[] visibilityToggleActions = new ToggleLayerIndexVisibility[10];
 
     /**
+     * The {@link MainLayerManager} this list is for.
+     */
+    private final transient MainLayerManager layerManager;
+
+    /**
      * registers (shortcut to toggle right hand side toggle dialogs)+(number keys) shortcuts
      * to toggle the visibility of the first ten layers.
      */
@@ -154,9 +168,18 @@ public class LayerListDialog extends ToggleDialog {
      * @param mapFrame map frame
      */
     protected LayerListDialog(MapFrame mapFrame) {
+        this(mapFrame.mapView.getLayerManager());
+    }
+
+    /**
+     * Creates a layer list and attach it to the given mapView.
+     * @param layerManager The layer manager this list is for
+     */
+    private 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);
+        this.layerManager = layerManager;
 
         // create the models
         //
@@ -166,7 +189,7 @@ public class LayerListDialog extends ToggleDialog {
 
         // create the list control
         //
-        layerList = new LayerList(model);
+        layerList = new LayerList(model, layerManager);
         layerList.setSelectionModel(selectionModel);
         layerList.addMouseListener(new PopupMenuHandler());
         layerList.setBackground(UIManager.getColor("Button.background"));
@@ -218,9 +241,8 @@ public class LayerListDialog extends ToggleDialog {
 
         // init the model
         //
-        final MapView mapView = mapFrame.mapView;
         model.populate();
-        model.setSelectedLayer(mapView.getActiveLayer());
+        model.setSelectedLayer(layerManager.getActiveLayer());
         model.addLayerListModelListener(
                 new LayerListModelListener() {
                     @Override
@@ -296,16 +318,27 @@ public class LayerListDialog extends ToggleDialog {
         createVisibilityToggleShortcuts();
     }
 
+    /**
+     * Gets the layer manager this dialog is for.
+     * @return The layer manager.
+     * @since 10288
+     */
+    public MainLayerManager getLayerManager() {
+        return layerManager;
+    }
+
     @Override
     public void showNotify() {
         MapView.addLayerChangeListener(activateLayerAction);
-        MapView.addLayerChangeListener(model);
+        layerManager.addLayerChangeListener(model);
+        layerManager.addActiveLayerChangeListener(model, true);
         model.populate();
     }
 
     @Override
     public void hideNotify() {
-        MapView.removeLayerChangeListener(model);
+        layerManager.removeLayerChangeListener(model);
+        layerManager.removeActiveLayerChangeListener(model);
         MapView.removeLayerChangeListener(activateLayerAction);
     }
 
@@ -512,9 +545,7 @@ public class LayerListDialog extends ToggleDialog {
     private class LayerNameCellRenderer extends DefaultTableCellRenderer {
 
         protected boolean isActiveLayer(Layer layer) {
-            if (!Main.isDisplayingMapView())
-                return false;
-            return Main.map.mapView.getActiveLayer() == layer;
+            return getLayerManager().getActiveLayer() == layer;
         }
 
         @Override
@@ -611,7 +642,8 @@ public class LayerListDialog extends ToggleDialog {
      * It also listens to {@link PropertyChangeEvent}s of every {@link Layer} it manages, in particular to
      * the properties {@link Layer#VISIBLE_PROP} and {@link Layer#NAME_PROP}.
      */
-    public static final class LayerListModel extends AbstractTableModel implements MapView.LayerChangeListener, PropertyChangeListener {
+    public static final class LayerListModel extends AbstractTableModel
+            implements LayerChangeListener, ActiveLayerChangeListener, PropertyChangeListener {
         /** manages list selection state*/
         private final DefaultListSelectionModel selectionModel;
         private final CopyOnWriteArrayList<LayerListModelListener> listeners;
@@ -627,10 +659,19 @@ public class LayerListDialog extends ToggleDialog {
             listeners = new CopyOnWriteArrayList<>();
         }
 
-        void setlayerList(LayerList layerList) {
+        void setLayerList(LayerList layerList) {
             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();
+            }
+        }
+
         /**
          * Adds a listener to this model
          *
@@ -737,23 +778,19 @@ public class LayerListDialog extends ToggleDialog {
          *
          * @param layer the layer which is removed
          */
-        protected void onRemoveLayer(Layer layer) {
+        private void onRemoveLayer(Layer layer) {
             if (layer == null)
                 return;
             layer.removePropertyChangeListener(this);
             final int size = getRowCount();
             final List<Integer> rows = getSelectedRows();
-            GuiHelper.runInEDTAndWait(new Runnable() {
-                @Override
-                public void run() {
-                    if (rows.isEmpty() && size > 0) {
-                        selectionModel.setSelectionInterval(size-1, size-1);
-                    }
-                    fireTableDataChanged();
-                    fireRefresh();
-                    ensureActiveSelected();
-                }
-            });
+
+            if (rows.isEmpty() && size > 0) {
+                selectionModel.setSelectionInterval(size-1, size-1);
+            }
+            fireTableDataChanged();
+            fireRefresh();
+            ensureActiveSelected();
         }
 
         /**
@@ -761,13 +798,15 @@ public class LayerListDialog extends ToggleDialog {
          *
          * @param layer the layer
          */
-        protected void onAddLayer(Layer layer) {
+        private void onAddLayer(Layer layer) {
             if (layer == null)
                 return;
             layer.addPropertyChangeListener(this);
             fireTableDataChanged();
             int idx = getLayers().indexOf(layer);
-            layerList.setRowHeight(idx, Math.max(16, layer.getIcon().getIconHeight()));
+            if (layerList != null) {
+                layerList.setRowHeight(idx, Math.max(16, layer.getIcon().getIconHeight()));
+            }
             selectionModel.setSelectionInterval(idx, idx);
             ensureSelectedIsVisible();
         }
@@ -885,10 +924,10 @@ public class LayerListDialog extends ToggleDialog {
          */
         public List<Layer> getPossibleMergeTargets(Layer source) {
             List<Layer> targets = new ArrayList<>();
-            if (source == null || !Main.isDisplayingMapView()) {
+            if (source == null) {
                 return targets;
             }
-            for (Layer target : Main.map.mapView.getAllLayersAsList()) {
+            for (Layer target : getLayers()) {
                 if (source == target) {
                     continue;
                 }
@@ -907,9 +946,7 @@ public class LayerListDialog extends ToggleDialog {
          * Never null, but can be empty.
          */
         public List<Layer> getLayers() {
-            if (!Main.isDisplayingMapView())
-                return Collections.<Layer>emptyList();
-            return Main.map.mapView.getAllLayersAsList();
+            return getLayerManager().getLayers();
         }
 
         /**
@@ -939,14 +976,17 @@ public class LayerListDialog extends ToggleDialog {
          * @return the active layer. null, if no active layer is available
          */
         protected Layer getActiveLayer() {
-            return Main.isDisplayingMapView() ? Main.map.mapView.getActiveLayer() : null;
+            return getLayerManager().getActiveLayer();
         }
 
         /**
-         * Replies the scale layer. null, if no active layer is available
+         * Replies the scale layer. null, if no active layer is available.
          *
          * @return the scale layer. null, if no active layer is available
+         * @deprecated Deprecated since it is unused in JOSM and does not really belong here. Can be removed soon (August 2016).
+         *             You can directly query MapView.
          */
+        @Deprecated
         protected NativeScaleLayer getNativeScaleLayer() {
             return Main.isDisplayingMapView() ? Main.map.mapView.getNativeScaleLayer() : null;
         }
@@ -972,10 +1012,10 @@ public class LayerListDialog extends ToggleDialog {
             if (row >= 0 && row < layers.size()) {
                 switch (col) {
                 case 0: return layers.get(row) == getActiveLayer();
-                case 1: return layers.get(row);
-                case 2: return layers.get(row);
+                case 1:
+                case 2:
                 case 3: return layers.get(row);
-                default: throw new RuntimeException();
+                default: // Do nothing
                 }
             }
             return null;
@@ -995,7 +1035,7 @@ public class LayerListDialog extends ToggleDialog {
                 Layer l = layers.get(row);
                 switch (col) {
                 case 0:
-                    Main.map.mapView.setActiveLayer(l);
+                    getLayerManager().setActiveLayer(l);
                     l.setVisible(true);
                     break;
                 case 1:
@@ -1025,39 +1065,44 @@ public class LayerListDialog extends ToggleDialog {
         }
 
         /* ------------------------------------------------------------------------------ */
-        /* Interface LayerChangeListener                                                  */
+        /* Interface ActiveLayerChangeListener                                            */
         /* ------------------------------------------------------------------------------ */
         @Override
-        public void activeLayerChange(final Layer oldLayer, final Layer newLayer) {
-            GuiHelper.runInEDTAndWait(new Runnable() {
-                @Override
-                public void run() {
-                    if (oldLayer != null) {
-                        int idx = getLayers().indexOf(oldLayer);
-                        if (idx >= 0) {
-                            fireTableRowsUpdated(idx, idx);
-                        }
-                    }
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            Layer oldLayer = e.getPreviousActiveLayer();
+            if (oldLayer != null) {
+                int idx = getLayers().indexOf(oldLayer);
+                if (idx >= 0) {
+                    fireTableRowsUpdated(idx, idx);
+                }
+            }
 
-                    if (newLayer != null) {
-                        int idx = getLayers().indexOf(newLayer);
-                        if (idx >= 0) {
-                            fireTableRowsUpdated(idx, idx);
-                        }
-                    }
-                    ensureActiveSelected();
+            Layer newLayer = getActiveLayer();
+            if (newLayer != null) {
+                int idx = getLayers().indexOf(newLayer);
+                if (idx >= 0) {
+                    fireTableRowsUpdated(idx, idx);
                 }
-            });
+            }
+            ensureActiveSelected();
         }
 
+        /* ------------------------------------------------------------------------------ */
+        /* Interface LayerChangeListener                                                  */
+        /* ------------------------------------------------------------------------------ */
         @Override
-        public void layerAdded(Layer newLayer) {
-            onAddLayer(newLayer);
+        public void layerAdded(LayerAddEvent e) {
+            onAddLayer(e.getAddedLayer());
         }
 
         @Override
-        public void layerRemoved(final Layer oldLayer) {
-            onRemoveLayer(oldLayer);
+        public void layerRemoving(LayerRemoveEvent e) {
+            onRemoveLayer(e.getRemovedLayer());
+        }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            // ignored for now, since only we change layer order.
         }
 
         /* ------------------------------------------------------------------------------ */
@@ -1075,10 +1120,16 @@ 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 {
-        LayerList(LayerListModel dataModel) {
+        private final transient MainLayerManager layerManager;
+
+        LayerList(LayerListModel dataModel, MainLayerManager layerManager) {
             super(dataModel);
-            dataModel.setlayerList(this);
+            this.layerManager = layerManager;
+            dataModel.setLayerList(this);
         }
 
         public void scrollToVisible(int row, int col) {
@@ -1090,6 +1141,15 @@ 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;
+        }
     }
 
     /**
@@ -1146,10 +1206,7 @@ public class LayerListDialog extends ToggleDialog {
      * @return the layer at given index, or {@code null} if index out of range
      */
     public static Layer getLayerForIndex(int index) {
-        if (!Main.isDisplayingMapView())
-            return null;
-
-        List<Layer> layers = Main.map.mapView.getAllLayersAsList();
+        List<Layer> layers = Main.getLayerManager().getLayers();
 
         if (index < layers.size() && index >= 0)
             return layers.get(index);
@@ -1166,10 +1223,7 @@ public class LayerListDialog extends ToggleDialog {
     public static List<MultikeyInfo> getLayerInfoByClass(Class<?> layerClass) {
         List<MultikeyInfo> result = new ArrayList<>();
 
-        if (!Main.isDisplayingMapView())
-            return result;
-
-        List<Layer> layers = Main.map.mapView.getAllLayersAsList();
+        List<Layer> layers = Main.getLayerManager().getLayers();
 
         int index = 0;
         for (Layer l: layers) {
@@ -1183,15 +1237,15 @@ public class LayerListDialog extends ToggleDialog {
     }
 
     /**
-     * Determines if a layer is valid (contained in layer list).
+     * Determines if a layer is valid (contained in global layer list).
      * @param l the layer
      * @return {@code true} if layer {@code l} is contained in current layer list
      */
     public static boolean isLayerValid(Layer l) {
-        if (l == null || !Main.isDisplayingMapView())
+        if (l == null)
             return false;
 
-        return Main.map.mapView.getAllLayersAsList().contains(l);
+        return Main.getLayerManager().containsLayer(l);
     }
 
     /**
@@ -1200,10 +1254,10 @@ public class LayerListDialog extends ToggleDialog {
      * @return info about layer {@code l}
      */
     public static MultikeyInfo getLayerInfo(Layer l) {
-        if (l == null || !Main.isDisplayingMapView())
+        if (l == null)
             return null;
 
-        int index = Main.map.mapView.getAllLayersAsList().indexOf(l);
+        int index = Main.getLayerManager().getLayers().indexOf(l);
         if (index < 0)
             return null;
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
index 0564fcb..29e34e7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
@@ -88,11 +88,15 @@ import org.openstreetmap.josm.tools.InputMapUtils;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
 
+/**
+ * Dialog to configure the map painting style.
+ * @since 3843
+ */
 public class MapPaintDialog extends ToggleDialog {
 
     protected StylesTable tblStyles;
     protected StylesModel model;
-    protected DefaultListSelectionModel selectionModel;
+    protected final DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
 
     protected OnOffAction onoffAction;
     protected ReloadAction reloadAction;
@@ -143,7 +147,7 @@ public class MapPaintDialog extends ToggleDialog {
         cbWireframe.setBorder(new EmptyBorder(new Insets(1, 1, 1, 1)));
 
         tblStyles = new StylesTable(model);
-        tblStyles.setSelectionModel(selectionModel = new DefaultListSelectionModel());
+        tblStyles.setSelectionModel(selectionModel);
         tblStyles.addMouseListener(new PopupMenuHandler());
         tblStyles.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
         tblStyles.setBackground(UIManager.getColor("Panel.background"));
@@ -271,8 +275,10 @@ public class MapPaintDialog extends ToggleDialog {
          */
         public void ensureSelectedIsVisible() {
             int index = selectionModel.getMinSelectionIndex();
-            if (index < 0) return;
-            if (index >= getRowCount()) return;
+            if (index < 0)
+                return;
+            if (index >= getRowCount())
+                return;
             tblStyles.scrollToVisible(index, 0);
             tblStyles.repaint();
         }
@@ -681,7 +687,7 @@ public class MapPaintDialog extends ToggleDialog {
             txtErrors.setEditable(false);
             p.add(new JScrollPane(txtErrors), GBC.std().fill());
             for (T t : items) {
-                txtErrors.append(t + "\n");
+                txtErrors.append(t.toString() + '\n');
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java b/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
index 3f5d33f..ea87e40 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/OsmIdSelectionDialog.java
@@ -250,15 +250,27 @@ public class OsmIdSelectionDialog extends ExtendedDialog implements WindowListen
         }
     }
 
-    @Override public void windowOpened(WindowEvent e) {}
+    @Override public void windowOpened(WindowEvent e) {
+        // Do nothing
+    }
 
-    @Override public void windowClosing(WindowEvent e) {}
+    @Override public void windowClosing(WindowEvent e) {
+        // Do nothing
+    }
 
-    @Override public void windowIconified(WindowEvent e) {}
+    @Override public void windowIconified(WindowEvent e) {
+        // Do nothing
+    }
 
-    @Override public void windowDeiconified(WindowEvent e) {}
+    @Override public void windowDeiconified(WindowEvent e) {
+        // Do nothing
+    }
 
-    @Override public void windowActivated(WindowEvent e) {}
+    @Override public void windowActivated(WindowEvent e) {
+        // Do nothing
+    }
 
-    @Override public void windowDeactivated(WindowEvent e) {}
+    @Override public void windowDeactivated(WindowEvent e) {
+        // Do nothing
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
index 569b83f..2b5cc22 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
@@ -511,6 +511,7 @@ public class SelectionListDialog extends ToggleDialog  {
                 case NODE: numNodes++; break;
                 case WAY: numWays++; break;
                 case RELATION: numRelations++; break;
+                default: throw new AssertionError();
                 }
             }
             return tr("Sel.: Rel.:{0} / Ways:{1} / Nodes:{2}", numRelations, numWays, numNodes);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
index 78c95f9..2b9ce25 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
@@ -458,7 +458,6 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
 
     /**
      * Closes the detached dialog if this toggle dialog is currently displayed in a detached dialog.
-     *
      */
     public void closeDetachedDialog() {
         if (detachedDialog != null) {
@@ -473,20 +472,18 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
      * method, it's a good place to register listeners needed to keep dialog updated
      */
     public void showNotify() {
-
+        // Do nothing
     }
 
     /**
-     * Called when toggle dialog is hidden (collapsed, removed, MapFrame is removed, ...). Good place to unregister
-     * listeners
+     * Called when toggle dialog is hidden (collapsed, removed, MapFrame is removed, ...). Good place to unregister listeners
      */
     public void hideNotify() {
-
+        // Do nothing
     }
 
     /**
      * The title bar displayed in docked mode
-     *
      */
     protected class TitleBar extends JPanel {
         /** the label which shows whether the toggle dialog is expanded or collapsed */
@@ -854,6 +851,7 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
      * Do something when the toggleButton is pressed.
      */
     protected void toggleButtonHook() {
+        // Do nothing
     }
 
     protected boolean dockWhenClosingDetachedDlg() {
@@ -864,6 +862,7 @@ public class ToggleDialog extends JPanel implements ShowHideButtonListener, Help
      * primitive stateChangedListener for subclasses
      */
     protected void stateChanged() {
+        // Do nothing
     }
 
     protected Component createLayout(Component data, boolean scroll, Collection<SideButton> buttons) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java
index 84bc2ba..459794c 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java
@@ -59,6 +59,7 @@ public class ChangesetCacheTableCellRenderer extends AbstractCellRenderer {
         case 4: /* created at */ renderDate(cs.getCreatedAt()); break;
         case 5: /* closed at */ renderDate(cs.getClosedAt()); break;
         case 6: /* discussions */ renderDiscussions(cs); break;
+        default: // Do nothing
         }
         return this;
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
index 149f9e9..046c011 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java
@@ -234,7 +234,7 @@ public class ChangesetContentPanel extends JPanel implements PropertyChangeListe
                             }
                         });
                     }
-                } catch (final Exception e) {
+                } catch (final RuntimeException e) {
                     GuiHelper.runInEDT(new Runnable() {
                         @Override
                         public void run() {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
index 53aed30..d6bdce7 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionTableCellRenderer.java
@@ -37,6 +37,8 @@ public class ChangesetDiscussionTableCellRenderer extends AbstractCellRenderer {
             ((JosmTextArea) comp).setWrapStyleWord(true);
             reset(comp, false);
             renderColors(comp, isSelected);
+            break;
+        default: // Do nothing
         }
         return comp;
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
index 6404cfe..775618f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/SingleChangesetDownloadPanel.java
@@ -25,11 +25,18 @@ import org.openstreetmap.josm.io.OnlineResource;
 /**
  * This panel allows to enter the ID of single changeset and to download
  * the respective changeset.
- *
+ * @since 2689
  */
 public class SingleChangesetDownloadPanel extends JPanel {
 
-    private ChangesetIdTextField tfChangesetId;
+    private final ChangesetIdTextField tfChangesetId = new ChangesetIdTextField();
+
+    /**
+     * Constructs a new {@link SingleChangesetDownloadPanel}
+     */
+    public SingleChangesetDownloadPanel() {
+        build();
+    }
 
     protected void build() {
         setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
@@ -41,7 +48,7 @@ public class SingleChangesetDownloadPanel extends JPanel {
         );
 
         add(new JLabel(tr("Changeset ID: ")));
-        add(tfChangesetId = new ChangesetIdTextField());
+        add(tfChangesetId);
         tfChangesetId.setToolTipText(tr("Enter a changeset id"));
         SelectAllOnFocusGainedDecorator.decorate(tfChangesetId);
 
@@ -57,13 +64,6 @@ public class SingleChangesetDownloadPanel extends JPanel {
     }
 
     /**
-     * Constructs a new {@link SingleChangesetDownloadPanel}
-     */
-    public SingleChangesetDownloadPanel() {
-        build();
-    }
-
-    /**
      * Replies the changeset id entered in this panel. 0 if no changeset id
      * or an invalid changeset id is currently entered.
      *
@@ -89,7 +89,8 @@ public class SingleChangesetDownloadPanel extends JPanel {
             if (!isEnabled())
                 return;
             int id = getChangesetId();
-            if (id == 0) return;
+            if (id == 0)
+                return;
             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 02a9e5c..4fd758b 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
@@ -41,21 +41,27 @@ import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 import org.openstreetmap.josm.io.ChangesetQuery;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
-
 /**
  * This panel allows to specify a changeset query
- *
+ * @since 2689
  */
 public class AdvancedChangesetQueryPanel extends JPanel {
 
-    private JCheckBox cbUserRestriction;
-    private JCheckBox cbOpenAndCloseRestrictions;
-    private JCheckBox cbTimeRestrictions;
-    private JCheckBox cbBoundingBoxRestriction;
-    private UserRestrictionPanel pnlUserRestriction;
-    private OpenAndCloseStateRestrictionPanel pnlOpenAndCloseRestriction;
-    private TimeRestrictionPanel pnlTimeRestriction;
-    private BBoxRestrictionPanel pnlBoundingBoxRestriction;
+    private final JCheckBox cbUserRestriction = new JCheckBox();
+    private final JCheckBox cbOpenAndCloseRestrictions = new JCheckBox();
+    private final JCheckBox cbTimeRestrictions = new JCheckBox();
+    private final JCheckBox cbBoundingBoxRestriction = new JCheckBox();
+    private final UserRestrictionPanel pnlUserRestriction = new UserRestrictionPanel();
+    private final OpenAndCloseStateRestrictionPanel pnlOpenAndCloseRestriction = new OpenAndCloseStateRestrictionPanel();
+    private final TimeRestrictionPanel pnlTimeRestriction = new TimeRestrictionPanel();
+    private final BBoxRestrictionPanel pnlBoundingBoxRestriction = new BBoxRestrictionPanel();
+
+    /**
+     * Constructs a new {@code AdvancedChangesetQueryPanel}.
+     */
+    public AdvancedChangesetQueryPanel() {
+        build();
+    }
 
     protected JPanel buildQueryPanel() {
         ItemListener stateChangeHandler = new RestrictionGroupStateChangeHandler();
@@ -68,7 +74,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(cbUserRestriction = new JCheckBox(), gc);
+        pnl.add(cbUserRestriction, gc);
         cbUserRestriction.addItemListener(stateChangeHandler);
 
         gc.gridx = 1;
@@ -78,7 +84,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.gridy = 1;
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(pnlUserRestriction = new UserRestrictionPanel(), gc);
+        pnl.add(pnlUserRestriction, gc);
 
         // -- restricting the query to open and closed changesets
         //
@@ -87,7 +93,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(cbOpenAndCloseRestrictions = new JCheckBox(), gc);
+        pnl.add(cbOpenAndCloseRestrictions, gc);
         cbOpenAndCloseRestrictions.addItemListener(stateChangeHandler);
 
         gc.gridx = 1;
@@ -97,7 +103,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.gridy = 3;
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(pnlOpenAndCloseRestriction = new OpenAndCloseStateRestrictionPanel(), gc);
+        pnl.add(pnlOpenAndCloseRestriction, gc);
 
         // -- restricting the query to a specific time
         //
@@ -106,7 +112,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(cbTimeRestrictions = new JCheckBox(), gc);
+        pnl.add(cbTimeRestrictions, gc);
         cbTimeRestrictions.addItemListener(stateChangeHandler);
 
         gc.gridx = 1;
@@ -116,7 +122,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.gridy = 5;
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(pnlTimeRestriction = new TimeRestrictionPanel(), gc);
+        pnl.add(pnlTimeRestriction, gc);
 
 
         // -- restricting the query to a specific bounding box
@@ -126,7 +132,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(cbBoundingBoxRestriction = new JCheckBox(), gc);
+        pnl.add(cbBoundingBoxRestriction, gc);
         cbBoundingBoxRestriction.addItemListener(stateChangeHandler);
 
         gc.gridx = 1;
@@ -136,7 +142,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         gc.gridy = 7;
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(pnlBoundingBoxRestriction = new BBoxRestrictionPanel(), gc);
+        pnl.add(pnlBoundingBoxRestriction, gc);
 
 
         gc.gridy = 8;
@@ -156,13 +162,6 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         add(spQueryPanel, BorderLayout.CENTER);
     }
 
-    /**
-     * Constructs a new {@code AdvancedChangesetQueryPanel}.
-     */
-    public AdvancedChangesetQueryPanel() {
-        build();
-    }
-
     public void startUserInput() {
         restoreFromSettings();
         pnlBoundingBoxRestriction.setVisible(cbBoundingBoxRestriction.isSelected());
@@ -240,22 +239,26 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
     class RestrictionGroupStateChangeHandler implements ItemListener {
         protected void userRestrictionStateChanged() {
-            if (pnlUserRestriction == null) return;
+            if (pnlUserRestriction == null)
+                return;
             pnlUserRestriction.setVisible(cbUserRestriction.isSelected());
         }
 
         protected void openCloseRestrictionStateChanged() {
-            if (pnlOpenAndCloseRestriction == null) return;
+            if (pnlOpenAndCloseRestriction == null)
+                return;
             pnlOpenAndCloseRestriction.setVisible(cbOpenAndCloseRestrictions.isSelected());
         }
 
         protected void timeRestrictionsStateChanged() {
-            if (pnlTimeRestriction == null) return;
+            if (pnlTimeRestriction == null)
+                return;
             pnlTimeRestriction.setVisible(cbTimeRestrictions.isSelected());
         }
 
         protected void boundingBoxRestrictionChanged() {
-            if (pnlBoundingBoxRestriction == null) return;
+            if (pnlBoundingBoxRestriction == null)
+                return;
             pnlBoundingBoxRestriction.setVisible(cbBoundingBoxRestriction.isSelected());
         }
 
@@ -281,9 +284,13 @@ public class AdvancedChangesetQueryPanel extends JPanel {
      */
     private static class OpenAndCloseStateRestrictionPanel extends JPanel {
 
-        private JRadioButton rbOpenOnly;
-        private JRadioButton rbClosedOnly;
-        private JRadioButton rbBoth;
+        private final JRadioButton rbOpenOnly = new JRadioButton();
+        private final JRadioButton rbClosedOnly = new JRadioButton();
+        private final JRadioButton rbBoth = new JRadioButton();
+
+        OpenAndCloseStateRestrictionPanel() {
+            build();
+        }
 
         protected void build() {
             setLayout(new GridBagLayout());
@@ -298,7 +305,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.anchor = GridBagConstraints.NORTHWEST;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbOpenOnly = new JRadioButton(), gc);
+            add(rbOpenOnly, gc);
 
             gc.gridx = 1;
             gc.weightx = 1.0;
@@ -307,7 +314,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridy = 1;
             gc.gridx = 0;
             gc.weightx = 0.0;
-            add(rbClosedOnly = new JRadioButton(), gc);
+            add(rbClosedOnly, gc);
 
             gc.gridx = 1;
             gc.weightx = 1.0;
@@ -316,7 +323,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridy = 2;
             gc.gridx = 0;
             gc.weightx = 0.0;
-            add(rbBoth = new JRadioButton(), gc);
+            add(rbBoth, gc);
 
             gc.gridx = 1;
             gc.weightx = 1.0;
@@ -328,10 +335,6 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             bgRestrictions.add(rbOpenOnly);
         }
 
-        OpenAndCloseStateRestrictionPanel() {
-            build();
-        }
-
         public void startUserInput() {
             restoreFromSettings();
         }
@@ -368,20 +371,22 @@ public class AdvancedChangesetQueryPanel extends JPanel {
     }
 
     /**
-     * This is the panel for selecting whether the query should be restricted to a specific
-     * user
-     *
+     * This is the panel for selecting whether the query should be restricted to a specific user
      */
     private static class UserRestrictionPanel extends JPanel {
-        private ButtonGroup bgUserRestrictions;
-        private JRadioButton rbRestrictToMyself;
-        private JRadioButton rbRestrictToUid;
-        private JRadioButton rbRestrictToUserName;
-        private JosmTextField tfUid;
+        private final ButtonGroup bgUserRestrictions = new ButtonGroup();
+        private final JRadioButton rbRestrictToMyself = new JRadioButton();
+        private final JRadioButton rbRestrictToUid = new JRadioButton();
+        private final JRadioButton rbRestrictToUserName = new JRadioButton();
+        private final JosmTextField tfUid = new JosmTextField(10);
         private transient UidInputFieldValidator valUid;
-        private JosmTextField tfUserName;
+        private final JosmTextField tfUserName = new JosmTextField(10);
         private transient UserNameValidator valUserName;
-        private JMultilineLabel lblRestrictedToMyself;
+        private final JMultilineLabel lblRestrictedToMyself = new JMultilineLabel(tr("Only changesets owned by myself"));
+
+        UserRestrictionPanel() {
+            build();
+        }
 
         protected JPanel buildUidInputPanel() {
             JPanel pnl = new JPanel(new GridBagLayout());
@@ -392,7 +397,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             pnl.add(new JLabel(tr("User ID:")), gc);
 
             gc.gridx = 1;
-            pnl.add(tfUid = new JosmTextField(10), gc);
+            pnl.add(tfUid, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfUid);
             valUid = UidInputFieldValidator.decorate(tfUid);
 
@@ -412,7 +417,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             pnl.add(new JLabel(tr("User name:")), gc);
 
             gc.gridx = 1;
-            pnl.add(tfUserName = new JosmTextField(10), gc);
+            pnl.add(tfUserName, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfUserName);
             valUserName = new UserNameValidator(tfUserName);
 
@@ -439,19 +444,19 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridx = 0;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbRestrictToMyself = new JRadioButton(), gc);
+            add(rbRestrictToMyself, gc);
             rbRestrictToMyself.addItemListener(userRestrictionChangeHandler);
 
             gc.gridx = 1;
             gc.fill =  GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
-            add(lblRestrictedToMyself = new JMultilineLabel(tr("Only changesets owned by myself")), gc);
+            add(lblRestrictedToMyself, gc);
 
             gc.gridx = 0;
             gc.gridy = 1;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbRestrictToUid = new JRadioButton(), gc);
+            add(rbRestrictToUid, gc);
             rbRestrictToUid.addItemListener(userRestrictionChangeHandler);
 
             gc.gridx = 1;
@@ -469,7 +474,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridy = 3;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbRestrictToUserName = new JRadioButton(), gc);
+            add(rbRestrictToUserName, gc);
             rbRestrictToUserName.addItemListener(userRestrictionChangeHandler);
 
             gc.gridx = 1;
@@ -483,16 +488,11 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.weightx = 1.0;
             add(buildUserNameInputPanel(), gc);
 
-            bgUserRestrictions = new ButtonGroup();
             bgUserRestrictions.add(rbRestrictToMyself);
             bgUserRestrictions.add(rbRestrictToUid);
             bgUserRestrictions.add(rbRestrictToUserName);
         }
 
-        UserRestrictionPanel() {
-            build();
-        }
-
         public void startUserInput() {
             if (JosmUserIdentityManager.getInstance().isAnonymous()) {
                 lblRestrictedToMyself.setText(tr("Only changesets owned by myself (disabled. JOSM is currently run by an anonymous user)"));
@@ -636,21 +636,25 @@ public class AdvancedChangesetQueryPanel extends JPanel {
      */
     private static class TimeRestrictionPanel extends JPanel {
 
-        private JRadioButton rbClosedAfter;
-        private JRadioButton rbClosedAfterAndCreatedBefore;
-        private JosmTextField tfClosedAfterDate1;
+        private final JRadioButton rbClosedAfter = new JRadioButton();
+        private final JRadioButton rbClosedAfterAndCreatedBefore = new JRadioButton();
+        private final JosmTextField tfClosedAfterDate1 = new JosmTextField();
         private transient DateValidator valClosedAfterDate1;
-        private JosmTextField tfClosedAfterTime1;
+        private final JosmTextField tfClosedAfterTime1 = new JosmTextField();
         private transient TimeValidator valClosedAfterTime1;
-        private JosmTextField tfClosedAfterDate2;
+        private final JosmTextField tfClosedAfterDate2 = new JosmTextField();
         private transient DateValidator valClosedAfterDate2;
-        private JosmTextField tfClosedAfterTime2;
+        private final JosmTextField tfClosedAfterTime2 = new JosmTextField();
         private transient TimeValidator valClosedAfterTime2;
-        private JosmTextField tfCreatedBeforeDate;
+        private final JosmTextField tfCreatedBeforeDate = new JosmTextField();
         private transient DateValidator valCreatedBeforeDate;
-        private JosmTextField tfCreatedBeforeTime;
+        private final JosmTextField tfCreatedBeforeTime = new JosmTextField();
         private transient TimeValidator valCreatedBeforeTime;
 
+        TimeRestrictionPanel() {
+            build();
+        }
+
         protected JPanel buildClosedAfterInputPanel() {
             JPanel pnl = new JPanel(new GridBagLayout());
             GridBagConstraints gc = new GridBagConstraints();
@@ -661,7 +665,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 1;
             gc.weightx = 0.7;
-            pnl.add(tfClosedAfterDate1 = new JosmTextField(), gc);
+            pnl.add(tfClosedAfterDate1, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfClosedAfterDate1);
             valClosedAfterDate1 = DateValidator.decorate(tfClosedAfterDate1);
             tfClosedAfterDate1.setToolTipText(valClosedAfterDate1.getStandardTooltipTextAsHtml());
@@ -672,7 +676,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 3;
             gc.weightx = 0.3;
-            pnl.add(tfClosedAfterTime1 = new JosmTextField(), gc);
+            pnl.add(tfClosedAfterTime1, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfClosedAfterTime1);
             valClosedAfterTime1 = TimeValidator.decorate(tfClosedAfterTime1);
             tfClosedAfterTime1.setToolTipText(valClosedAfterTime1.getStandardTooltipTextAsHtml());
@@ -695,7 +699,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 2;
             gc.weightx = 0.7;
-            pnl.add(tfClosedAfterDate2 = new JosmTextField(), gc);
+            pnl.add(tfClosedAfterDate2, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfClosedAfterDate2);
             valClosedAfterDate2 = DateValidator.decorate(tfClosedAfterDate2);
             tfClosedAfterDate2.setToolTipText(valClosedAfterDate2.getStandardTooltipTextAsHtml());
@@ -705,7 +709,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 4;
             gc.weightx = 0.3;
-            pnl.add(tfClosedAfterTime2 = new JosmTextField(), gc);
+            pnl.add(tfClosedAfterTime2, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfClosedAfterTime2);
             valClosedAfterTime2 = TimeValidator.decorate(tfClosedAfterTime2);
             tfClosedAfterTime2.setToolTipText(valClosedAfterTime2.getStandardTooltipTextAsHtml());
@@ -725,7 +729,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 2;
             gc.weightx = 0.7;
-            pnl.add(tfCreatedBeforeDate = new JosmTextField(), gc);
+            pnl.add(tfCreatedBeforeDate, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfCreatedBeforeDate);
             valCreatedBeforeDate = DateValidator.decorate(tfCreatedBeforeDate);
             tfCreatedBeforeDate.setToolTipText(valCreatedBeforeDate.getStandardTooltipTextAsHtml());
@@ -736,7 +740,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
 
             gc.gridx = 4;
             gc.weightx = 0.3;
-            pnl.add(tfCreatedBeforeTime = new JosmTextField(), gc);
+            pnl.add(tfCreatedBeforeTime, gc);
             SelectAllOnFocusGainedDecorator.decorate(tfCreatedBeforeTime);
             valCreatedBeforeTime = TimeValidator.decorate(tfCreatedBeforeTime);
             tfCreatedBeforeTime.setToolTipText(valCreatedBeforeDate.getStandardTooltipTextAsHtml());
@@ -761,7 +765,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridx = 0;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbClosedAfter = new JRadioButton(), gc);
+            add(rbClosedAfter, gc);
 
             gc.gridx = 1;
             gc.fill = GridBagConstraints.HORIZONTAL;
@@ -782,7 +786,7 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             gc.gridx = 0;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 0.0;
-            add(rbClosedAfterAndCreatedBefore = new JRadioButton(), gc);
+            add(rbClosedAfterAndCreatedBefore, gc);
 
             gc.gridx = 1;
             gc.fill = GridBagConstraints.HORIZONTAL;
@@ -806,10 +810,6 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             rbClosedAfter.setSelected(true);
         }
 
-        TimeRestrictionPanel() {
-            build();
-        }
-
         public boolean isValidChangesetQuery() {
             if (rbClosedAfter.isSelected())
                 return valClosedAfterDate1.isValid() && valClosedAfterTime1.isValid();
@@ -863,7 +863,8 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         }
 
         public void displayMessageIfInvalid() {
-            if (isValidChangesetQuery()) return;
+            if (isValidChangesetQuery())
+                return;
             HelpAwareOptionPane.showOptionDialog(
                     this,
                     tr(
@@ -948,7 +949,8 @@ public class AdvancedChangesetQueryPanel extends JPanel {
         }
 
         public void displayMessageIfInvalid() {
-            if (isValidChangesetQuery()) return;
+            if (isValidChangesetQuery())
+                return;
             HelpAwareOptionPane.showOptionDialog(
                     this,
                     tr(
@@ -967,14 +969,14 @@ public class AdvancedChangesetQueryPanel extends JPanel {
      *
      */
     private static class UidInputFieldValidator extends AbstractTextComponentValidator {
-        public static UidInputFieldValidator decorate(JTextComponent tc) {
-            return new UidInputFieldValidator(tc);
-        }
-
         UidInputFieldValidator(JTextComponent tc) {
             super(tc);
         }
 
+        public static UidInputFieldValidator decorate(JTextComponent tc) {
+            return new UidInputFieldValidator(tc);
+        }
+
         @Override
         public boolean isValid() {
             return getUid() > 0;
@@ -1005,7 +1007,8 @@ public class AdvancedChangesetQueryPanel extends JPanel {
             if (value == null || value.trim().isEmpty()) return 0;
             try {
                 int uid = Integer.parseInt(value.trim());
-                if (uid > 0) return uid;
+                if (uid > 0)
+                    return uid;
                 return 0;
             } catch (NumberFormatException e) {
                 return 0;
@@ -1020,14 +1023,14 @@ public class AdvancedChangesetQueryPanel extends JPanel {
      * Dates can be entered in one of four standard formats defined for the current locale.
      */
     private static class DateValidator extends AbstractTextComponentValidator {
-        public static DateValidator decorate(JTextComponent tc) {
-            return new DateValidator(tc);
-        }
-
         DateValidator(JTextComponent tc) {
             super(tc);
         }
 
+        public static DateValidator decorate(JTextComponent tc) {
+            return new DateValidator(tc);
+        }
+
         @Override
         public boolean isValid() {
             return getDate() != null;
@@ -1087,17 +1090,18 @@ public class AdvancedChangesetQueryPanel extends JPanel {
      * Time values can be entered in one of four standard formats defined for the current locale.
      */
     private static class TimeValidator extends AbstractTextComponentValidator {
-        public static TimeValidator decorate(JTextComponent tc) {
-            return new TimeValidator(tc);
-        }
-
         TimeValidator(JTextComponent tc) {
             super(tc);
         }
 
+        public static TimeValidator decorate(JTextComponent tc) {
+            return new TimeValidator(tc);
+        }
+
         @Override
         public boolean isValid() {
-            if (getComponent().getText().trim().isEmpty()) return true;
+            if (getComponent().getText().trim().isEmpty())
+                return true;
             return getDate() != null;
         }
 
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 bce9ec3..18cea34 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanel.java
@@ -102,7 +102,8 @@ public class BasicChangesetQueryPanel extends JPanel {
         gc.insets = new Insets(5, 0, 3, 3);
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weightx = 1.0;
-        pnl.add(cbMyChangesetsOnly = new JCheckBox(tr("Download my changesets only")), gc);
+        cbMyChangesetsOnly = new JCheckBox(tr("Download my changesets only"));
+        pnl.add(cbMyChangesetsOnly, gc);
         cbMyChangesetsOnly.setToolTipText(
                 tr("<html>Select to restrict the query to your changesets only.<br>Unselect to include all changesets in the query.</html>"));
 
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 f25c2d9..dc45476 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
@@ -31,21 +31,30 @@ import org.openstreetmap.josm.tools.WindowGeometry;
 
 /**
  * This is a modal dialog for entering query criteria to search for changesets.
- *
+ * @since 2689
  */
 public class ChangesetQueryDialog extends JDialog {
 
     private JTabbedPane tpQueryPanels;
-    private BasicChangesetQueryPanel pnlBasicChangesetQueries;
-    private UrlBasedQueryPanel pnlUrlBasedQueries;
-    private AdvancedChangesetQueryPanel pnlAdvancedQueries;
+    private final BasicChangesetQueryPanel pnlBasicChangesetQueries = new BasicChangesetQueryPanel();
+    private final UrlBasedQueryPanel pnlUrlBasedQueries = new UrlBasedQueryPanel();
+    private final AdvancedChangesetQueryPanel pnlAdvancedQueries = new AdvancedChangesetQueryPanel();
     private boolean canceled;
 
+    /**
+     * Constructs a new {@code ChangesetQueryDialog}.
+     * @param parent parent window
+     */
+    public ChangesetQueryDialog(Window parent) {
+        super(parent, ModalityType.DOCUMENT_MODAL);
+        build();
+    }
+
     protected JPanel buildContentPanel() {
         tpQueryPanels = new JTabbedPane();
-        tpQueryPanels.add(pnlBasicChangesetQueries = new BasicChangesetQueryPanel());
-        tpQueryPanels.add(pnlUrlBasedQueries = new UrlBasedQueryPanel());
-        tpQueryPanels.add(pnlAdvancedQueries = new AdvancedChangesetQueryPanel());
+        tpQueryPanels.add(pnlBasicChangesetQueries);
+        tpQueryPanels.add(pnlUrlBasedQueries);
+        tpQueryPanels.add(pnlAdvancedQueries);
 
         tpQueryPanels.setTitleAt(0, tr("Basic"));
         tpQueryPanels.setToolTipTextAt(0, tr("Download changesets using predefined queries"));
@@ -93,11 +102,6 @@ public class ChangesetQueryDialog extends JDialog {
         addWindowListener(new WindowEventHandler());
     }
 
-    public ChangesetQueryDialog(Window parent) {
-        super(parent, ModalityType.DOCUMENT_MODAL);
-        build();
-    }
-
     public boolean isCanceled() {
         return canceled;
     }
@@ -183,7 +187,6 @@ public class ChangesetQueryDialog extends JDialog {
                         return;
                     }
                     break;
-
                 case 2:
                     if (getChangesetQuery() == null) {
                         pnlAdvancedQueries.displayMessageIfInvalid();
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 a35228f..964765e 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
@@ -30,8 +30,15 @@ import org.openstreetmap.josm.tools.ImageProvider;
 
 public class UrlBasedQueryPanel extends JPanel {
 
-    private JosmTextField tfUrl;
-    private JLabel lblValid;
+    private final JosmTextField tfUrl = new JosmTextField();
+    private final JLabel lblValid = new JLabel();
+
+    /**
+     * Constructs a new {@code UrlBasedQueryPanel}.
+     */
+    public UrlBasedQueryPanel() {
+        build();
+    }
 
     protected JPanel buildURLPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
@@ -44,7 +51,7 @@ public class UrlBasedQueryPanel extends JPanel {
         gc.gridx = 1;
         gc.weightx = 1.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(tfUrl = new JosmTextField(), gc);
+        pnl.add(tfUrl, gc);
         tfUrl.getDocument().addDocumentListener(new ChangetQueryUrlValidator());
         tfUrl.addFocusListener(
                 new FocusAdapter() {
@@ -58,7 +65,7 @@ public class UrlBasedQueryPanel extends JPanel {
         gc.gridx = 2;
         gc.weightx = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
-        pnl.add(lblValid = new JLabel(), gc);
+        pnl.add(lblValid, gc);
         lblValid.setPreferredSize(new Dimension(20, 20));
         return pnl;
     }
@@ -114,13 +121,6 @@ public class UrlBasedQueryPanel extends JPanel {
         add(new JPanel(), gc);
     }
 
-    /**
-     * Constructs a new {@code UrlBasedQueryPanel}.
-     */
-    public UrlBasedQueryPanel() {
-        build();
-    }
-
     protected boolean isValidChangesetQueryUrl(String text) {
         return buildChangesetQuery(text) != null;
     }
@@ -133,11 +133,11 @@ public class UrlBasedQueryPanel extends JPanel {
             return null;
         }
         String path = url.getPath();
-        String query = url.getQuery();
-        if (path == null || !path.endsWith("/changesets")) return null;
+        if (path == null || !path.endsWith("/changesets"))
+            return null;
 
         try {
-            return ChangesetQuery.buildFromUrlQuery(query);
+            return ChangesetQuery.buildFromUrlQuery(url.getQuery());
         } catch (ChangesetQueryUrlException e) {
             Main.warn(e.getMessage());
             return null;
@@ -169,14 +169,16 @@ public class UrlBasedQueryPanel extends JPanel {
         }
 
         protected void feedbackValid() {
-            if ("valid".equals(getCurrentFeedback())) return;
+            if ("valid".equals(getCurrentFeedback()))
+                return;
             lblValid.setIcon(ImageProvider.get("dialogs", "valid"));
             lblValid.setToolTipText(null);
             lblValid.putClientProperty("valid", "valid");
         }
 
         protected void feedbackInvalid() {
-            if ("invalid".equals(getCurrentFeedback())) return;
+            if ("invalid".equals(getCurrentFeedback()))
+                return;
             lblValid.setIcon(ImageProvider.get("warning-small"));
             lblValid.setToolTipText(tr("This changeset query URL is invalid"));
             lblValid.putClientProperty("valid", "invalid");
diff --git a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
index 1355831..d285ff8 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityAction.java
@@ -38,7 +38,7 @@ import org.openstreetmap.josm.tools.Utils;
  * @author Michael Zangl
  */
 public final class LayerVisibilityAction extends AbstractAction implements IEnabledStateUpdating, LayerAction {
-    protected static final int SLIDER_STEPS = 100;
+    private static final int SLIDER_STEPS = 100;
     private static final double MAX_SHARPNESS_FACTOR = 2;
     private static final double MAX_COLORFUL_FACTOR = 2;
     private final LayerListModel model;
@@ -298,7 +298,7 @@ public final class LayerVisibilityAction extends AbstractAction implements IEnab
 
         @Override
         public String toString() {
-            return "OpacitySlider [getRealValue()=" + getRealValue() + "]";
+            return "OpacitySlider [getRealValue()=" + getRealValue() + ']';
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
index cd50289..d3af238 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
@@ -15,6 +15,7 @@ import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
@@ -717,7 +718,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
         Collections.sort(sortedRelations, new Comparator<Relation>() {
             @Override
             public int compare(Relation o1, Relation o2) {
-                int comp = Boolean.valueOf(o1.isDisabledAndHidden()).compareTo(o2.isDisabledAndHidden());
+                int comp = Boolean.compare(o1.isDisabledAndHidden(), o2.isDisabledAndHidden());
                 return comp != 0 ? comp : DefaultNameFormatter.getInstance().getRelationComparator().compare(o1, o2);
             }
         });
@@ -1215,7 +1216,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
                                     }
                                 }
                             }
-                        } catch (Exception e) {
+                        } catch (URISyntaxException | IOException e) {
                             Main.error(e);
                         }
                     }
@@ -1228,7 +1229,7 @@ implements SelectionChangedListener, MapView.EditLayerChangeListener, DataSetLis
 
     class TaginfoAction extends JosmAction {
 
-        final StringProperty TAGINFO_URL_PROP = new StringProperty("taginfo.url", "https://taginfo.openstreetmap.org/");
+        final transient StringProperty TAGINFO_URL_PROP = new StringProperty("taginfo.url", "https://taginfo.openstreetmap.org/");
 
         TaginfoAction() {
             super(tr("Go to Taginfo"), "dialogs/taginfo", tr("Launch browser with Taginfo statistics for selected object"), null, false);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
index a926658..1d78ce6 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
@@ -811,13 +811,13 @@ public class TagEditHelper {
             List<String> lines = new ArrayList<>();
             Shortcut sc = Shortcut.findShortcut(KeyEvent.VK_1, commandDownMask);
             if (sc != null) {
-                lines.add(sc.getKeyText() + " " + tr("to apply first suggestion"));
+                lines.add(sc.getKeyText() + ' ' + tr("to apply first suggestion"));
             }
-            lines.add(KeyEvent.getKeyModifiersText(KeyEvent.SHIFT_MASK)+'+'+KeyEvent.getKeyText(KeyEvent.VK_ENTER) + " "
+            lines.add(KeyEvent.getKeyModifiersText(KeyEvent.SHIFT_MASK)+'+'+KeyEvent.getKeyText(KeyEvent.VK_ENTER) + ' '
                     +tr("to add without closing the dialog"));
             sc = Shortcut.findShortcut(KeyEvent.VK_1, commandDownMask | KeyEvent.SHIFT_DOWN_MASK);
             if (sc != null) {
-                lines.add(sc.getKeyText() + " " + tr("to add first suggestion without closing the dialog"));
+                lines.add(sc.getKeyText() + ' ' + tr("to add first suggestion without closing the dialog"));
             }
             final JLabel helpLabel = new JLabel("<html>" + Utils.join("<br>", lines) + "</html>");
             helpLabel.setFont(helpLabel.getFont().deriveFont(Font.PLAIN));
@@ -999,7 +999,7 @@ public class TagEditHelper {
         }
 
         class IgnoreTagAction extends AbstractAction {
-            final Tag tag;
+            final transient Tag tag;
 
             IgnoreTagAction(String name, Tag tag) {
                 super(name);
@@ -1009,8 +1009,10 @@ public class TagEditHelper {
             @Override
             public void actionPerformed(ActionEvent e) {
                 try {
-                    recentTags.ignoreTag(tag, tagsToIgnore);
-                    PROPERTY_TAGS_TO_IGNORE.put(tagsToIgnore.writeToString());
+                    if (tagsToIgnore != null) {
+                        recentTags.ignoreTag(tag, tagsToIgnore);
+                        PROPERTY_TAGS_TO_IGNORE.put(tagsToIgnore.writeToString());
+                    }
                 } catch (SearchCompiler.ParseError parseError) {
                     throw new IllegalStateException(parseError);
                 }
@@ -1089,7 +1091,8 @@ public class TagEditHelper {
         private void refreshRecentTags() {
             switch (PROPERTY_REFRESH_RECENT.get()) {
                 case REFRESH: cacheRecentTags(); // break missing intentionally
-                case STATUS: suggestRecentlyAddedTags();
+                case STATUS: suggestRecentlyAddedTags(); break;
+                default: // Do nothing
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
index 36fe715..7d37a89 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java
@@ -425,7 +425,7 @@ public class ChildRelationBrowser extends JPanel {
                         Main.map.repaint();
                     }
                 });
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (canceled) {
                     Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                     return;
@@ -474,7 +474,7 @@ public class ChildRelationBrowser extends JPanel {
                     mergeDataSet(dataSet);
                     refreshView(r);
                 }
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (canceled) {
                     Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                     return;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java b/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java
index b1387ab..e9a00e6 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationMemberTask.java
@@ -142,7 +142,7 @@ public class DownloadRelationMemberTask extends PleaseWaitRunnable {
                     }
             );
 
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled) {
                 Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                 return;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java b/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java
index 54096eb..8657874 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/DownloadRelationTask.java
@@ -4,6 +4,7 @@ package org.openstreetmap.josm.gui.dialogs.relation;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 
 import javax.swing.SwingUtilities;
@@ -106,7 +107,7 @@ public class DownloadRelationTask extends PleaseWaitRunnable {
                         }
                     }
             );
-        } catch (Exception e) {
+        } catch (OsmTransferException | InvocationTargetException | InterruptedException e) {
             if (canceled) {
                 Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                 return;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
index 2d7b026..08954fc 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
@@ -819,6 +819,7 @@ public class GenericRelationEditor extends RelationEditor  {
             case JOptionPane.YES_OPTION:
                 memberTableModel.removeMembersReferringTo(toCheck);
                 break;
+            default: // Do nothing
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
index ac15b28..43162f8 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
@@ -32,7 +32,7 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
             return this;
 
         this.value = (WayConnectionType) value;
-        setToolTipText(((WayConnectionType) value).getToolTip());
+        setToolTipText(((WayConnectionType) value).getTooltip());
         renderBackgroundForeground(getModel(table), null, isSelected);
         return this;
     }
@@ -156,7 +156,7 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
         g.drawLine(xoff+xowloop, y1, xoff+xowloop, y2);
 
         /* special icons */
-        Image arrow = null;
+        Image arrow;
         switch (value.direction) {
         case FORWARD:
             arrow = arrowDown;
@@ -164,6 +164,8 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
         case BACKWARD:
             arrow = arrowUp;
             break;
+        default:
+            arrow = null;
         }
         if (value.direction == Direction.ROUNDABOUT_LEFT) {
             g.drawImage(roundabout_left, xoff-6, 1, null);
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
index 653911c..99fef5f 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
@@ -53,7 +53,7 @@ class MemberTransferHandler extends TransferHandler {
             } else if (support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA)) {
                 importPrimitiveData(support, destination, insertRow);
             }
-        } catch (Exception e) {
+        } catch (IOException | UnsupportedFlavorException e) {
             Main.warn(e);
             return false;
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
index 57443ff..834f849 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java
@@ -187,7 +187,7 @@ public class ParentRelationLoadingTask extends PleaseWaitRunnable {
                                 JOptionPane.WARNING_MESSAGE
                 );
             }
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled) {
                 Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                 return;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java b/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
index 66b313c..6de8867 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
@@ -38,10 +38,21 @@ public class ReferringRelationsBrowser extends JPanel {
     private JList<Relation> referrers;
     private final ReferringRelationsBrowserModel model;
     private final transient OsmDataLayer layer;
-    private JCheckBox cbReadFull;
+    private final JCheckBox cbReadFull = new JCheckBox(tr("including immediate children of parent relations"));
     private EditAction editAction;
 
     /**
+     * Constructs a new {@code ReferringRelationsBrowser}.
+     * @param layer OSM data layer
+     * @param model referrinf relations browser model
+     */
+    public ReferringRelationsBrowser(OsmDataLayer layer, ReferringRelationsBrowserModel model) {
+        this.model = model;
+        this.layer = layer;
+        build();
+    }
+
+    /**
      * build the GUI
      */
     protected void build() {
@@ -57,7 +68,7 @@ public class ReferringRelationsBrowser extends JPanel {
         ReloadAction reloadAction = new ReloadAction();
         referrers.getModel().addListDataListener(reloadAction);
         pnl.add(new SideButton(reloadAction));
-        pnl.add(cbReadFull = new JCheckBox(tr("including immediate children of parent relations")));
+        pnl.add(cbReadFull);
 
         editAction = new EditAction();
         referrers.getSelectionModel().addListSelectionListener(editAction);
@@ -65,12 +76,6 @@ public class ReferringRelationsBrowser extends JPanel {
         add(pnl, BorderLayout.SOUTH);
     }
 
-    public ReferringRelationsBrowser(OsmDataLayer layer, ReferringRelationsBrowserModel model) {
-        this.model = model;
-        this.layer = layer;
-        build();
-    }
-
     public void init() {
         model.populate(getLayer().data);
     }
@@ -156,9 +161,11 @@ public class ReferringRelationsBrowser extends JPanel {
 
         public void run() {
             int idx = referrers.getSelectedIndex();
-            if (idx < 0) return;
+            if (idx < 0)
+                return;
             Relation r = model.getElementAt(idx);
-            if (r == null) return;
+            if (r == null)
+                return;
             RelationEditor editor = RelationEditor.getEditor(getLayer(), r, null);
             editor.setVisible(true);
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
index 21308a0..615b77d 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
@@ -105,7 +105,7 @@ public abstract class RelationEditor extends ExtendedDialog implements IRelation
                 if (canEdit) {
                     return e.getConstructor(Relation.class, Collection.class).newInstance(layer, r, selectedMembers);
                 }
-            } catch (Exception ex) {
+            } catch (ReflectiveOperationException ex) {
                 Main.warn(ex);
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
index a030330..2ad69c4 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java
@@ -156,7 +156,7 @@ public class RelationTree extends JTree {
                 OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.from(relation), true);
                 ds = reader.parseOsm(progressMonitor
                         .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
-            } catch (Exception e) {
+            } catch (OsmTransferException e) {
                 if (canceled) {
                     Main.warn(tr("Ignoring exception because task was canceled. Exception: {0}", e.toString()));
                     return;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
index d3dd76f..ec04ba2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorter.java
@@ -153,7 +153,8 @@ public class RelationSorter {
                     List<RelationMember> list;
                     list = customMap.get(sorter);
                     if (list == null) {
-                        customMap.put(sorter, list = new LinkedList<>());
+                        list = new LinkedList<>();
+                        customMap.put(sorter, list);
                     }
                     list.add(m);
                     wasAdded = true;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
index 313655a..47a6f71 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
@@ -72,7 +72,12 @@ public class WayConnectionType {
                 ";OH " + isOnewayHead+";OT " + isOnewayTail+']';
     }
 
-    public String getToolTip() {
+    /**
+     * Returns tooltip.
+     * @return tooltip
+     * @since 10248
+     */
+    public String getTooltip() {
         if (!isValid())
             return "";
         else if (linkPrev && linkNext)
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
index 1ee7def..c4b4627 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
@@ -231,9 +231,7 @@ public class WayConnectionTypeCalculator {
      * @return direction of way {@code k}
      */
     private Direction determineDirection(int refI, final Direction refDirection, int k, boolean reversed) {
-        if (refI < 0 || k < 0 || refI >= members.size() || k >= members.size())
-            return NONE;
-        if (refDirection == NONE)
+        if (members == null || refI < 0 || k < 0 || refI >= members.size() || k >= members.size() || refDirection == NONE)
             return NONE;
 
         final RelationMember mRef = members.get(refI);
@@ -265,6 +263,7 @@ public class WayConnectionTypeCalculator {
         case ROUNDABOUT_RIGHT:
             refNodes = wayRef.getNodes();
             break;
+        default: // Do nothing
         }
 
         for (Node n : refNodes) {
diff --git a/src/org/openstreetmap/josm/gui/download/BookmarkList.java b/src/org/openstreetmap/josm/gui/download/BookmarkList.java
index 44f6cb4..1e6ee0e 100644
--- a/src/org/openstreetmap/josm/gui/download/BookmarkList.java
+++ b/src/org/openstreetmap/josm/gui/download/BookmarkList.java
@@ -146,7 +146,7 @@ public class BookmarkList extends JList<BookmarkList.Bookmark> {
             for (Collection<String> entry : args) {
                 try {
                     bookmarks.add(new Bookmark(entry));
-                } catch (Exception e) {
+                } catch (IllegalArgumentException e) {
                     Main.error(tr("Error reading bookmark entry: %s", e.getMessage()));
                 }
             }
diff --git a/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java b/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
index 5f4173d..c79ad38 100644
--- a/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
@@ -46,10 +46,10 @@ public class BookmarkSelection implements DownloadSelection {
     private DownloadDialog parent;
 
     /** displays information about the current download area */
-    private JMultilineLabel lblCurrentDownloadArea;
+    private final JMultilineLabel lblCurrentDownloadArea = new JMultilineLabel("");
     private final JosmTextArea bboxDisplay = new JosmTextArea();
     /** the add action */
-    private AddAction actAdd;
+    private final AddAction actAdd = new AddAction();
 
     /**
      * Creates the panel with the action buttons on the left
@@ -83,7 +83,7 @@ public class BookmarkSelection implements DownloadSelection {
         GridBagConstraints  gc = new GridBagConstraints();
         gc.anchor = GridBagConstraints.NORTHWEST;
         gc.insets = new Insets(5, 5, 5, 5);
-        pnl.add(lblCurrentDownloadArea = new JMultilineLabel(""), gc);
+        pnl.add(lblCurrentDownloadArea, gc);
 
         gc.weightx = 1.0;
         gc.weighty = 1.0;
@@ -97,7 +97,7 @@ public class BookmarkSelection implements DownloadSelection {
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         gc.insets = new Insets(5, 5, 5, 5);
-        pnl.add(new JButton(actAdd = new AddAction()), gc);
+        pnl.add(new JButton(actAdd), gc);
         return pnl;
     }
 
@@ -162,7 +162,8 @@ public class BookmarkSelection implements DownloadSelection {
      */
     @Override
     public void setDownloadArea(Bounds area) {
-        if (area == null) return;
+        if (area == null)
+            return;
         this.currentArea = area;
         bookmarks.clearSelection();
         updateDownloadAreaLabel();
diff --git a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
index 2e1ebad..b8eb0f5 100644
--- a/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
+++ b/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
@@ -82,8 +82,8 @@ public class DownloadDialog extends JDialog  {
     protected JCheckBox cbDownloadGpxData;
     protected JCheckBox cbDownloadNotes;
     /** the download action and button */
-    private DownloadAction actDownload;
-    protected SideButton btnDownload;
+    private final DownloadAction actDownload = new DownloadAction();
+    protected final SideButton btnDownload = new SideButton(actDownload);
 
     private void makeCheckBoxRespondToEnter(JCheckBox cb) {
         cb.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "doDownload");
@@ -143,7 +143,7 @@ public class DownloadDialog extends JDialog  {
 
         try {
             tpDownloadAreaSelectors.setSelectedIndex(Main.pref.getInteger("download.tab", 0));
-        } catch (Exception ex) {
+        } catch (IndexOutOfBoundsException ex) {
             Main.pref.putInteger("download.tab", 0);
         }
 
@@ -189,7 +189,7 @@ public class DownloadDialog extends JDialog  {
         JPanel pnl = new JPanel(new FlowLayout());
 
         // -- download button
-        pnl.add(btnDownload = new SideButton(actDownload = new DownloadAction()));
+        pnl.add(btnDownload);
         InputMapUtils.enableEnter(btnDownload);
 
         makeCheckBoxRespondToEnter(cbDownloadGpxData);
@@ -200,7 +200,8 @@ public class DownloadDialog extends JDialog  {
         // -- cancel button
         SideButton btnCancel;
         CancelAction actCancel = new CancelAction();
-        pnl.add(btnCancel = new SideButton(actCancel));
+        btnCancel = new SideButton(actCancel);
+        pnl.add(btnCancel);
         InputMapUtils.enableEnter(btnCancel);
 
         // -- cancel on ESC
@@ -208,8 +209,8 @@ public class DownloadDialog extends JDialog  {
         getRootPane().getActionMap().put("cancel", actCancel);
 
         // -- help button
-        SideButton btnHelp;
-        pnl.add(btnHelp = new SideButton(new ContextSensitiveHelpAction(getRootPane().getClientProperty("help").toString())));
+        SideButton btnHelp = new SideButton(new ContextSensitiveHelpAction(getRootPane().getClientProperty("help").toString()));
+        pnl.add(btnHelp);
         InputMapUtils.enableEnter(btnHelp);
 
         return pnl;
@@ -476,6 +477,7 @@ public class DownloadDialog extends JDialog  {
     }
 
     protected void buildMainPanelAboveDownloadSelections(JPanel pnl) {
+        // Do nothing
     }
 
     class CancelAction extends AbstractAction {
diff --git a/src/org/openstreetmap/josm/gui/download/PlaceSelection.java b/src/org/openstreetmap/josm/gui/download/PlaceSelection.java
index 66799df..ca1941c 100644
--- a/src/org/openstreetmap/josm/gui/download/PlaceSelection.java
+++ b/src/org/openstreetmap/josm/gui/download/PlaceSelection.java
@@ -40,6 +40,7 @@ import javax.swing.table.DefaultTableColumnModel;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
+import javax.xml.parsers.ParserConfigurationException;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
@@ -395,7 +396,7 @@ public class PlaceSelection implements DownloadSelection {
                         }
                     });
                 }
-            } catch (Exception e) {
+            } catch (IOException | ParserConfigurationException e) {
                 if (!canceled) {
                     OsmTransferException ex = new OsmTransferException(e);
                     ex.setUrl(urlString);
@@ -580,6 +581,7 @@ public class PlaceSelection implements DownloadSelection {
                     setText(sr.zoom != 0 ? Integer.toString(sr.zoom) : tr("unknown"));
                 }
                 break;
+            default: // Do nothing
             }
             setToolTipText(lineWrapDescription(sr.description));
             return this;
diff --git a/src/org/openstreetmap/josm/gui/help/HelpBrowser.java b/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
index e47e1a0..5d882cd 100644
--- a/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
+++ b/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
@@ -15,12 +15,11 @@ import java.awt.event.KeyEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.StringReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Locale;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
 import javax.swing.JButton;
@@ -34,6 +33,8 @@ import javax.swing.JSeparator;
 import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
 import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 import javax.swing.text.AttributeSet;
@@ -154,7 +155,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
                 css.append(line);
                 css.append('\n');
             }
-        } catch (Exception e) {
+        } catch (IOException e) {
             Main.error(tr("Failed to read CSS file ''help-browser.css''. Exception is: {0}", e.toString()));
             Main.error(e);
             return ss;
@@ -238,7 +239,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
         Document document = help.getEditorKit().createDefaultDocument();
         try {
             help.getEditorKit().read(new StringReader(content), document, 0);
-        } catch (Exception e) {
+        } catch (IOException | BadLocationException e) {
             Main.error(e);
         }
         help.setDocument(document);
@@ -375,7 +376,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
                 loadTopic(content);
                 history.setCurrentUrl(url);
                 this.url = url;
-            } catch (Exception e) {
+            } catch (HelpContentReaderException e) {
                 Main.warn(e);
                 HelpAwareOptionPane.showOptionDialog(
                         Main.parent,
@@ -494,7 +495,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
         }
     }
 
-    static class BackAction extends AbstractBrowserAction implements Observer {
+    static class BackAction extends AbstractBrowserAction implements ChangeListener {
 
         /**
          * Constructs a new {@code BackAction}.
@@ -502,7 +503,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
          */
         BackAction(IHelpBrowser browser) {
             super(browser);
-            browser.getHistory().addObserver(this);
+            browser.getHistory().addChangeListener(this);
             putValue(SHORT_DESCRIPTION, tr("Go to the previous page"));
             putValue(SMALL_ICON, ImageProvider.get("help", "previous"));
             setEnabled(browser.getHistory().canGoBack());
@@ -514,12 +515,12 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(browser.getHistory().canGoBack());
         }
     }
 
-    static class ForwardAction extends AbstractBrowserAction implements Observer {
+    static class ForwardAction extends AbstractBrowserAction implements ChangeListener {
 
         /**
          * Constructs a new {@code ForwardAction}.
@@ -527,7 +528,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
          */
         ForwardAction(IHelpBrowser browser) {
             super(browser);
-            browser.getHistory().addObserver(this);
+            browser.getHistory().addChangeListener(this);
             putValue(SHORT_DESCRIPTION, tr("Go to the next page"));
             putValue(SMALL_ICON, ImageProvider.get("help", "next"));
             setEnabled(browser.getHistory().canGoForward());
@@ -539,7 +540,7 @@ public class HelpBrowser extends JDialog implements IHelpBrowser {
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             setEnabled(browser.getHistory().canGoForward());
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java b/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java
index 7c50114..4fcc06b 100644
--- a/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java
+++ b/src/org/openstreetmap/josm/gui/help/HelpBrowserHistory.java
@@ -4,13 +4,14 @@ package org.openstreetmap.josm.gui.help;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Observable;
+
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 
 /**
  * Help browser history.
  * @since 2274
  */
-public class HelpBrowserHistory extends Observable {
+public class HelpBrowserHistory extends ChangeNotifier {
     private final IHelpBrowser browser;
     private List<String> history;
     private int historyPos;
@@ -30,8 +31,7 @@ public class HelpBrowserHistory extends Observable {
     public void clear() {
         history.clear();
         historyPos = 0;
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -59,8 +59,7 @@ public class HelpBrowserHistory extends Observable {
             return;
         String url = history.get(historyPos);
         browser.openUrl(url);
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -72,8 +71,7 @@ public class HelpBrowserHistory extends Observable {
             return;
         String url = history.get(historyPos);
         browser.openUrl(url);
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -98,7 +96,6 @@ public class HelpBrowserHistory extends Observable {
             history.add(url);
             historyPos = history.size()-1;
         }
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java b/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
index 51acde3..63b5ae4 100644
--- a/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
+++ b/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
@@ -6,13 +6,13 @@ import java.awt.Color;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.BorderFactory;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.gui.jmapviewer.JMapViewer;
 import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
@@ -82,7 +82,8 @@ public class CoordinateInfoViewer extends JPanel {
         gc.weighty = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.NORTHWEST;
-        add(referenceLatLonViewer = new LatLonViewer(model, PointInTimeType.REFERENCE_POINT_IN_TIME), gc);
+        referenceLatLonViewer = new LatLonViewer(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+        add(referenceLatLonViewer, gc);
 
         gc.gridx = 1;
         gc.gridy = 1;
@@ -90,7 +91,8 @@ public class CoordinateInfoViewer extends JPanel {
         gc.weighty = 0.0;
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.NORTHWEST;
-        add(currentLatLonViewer = new LatLonViewer(model, PointInTimeType.CURRENT_POINT_IN_TIME), gc);
+        currentLatLonViewer = new LatLonViewer(model, PointInTimeType.CURRENT_POINT_IN_TIME);
+        add(currentLatLonViewer, gc);
 
         // --------------------
         // the distance panel
@@ -100,7 +102,8 @@ public class CoordinateInfoViewer extends JPanel {
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weightx = 1.0;
         gc.weighty = 0.0;
-        add(distanceViewer = new DistanceViewer(model), gc);
+        distanceViewer = new DistanceViewer(model);
+        add(distanceViewer, gc);
 
         // the map panel
         gc.gridx = 0;
@@ -109,7 +112,8 @@ public class CoordinateInfoViewer extends JPanel {
         gc.fill = GridBagConstraints.BOTH;
         gc.weightx = 1.0;
         gc.weighty = 1.0;
-        add(mapViewer = new MapViewer(model), gc);
+        mapViewer = new MapViewer(model);
+        add(mapViewer, gc);
         mapViewer.setZoomContolsVisible(false);
     }
 
@@ -122,48 +126,48 @@ public class CoordinateInfoViewer extends JPanel {
         CheckParameterUtil.ensureParameterNotNull(model, "model");
         setModel(model);
         build();
-        registerAsObserver(model);
+        registerAsChangeListener(model);
     }
 
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
+    protected void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
+            model.removeChangeListener(referenceInfoPanel);
         }
         if (currentLatLonViewer != null) {
-            model.deleteObserver(currentLatLonViewer);
+            model.removeChangeListener(currentLatLonViewer);
         }
         if (referenceLatLonViewer != null) {
-            model.deleteObserver(referenceLatLonViewer);
+            model.removeChangeListener(referenceLatLonViewer);
         }
         if (distanceViewer != null) {
-            model.deleteObserver(distanceViewer);
+            model.removeChangeListener(distanceViewer);
         }
         if (mapViewer != null) {
-            model.deleteObserver(mapViewer);
+            model.removeChangeListener(mapViewer);
         }
     }
 
-    protected void registerAsObserver(HistoryBrowserModel model) {
+    protected void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
         if (currentLatLonViewer != null) {
-            model.addObserver(currentLatLonViewer);
+            model.addChangeListener(currentLatLonViewer);
         }
         if (referenceLatLonViewer != null) {
-            model.addObserver(referenceLatLonViewer);
+            model.addChangeListener(referenceLatLonViewer);
         }
         if (distanceViewer != null) {
-            model.addObserver(distanceViewer);
+            model.addChangeListener(distanceViewer);
         }
         if (mapViewer != null) {
-            model.addObserver(mapViewer);
+            model.addChangeListener(mapViewer);
         }
     }
 
@@ -174,11 +178,11 @@ public class CoordinateInfoViewer extends JPanel {
      */
     public void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
 
@@ -236,11 +240,11 @@ public class CoordinateInfoViewer extends JPanel {
     /**
      * A UI widgets which displays the Lan/Lon-coordinates of a {@link HistoryNode}.
      */
-    private static class LatLonViewer extends JPanel implements Observer {
+    private static class LatLonViewer extends JPanel implements ChangeListener {
 
         private final JosmTextArea lblLat = newTextArea();
         private final JosmTextArea lblLon = newTextArea();
-        private final Updater updater;
+        private final transient Updater updater;
         private final Color modifiedColor;
 
         protected void build() {
@@ -319,14 +323,14 @@ public class CoordinateInfoViewer extends JPanel {
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             refresh();
         }
     }
 
-    private static class MapViewer extends JMapViewer implements Observer {
+    private static class MapViewer extends JMapViewer implements ChangeListener {
 
-        private final Updater updater;
+        private final transient Updater updater;
 
         MapViewer(HistoryBrowserModel model) {
             this.updater = new Updater(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
@@ -334,7 +338,7 @@ public class CoordinateInfoViewer extends JPanel {
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             final Pair<LatLon, LatLon> coordinates = updater.getCoordinates();
             if (coordinates == null) {
                 return;
@@ -357,10 +361,10 @@ public class CoordinateInfoViewer extends JPanel {
         }
     }
 
-    private static class DistanceViewer extends JPanel implements Observer {
+    private static class DistanceViewer extends JPanel implements ChangeListener {
 
         private final JosmTextArea lblDistance = newTextArea();
-        private final Updater updater;
+        private final transient Updater updater;
 
         DistanceViewer(HistoryBrowserModel model) {
             this.updater = new Updater(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
@@ -412,7 +416,7 @@ public class CoordinateInfoViewer extends JPanel {
         }
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             refresh();
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java
index 077a3d8..2baea5b 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java
@@ -33,15 +33,30 @@ public class HistoryBrowser extends JPanel {
     private JTabbedPane tpViewers;
 
     /**
+     * Constructs a new {@code HistoryBrowser}.
+     */
+    public HistoryBrowser() {
+        model = new HistoryBrowserModel();
+        build();
+    }
+
+    /**
+     * Constructs a new {@code HistoryBrowser}.
+     * @param history the history of an {@link OsmPrimitive}
+     */
+    public HistoryBrowser(History history) {
+        this();
+        populate(history);
+    }
+
+    /**
      * creates the table which shows the list of versions
      *
      * @return  the panel with the version table
      */
     protected JPanel createVersionTablePanel() {
         JPanel pnl = new JPanel(new BorderLayout());
-
-        VersionTable versionTable = new VersionTable(model);
-        pnl.add(new JScrollPane(versionTable), BorderLayout.CENTER);
+        pnl.add(new JScrollPane(new VersionTable(model)), BorderLayout.CENTER);
         return pnl;
     }
 
@@ -81,14 +96,10 @@ public class HistoryBrowser extends JPanel {
      * builds the GUI
      */
     protected void build() {
-        JPanel left;
-        JPanel right;
+        JPanel left = createVersionTablePanel();
+        JPanel right = createVersionComparePanel();
         setLayout(new BorderLayout());
-        JSplitPane pane = new JSplitPane(
-                JSplitPane.HORIZONTAL_SPLIT,
-                left = createVersionTablePanel(),
-                right = createVersionComparePanel()
-        );
+        JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
         add(pane, BorderLayout.CENTER);
 
         pane.setOneTouchExpandable(true);
@@ -99,22 +110,6 @@ public class HistoryBrowser extends JPanel {
         right.setMinimumSize(minimumSize);
     }
 
-    /**
-     * constructor
-     */
-    public HistoryBrowser() {
-        model = new HistoryBrowserModel();
-        build();
-    }
-
-    /**
-     * constructor
-     * @param history  the history of an {@link OsmPrimitive}
-     */
-    public HistoryBrowser(History history) {
-        this();
-        populate(history);
-    }
 
     /**
      * populates the browser with the history of a specific {@link OsmPrimitive}
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
index 71cc67c..1aae5c4 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
@@ -152,10 +152,14 @@ public final class HistoryBrowserDialogManager implements MapView.LayerChangeLis
     /* LayerChangeListener                                                           */
     /* ----------------------------------------------------------------------------- */
     @Override
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {}
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        // Do nothing
+    }
 
     @Override
-    public void layerAdded(Layer newLayer) {}
+    public void layerAdded(Layer newLayer) {
+        // Do nothing
+    }
 
     @Override
     public void layerRemoved(Layer oldLayer) {
@@ -206,7 +210,7 @@ public final class HistoryBrowserDialogManager implements MapView.LayerChangeLis
                             }
                         });
                     }
-                } catch (final Exception e) {
+                } catch (final RuntimeException e) {
                     BugReportExceptionHandler.handleException(e);
                 }
             }
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
index 353bca4..ac6329f 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
@@ -8,7 +8,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Observable;
 import java.util.Set;
 
 import javax.swing.JTable;
@@ -45,6 +44,7 @@ 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.OsmDataLayer;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -73,7 +73,7 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  *
  * @see HistoryBrowser
  */
-public class HistoryBrowserModel extends Observable implements LayerChangeListener, DataSetListener {
+public class HistoryBrowserModel extends ChangeNotifier implements LayerChangeListener, DataSetListener {
     /** the history of an OsmPrimitive */
     private History history;
     private HistoryOsmPrimitive reference;
@@ -134,17 +134,20 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
     }
 
     protected boolean canShowAsLatest(OsmPrimitive primitive) {
-        if (primitive == null) return false;
-        if (primitive.isNew() || !primitive.isUsable()) return false;
+        if (primitive == null)
+            return false;
+        if (primitive.isNew() || !primitive.isUsable())
+            return false;
 
         //try creating a history primitive. if that fails, the primitive cannot be used.
         try {
             HistoryOsmPrimitive.forOsmPrimitive(primitive);
-        } catch (Exception ign) {
+        } catch (IllegalArgumentException ign) {
             return false;
         }
 
-        if (history == null) return false;
+        if (history == null)
+            return false;
         // only show latest of the same version if it is modified
         if (history.getByVersion(primitive.getVersion()) != null)
             return primitive.isModified();
@@ -194,8 +197,7 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
     protected void fireModelChange() {
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
         versionTableModel.fireTableDataChanged();
     }
 
@@ -313,8 +315,7 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
         initTagTableModels();
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -344,8 +345,7 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
         initTagTableModels();
         initNodeListTableModels();
         initMemberListTableModels();
-        setChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -393,7 +393,8 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
      * @return true if <code>primitive</code> is the latest primitive
      */
     public boolean isLatest(HistoryOsmPrimitive primitive) {
-        if (primitive == null) return false;
+        if (primitive == null)
+            return false;
         return primitive == latest;
     }
 
@@ -445,7 +446,8 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
 
         @Override
         public void setValueAt(Object aValue, int row, int column) {
-            if (!((Boolean) aValue)) return;
+            if (!((Boolean) aValue))
+                return;
             switch (column) {
             case 1:
                 setReferencePointInTime(row);
@@ -465,45 +467,53 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
         }
 
         public void setReferencePointInTime(int row) {
-            if (history == null) return;
+            if (history == null)
+                return;
             if (row == history.getNumVersions()) {
                 if (latest != null) {
                     HistoryBrowserModel.this.setReferencePointInTime(latest);
                 }
                 return;
             }
-            if (row < 0 || row > history.getNumVersions()) return;
+            if (row < 0 || row > history.getNumVersions())
+                return;
             HistoryOsmPrimitive reference = history.get(row);
             HistoryBrowserModel.this.setReferencePointInTime(reference);
         }
 
         public void setCurrentPointInTime(int row) {
-            if (history == null) return;
+            if (history == null)
+                return;
             if (row == history.getNumVersions()) {
                 if (latest != null) {
                     HistoryBrowserModel.this.setCurrentPointInTime(latest);
                 }
                 return;
             }
-            if (row < 0 || row > history.getNumVersions()) return;
+            if (row < 0 || row > history.getNumVersions())
+                return;
             HistoryOsmPrimitive current = history.get(row);
             HistoryBrowserModel.this.setCurrentPointInTime(current);
         }
 
         public boolean isReferencePointInTime(int row) {
-            if (history == null) return false;
+            if (history == null)
+                return false;
             if (row == history.getNumVersions())
                 return latest == reference;
-            if (row < 0 || row > history.getNumVersions()) return false;
+            if (row < 0 || row > history.getNumVersions())
+                return false;
             HistoryOsmPrimitive p = history.get(row);
             return p == reference;
         }
 
         public boolean isCurrentPointInTime(int row) {
-            if (history == null) return false;
+            if (history == null)
+                return false;
             if (row == history.getNumVersions())
                 return latest == current;
-            if (row < 0 || row > history.getNumVersions()) return false;
+            if (row < 0 || row > history.getNumVersions())
+                return false;
             HistoryOsmPrimitive p = history.get(row);
             return p == current;
         }
@@ -519,9 +529,11 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
         }
 
         public OsmPrimitive getLatest() {
-            if (latest == null) return null;
+            if (latest == null)
+                return null;
             OsmDataLayer editLayer = Main.main.getEditLayer();
-            if (editLayer == null) return null;
+            if (editLayer == null)
+                return null;
             return editLayer.data.getPrimitiveById(latest.getId(), latest.getType());
         }
 
@@ -541,6 +553,11 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
         private List<String> keys;
         private final PointInTimeType pointInTimeType;
 
+        protected TagTableModel(PointInTimeType type) {
+            pointInTimeType = type;
+            initKeyList();
+        }
+
         protected void initKeyList() {
             Set<String> keySet = new HashSet<>();
             if (current != null) {
@@ -554,14 +571,10 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
             fireTableDataChanged();
         }
 
-        protected TagTableModel(PointInTimeType type) {
-            pointInTimeType = type;
-            initKeyList();
-        }
-
         @Override
         public int getRowCount() {
-            if (keys == null) return 0;
+            if (keys == null)
+                return 0;
             return keys.size();
         }
 
@@ -760,10 +773,14 @@ public class HistoryBrowserModel extends Observable implements LayerChangeListen
     }
 
     @Override
-    public void layerAdded(Layer newLayer) {}
+    public void layerAdded(Layer newLayer) {
+        // Do nothing
+    }
 
     @Override
-    public void layerRemoved(Layer oldLayer) {}
+    public void layerRemoved(Layer oldLayer) {
+        // Do nothing
+    }
 
     /**
      * Creates a {@link HistoryOsmPrimitive} from a {@link OsmPrimitive}
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java b/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
index 788e6a5..bb54ea0 100644
--- a/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
+++ b/src/org/openstreetmap/josm/gui/history/HistoryViewerPanel.java
@@ -40,29 +40,29 @@ public abstract class HistoryViewerPanel extends JPanel {
      */
     public final void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
 
-    protected final void unregisterAsObserver(HistoryBrowserModel model) {
+    protected final void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
+            model.removeChangeListener(referenceInfoPanel);
         }
     }
 
-    protected final void registerAsObserver(HistoryBrowserModel model) {
+    protected final void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/history/NodeListViewer.java b/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
index df15730..06e7562 100644
--- a/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
+++ b/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
@@ -172,21 +172,21 @@ public class NodeListViewer extends JPanel {
         add(embeddInScrollPane(buildCurrentNodeListTable()), gc);
     }
 
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
+    protected void unregisterAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
+            model.removeChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
+            model.removeChangeListener(referenceInfoPanel);
         }
     }
 
-    protected void registerAsObserver(HistoryBrowserModel model) {
+    protected void registerAsChangeListener(HistoryBrowserModel model) {
         if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
+            model.addChangeListener(currentInfoPanel);
         }
         if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
+            model.addChangeListener(referenceInfoPanel);
         }
     }
 
@@ -196,11 +196,11 @@ public class NodeListViewer extends JPanel {
      */
     public void setModel(HistoryBrowserModel model) {
         if (this.model != null) {
-            unregisterAsObserver(model);
+            unregisterAsChangeListener(model);
         }
         this.model = model;
         if (this.model != null) {
-            registerAsObserver(model);
+            registerAsChangeListener(model);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java b/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java
index 8bc0b50..2096bca 100644
--- a/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/history/RelationMemberListTableCellRenderer.java
@@ -3,7 +3,6 @@ package org.openstreetmap.josm.gui.history;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Color;
 import java.awt.Component;
 import java.util.EnumMap;
 import java.util.Map;
@@ -47,30 +46,27 @@ public class RelationMemberListTableCellRenderer extends JLabel implements Table
     }
 
     protected void renderRole(Item diffItem) {
-        String text = "";
-        Color bgColor = diffItem.state.getColor();
         RelationMemberData member = (RelationMemberData) diffItem.value;
-        text = member == null ? "" : member.getRole();
+        String text = member == null ? "" : member.getRole();
         setText(text);
         setToolTipText(text);
-        GuiHelper.setBackgroundReadable(this, bgColor);
+        GuiHelper.setBackgroundReadable(this, diffItem.state.getColor());
     }
 
     protected void renderPrimitive(Item diffItem) {
         String text = "";
-        Color bgColor = diffItem.state.getColor();
         RelationMemberData member = (RelationMemberData) diffItem.value;
-        text = "";
         if (member != null) {
             switch(member.getMemberType()) {
             case NODE: text = tr("Node {0}", member.getMemberId()); break;
             case WAY: text = tr("Way {0}", member.getMemberId()); break;
             case RELATION: text = tr("Relation {0}", member.getMemberId()); break;
+            default: throw new AssertionError();
             }
         }
         setText(text);
         setToolTipText(text);
-        GuiHelper.setBackgroundReadable(this, bgColor);
+        GuiHelper.setBackgroundReadable(this, diffItem.state.getColor());
     }
 
     // Warning: The model pads with null-rows to match the size of the opposite table. 'value' could be null
@@ -88,6 +84,7 @@ public class RelationMemberListTableCellRenderer extends JLabel implements Table
         case 1:
             renderPrimitive(member);
             break;
+        default: // Do nothing
         }
 
         return this;
diff --git a/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java b/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java
index 0271cf2..a773cae 100644
--- a/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java
@@ -66,6 +66,7 @@ public class TagTableCellRenderer extends JLabel implements TableCellRenderer {
             setToolTipText(getText());
             setBackgroundReadable(key, model, isSelected, true);
             break;
+        default: // Do nothing
         }
 
         return this;
diff --git a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
index 953a65c..ba4e205 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
@@ -14,8 +14,6 @@ import java.awt.event.ActionEvent;
 import java.text.DateFormat;
 import java.util.Collections;
 import java.util.Date;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.AbstractAction;
 import javax.swing.JButton;
@@ -23,6 +21,8 @@ import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Changeset;
@@ -47,7 +47,7 @@ import org.openstreetmap.josm.tools.date.DateUtils;
  * of a {@link OsmPrimitive}.
  * @since 1709
  */
-public class VersionInfoPanel extends JPanel implements Observer {
+public class VersionInfoPanel extends JPanel implements ChangeListener {
     private final PointInTimeType pointInTimeType;
     private final transient HistoryBrowserModel model;
     private JMultilineLabel lblInfo;
@@ -188,7 +188,7 @@ public class VersionInfoPanel extends JPanel implements Observer {
 
         this.model = model;
         this.pointInTimeType = pointInTimeType;
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
     }
 
@@ -197,7 +197,7 @@ public class VersionInfoPanel extends JPanel implements Observer {
     }
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         HistoryOsmPrimitive primitive = getPrimitive();
         if (primitive != null) {
             Changeset cs = primitive.getChangeset();
diff --git a/src/org/openstreetmap/josm/gui/history/VersionTable.java b/src/org/openstreetmap/josm/gui/history/VersionTable.java
index fa1dcf2..9e75682 100644
--- a/src/org/openstreetmap/josm/gui/history/VersionTable.java
+++ b/src/org/openstreetmap/josm/gui/history/VersionTable.java
@@ -13,8 +13,6 @@ import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.DefaultCellEditor;
 import javax.swing.JCheckBox;
@@ -24,6 +22,8 @@ import javax.swing.JRadioButton;
 import javax.swing.JTable;
 import javax.swing.SwingConstants;
 import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
 import javax.swing.table.TableCellRenderer;
@@ -44,7 +44,7 @@ import org.openstreetmap.josm.tools.OpenBrowser;
  * of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive}.
  * @since 1709
  */
-public class VersionTable extends JTable implements Observer {
+public class VersionTable extends JTable implements ChangeListener {
     private VersionTablePopupMenu popupMenu;
     private final transient HistoryBrowserModel model;
 
@@ -54,7 +54,7 @@ public class VersionTable extends JTable implements Observer {
      */
     public VersionTable(HistoryBrowserModel model) {
         super(model.getVersionTableModel(), new VersionTableColumnModel());
-        model.addObserver(this);
+        model.addChangeListener(this);
         build();
         this.model = model;
     }
@@ -116,7 +116,7 @@ public class VersionTable extends JTable implements Observer {
     }
 
     @Override
-    public void update(Observable o, Object arg) {
+    public void stateChanged(ChangeEvent e) {
         repaint();
     }
 
diff --git a/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java b/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java
index 8862e83..388718b 100644
--- a/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java
+++ b/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java
@@ -112,7 +112,7 @@ public abstract class AbstractPrimitiveTask extends PleaseWaitRunnable {
             }
 
             loadIncompleteNodes();
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled)
                 return;
             lastException = e;
diff --git a/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java b/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
index b6695ba..ad2b740 100644
--- a/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
+++ b/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
@@ -37,14 +37,34 @@ import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 public abstract class AbstractUploadTask extends PleaseWaitRunnable {
+
+    /**
+     * Constructs a new {@code AbstractUploadTask}.
+     * @param title message for the user
+     * @param ignoreException If true, exception will be silently ignored. If false then
+     * exception will be handled by showing a dialog. When this runnable is executed using executor framework
+     * then use false unless you read result of task (because exception will get lost if you don't)
+     */
     public AbstractUploadTask(String title, boolean ignoreException) {
         super(title, ignoreException);
     }
 
+    /**
+     * Constructs a new {@code AbstractUploadTask}.
+     * @param title message for the user
+     * @param progressMonitor progress monitor
+     * @param ignoreException If true, exception will be silently ignored. If false then
+     * exception will be handled by showing a dialog. When this runnable is executed using executor framework
+     * then use false unless you read result of task (because exception will get lost if you don't)
+     */
     public AbstractUploadTask(String title, ProgressMonitor progressMonitor, boolean ignoreException) {
         super(title, progressMonitor, ignoreException);
     }
 
+    /**
+     * Constructs a new {@code AbstractUploadTask}.
+     * @param title message for the user
+     */
     public AbstractUploadTask(String title) {
         super(title);
     }
@@ -92,11 +112,12 @@ public abstract class AbstractUploadTask extends PleaseWaitRunnable {
      */
     protected void handleUploadConflictForKnownConflict(final OsmPrimitiveType primitiveType, final long id, String serverVersion,
             String myVersion) {
-        String lbl = "";
+        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;
+        default: throw new AssertionError();
         }
         ButtonSpec[] spec = new ButtonSpec[] {
                 new ButtonSpec(
diff --git a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
index 4c59e98..6e5dd42 100644
--- a/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
@@ -9,19 +9,19 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.Action;
 import javax.swing.BorderFactory;
 import javax.swing.JEditorPane;
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 
@@ -121,8 +121,8 @@ public class BasicUploadSettingsPanel extends JPanel {
         CheckParameterUtil.ensureParameterNotNull(changesetSourceModel, "changesetSourceModel");
         this.changesetCommentModel = changesetCommentModel;
         this.changesetSourceModel = changesetSourceModel;
-        changesetCommentModel.addObserver(new ChangesetCommentObserver(hcbUploadComment));
-        changesetSourceModel.addObserver(new ChangesetCommentObserver(hcbUploadSource));
+        changesetCommentModel.addChangeListener(new ChangesetCommentChangeListener(hcbUploadComment));
+        changesetSourceModel.addChangeListener(new ChangesetCommentChangeListener(hcbUploadSource));
         build();
     }
 
@@ -134,23 +134,13 @@ public class BasicUploadSettingsPanel extends JPanel {
     public void setHistoryComboBoxDownFocusTraversalHandler(final Action handler, final HistoryComboBox hcb) {
         hcb.getEditor().addActionListener(handler);
         hcb.getEditorComponent().addKeyListener(
-                new KeyListener() {
+                new KeyAdapter() {
                     @Override
                     public void keyTyped(KeyEvent e) {
                         if (e.getKeyCode() == KeyEvent.VK_TAB) {
                             handler.actionPerformed(new ActionEvent(hcb, 0, "focusDown"));
                         }
                     }
-
-                    @Override
-                    public void keyReleased(KeyEvent e) {
-                        // Do nothing
-                    }
-
-                    @Override
-                    public void keyPressed(KeyEvent e) {
-                        // Do nothing
-                    }
                 }
         );
     }
@@ -224,18 +214,18 @@ public class BasicUploadSettingsPanel extends JPanel {
      * Observes the changeset comment model and keeps the comment input field
      * in sync with the current changeset comment
      */
-    static class ChangesetCommentObserver implements Observer {
+    static class ChangesetCommentChangeListener implements ChangeListener {
 
         private final HistoryComboBox destination;
 
-        ChangesetCommentObserver(HistoryComboBox destination) {
+        ChangesetCommentChangeListener(HistoryComboBox destination) {
             this.destination = destination;
         }
 
         @Override
-        public void update(Observable o, Object arg) {
-            if (!(o instanceof ChangesetCommentModel)) return;
-            String newComment = (String) arg;
+        public void stateChanged(ChangeEvent e) {
+            if (!(e.getSource() instanceof ChangesetCommentModel)) return;
+            String newComment = ((ChangesetCommentModel) e.getSource()).getComment();
             if (!destination.getText().equals(newComment)) {
                 destination.setText(newComment);
             }
diff --git a/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java b/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java
index f27b22f..7e6fb12 100644
--- a/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java
@@ -33,7 +33,7 @@ public class ChangesetCellRenderer extends JLabel implements ListCellRenderer<Ch
     }
 
     protected String buildToolTipText(Changeset cs) {
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(64);
         sb.append("<html><strong>").append(tr("Changeset id:")).append("</strong>").append(cs.getId()).append("<br>");
         if (cs.getCreatedAt() != null) {
             sb.append("<strong>").append(tr("Created at:")).append("</strong>").append(
diff --git a/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java b/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java
index 087974d..d1b3062 100644
--- a/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java
+++ b/src/org/openstreetmap/josm/gui/io/ChangesetCommentModel.java
@@ -2,14 +2,15 @@
 package org.openstreetmap.josm.gui.io;
 
 import java.util.Objects;
-import java.util.Observable;
+
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 
 /**
  * ChangesetCommentModel is an observable model for the changeset comment edited
  * in the {@link UploadDialog}.
  * @since 3133
  */
-public class ChangesetCommentModel extends Observable {
+public class ChangesetCommentModel extends ChangeNotifier {
     private String comment = "";
 
     /**
@@ -21,8 +22,7 @@ public class ChangesetCommentModel extends Observable {
         String oldValue = this.comment;
         this.comment = comment == null ? "" : comment;
         if (!Objects.equals(oldValue, this.comment)) {
-            setChanged();
-            notifyObservers(this.comment);
+            fireStateChanged();
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java b/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
index c7b2101..47bf4d0 100644
--- a/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/ChangesetManagementPanel.java
@@ -47,15 +47,26 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * </ul>
  */
 public class ChangesetManagementPanel extends JPanel implements ListDataListener {
-    public static final String SELECTED_CHANGESET_PROP = ChangesetManagementPanel.class.getName() + ".selectedChangeset";
-    public static final String CLOSE_CHANGESET_AFTER_UPLOAD = ChangesetManagementPanel.class.getName() + ".closeChangesetAfterUpload";
+    static final String SELECTED_CHANGESET_PROP = ChangesetManagementPanel.class.getName() + ".selectedChangeset";
+    static final String CLOSE_CHANGESET_AFTER_UPLOAD = ChangesetManagementPanel.class.getName() + ".closeChangesetAfterUpload";
 
     private JRadioButton rbUseNew;
     private JRadioButton rbExisting;
     private JosmComboBox<Changeset> cbOpenChangesets;
     private JCheckBox cbCloseAfterUpload;
     private OpenChangesetComboBoxModel model;
-    private final transient ChangesetCommentModel changesetCommentModel;
+
+    /**
+     * Constructs a new {@code ChangesetManagementPanel}.
+     *
+     * @param changesetCommentModel the changeset comment model. Must not be null.
+     * @throws IllegalArgumentException if {@code changesetCommentModel} is null
+     */
+    public ChangesetManagementPanel(ChangesetCommentModel changesetCommentModel) {
+        CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
+        build();
+        refreshGUI();
+    }
 
     /**
      * builds the GUI
@@ -158,25 +169,10 @@ public class ChangesetManagementPanel extends JPanel implements ListDataListener
         rbExisting.getModel().addItemListener(new RadioButtonHandler());
     }
 
-    /**
-     * Creates a new panel
-     *
-     * @param changesetCommentModel the changeset comment model. Must not be null.
-     * @throws IllegalArgumentException if {@code changesetCommentModel} is null
-     */
-    public ChangesetManagementPanel(ChangesetCommentModel changesetCommentModel) {
-        CheckParameterUtil.ensureParameterNotNull(changesetCommentModel, "changesetCommentModel");
-        this.changesetCommentModel = changesetCommentModel;
-        build();
-        refreshGUI();
-    }
-
     protected void refreshGUI() {
         rbExisting.setEnabled(model.getSize() > 0);
-        if (model.getSize() == 0) {
-            if (!rbUseNew.isSelected()) {
-                rbUseNew.setSelected(true);
-            }
+        if (model.getSize() == 0 && !rbUseNew.isSelected()) {
+            rbUseNew.setSelected(true);
         }
         cbOpenChangesets.setEnabled(model.getSize() > 0 && rbExisting.isSelected());
     }
@@ -234,9 +230,7 @@ public class ChangesetManagementPanel extends JPanel implements ListDataListener
     }
 
     /**
-     * Listens to changes in the selected changeset and fires property
-     * change events.
-     *
+     * Listens to changes in the selected changeset and fires property change events.
      */
     class ChangesetListItemStateListener implements ItemListener {
         @Override
@@ -250,9 +244,7 @@ public class ChangesetManagementPanel extends JPanel implements ListDataListener
     }
 
     /**
-     * Listens to changes in "close after upload" flag and fires
-     * property change events.
-     *
+     * Listens to changes in "close after upload" flag and fires property change events.
      */
     class CloseAfterUploadItemStateListener implements ItemListener {
         @Override
@@ -268,13 +260,13 @@ public class ChangesetManagementPanel extends JPanel implements ListDataListener
                 firePropertyChange(CLOSE_CHANGESET_AFTER_UPLOAD, true, false);
                 Main.pref.put("upload.changeset.close", false);
                 break;
+            default: // Do nothing
             }
         }
     }
 
     /**
      * Listens to changes in the two radio buttons rbUseNew and rbUseExisting.
-     *
      */
     class RadioButtonHandler implements ItemListener {
         @Override
diff --git a/src/org/openstreetmap/josm/gui/io/CloseChangesetDialog.java b/src/org/openstreetmap/josm/gui/io/CloseChangesetDialog.java
index 350f923..e193a31 100644
--- a/src/org/openstreetmap/josm/gui/io/CloseChangesetDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/CloseChangesetDialog.java
@@ -60,7 +60,8 @@ public class CloseChangesetDialog extends JDialog {
     protected JPanel buildCenterPanel() {
         JPanel pnl = new JPanel(new BorderLayout());
         model = new DefaultListModel<>();
-        pnl.add(new JScrollPane(lstOpenChangesets = new JList<>(model)), BorderLayout.CENTER);
+        lstOpenChangesets = new JList<>(model);
+        pnl.add(new JScrollPane(lstOpenChangesets), BorderLayout.CENTER);
         lstOpenChangesets.setCellRenderer(new ChangesetCellRenderer());
         return pnl;
     }
@@ -71,12 +72,13 @@ public class CloseChangesetDialog extends JDialog {
         // -- close action
         CloseAction closeAction = new CloseAction();
         lstOpenChangesets.addListSelectionListener(closeAction);
-        pnl.add(btnCloseChangesets = new SideButton(closeAction));
+        btnCloseChangesets = new SideButton(closeAction);
+        pnl.add(btnCloseChangesets);
         InputMapUtils.enableEnter(btnCloseChangesets);
 
         // -- cancel action
-        SideButton btn;
-        pnl.add(btn = new SideButton(new CancelAction()));
+        SideButton btn = new SideButton(new CancelAction());
+        pnl.add(btn);
         btn.setFocusable(true);
         return pnl;
     }
diff --git a/src/org/openstreetmap/josm/gui/io/CloseChangesetTask.java b/src/org/openstreetmap/josm/gui/io/CloseChangesetTask.java
index a667419..8e60845 100644
--- a/src/org/openstreetmap/josm/gui/io/CloseChangesetTask.java
+++ b/src/org/openstreetmap/josm/gui/io/CloseChangesetTask.java
@@ -79,7 +79,7 @@ public class CloseChangesetTask extends PleaseWaitRunnable {
                 OsmApi.getOsmApi().closeChangeset(cs, getProgressMonitor().createSubTaskMonitor(1, false));
                 closedChangesets.add(cs);
             }
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled)
                 return;
             lastException = e;
diff --git a/src/org/openstreetmap/josm/gui/io/CredentialDialog.java b/src/org/openstreetmap/josm/gui/io/CredentialDialog.java
index 133b682..6fc5993 100644
--- a/src/org/openstreetmap/josm/gui/io/CredentialDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/CredentialDialog.java
@@ -13,8 +13,8 @@ import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.util.Objects;
@@ -116,37 +116,43 @@ public class CredentialDialog extends JDialog {
 
     public void prepareForOsmApiCredentials(String username, String password) {
         setTitle(tr("Enter credentials for OSM API"));
-        getContentPane().add(pnlCredentials = new OsmApiCredentialsPanel(this), BorderLayout.CENTER);
+        pnlCredentials = new OsmApiCredentialsPanel(this);
+        getContentPane().add(pnlCredentials, BorderLayout.CENTER);
         pnlCredentials.init(username, password);
         validate();
     }
 
     public void prepareForOtherHostCredentials(String username, String password, String host) {
         setTitle(tr("Enter credentials for host"));
-        getContentPane().add(pnlCredentials = new OtherHostCredentialsPanel(this, host), BorderLayout.CENTER);
+        pnlCredentials = new OtherHostCredentialsPanel(this, host);
+        getContentPane().add(pnlCredentials, BorderLayout.CENTER);
         pnlCredentials.init(username, password);
         validate();
     }
 
     public void prepareForProxyCredentials(String username, String password) {
         setTitle(tr("Enter credentials for HTTP proxy"));
-        getContentPane().add(pnlCredentials = new HttpProxyCredentialsPanel(this), BorderLayout.CENTER);
+        pnlCredentials = new HttpProxyCredentialsPanel(this);
+        getContentPane().add(pnlCredentials, BorderLayout.CENTER);
         pnlCredentials.init(username, password);
         validate();
     }
 
     public String getUsername() {
-        if (pnlCredentials == null) return null;
+        if (pnlCredentials == null)
+            return null;
         return pnlCredentials.getUserName();
     }
 
     public char[] getPassword() {
-        if (pnlCredentials == null) return null;
+        if (pnlCredentials == null)
+            return null;
         return pnlCredentials.getPassword();
     }
 
     public boolean isSaveCredentials() {
-        if (pnlCredentials == null) return false;
+        if (pnlCredentials == null)
+            return false;
         return pnlCredentials.isSaveCredentials();
     }
 
@@ -154,8 +160,8 @@ public class CredentialDialog extends JDialog {
         protected JosmTextField tfUserName;
         protected JosmPasswordField tfPassword;
         protected JCheckBox cbSaveCredentials;
-        protected JMultilineLabel lblHeading;
-        protected JMultilineLabel lblWarning;
+        protected final JMultilineLabel lblHeading = new JMultilineLabel("");
+        protected final JMultilineLabel lblWarning = new JMultilineLabel("");
         protected CredentialDialog owner; // owner Dependency Injection to use Key listeners for username and password text fields
 
         protected void build() {
@@ -175,7 +181,7 @@ public class CredentialDialog extends JDialog {
             gc.weightx = 1.0;
             gc.weighty = 0.0;
             gc.insets = new Insets(0, 0, 10, 0);
-            add(lblHeading = new JMultilineLabel(""), gc);
+            add(lblHeading, gc);
 
             gc.gridx = 0;
             gc.gridy = 1;
@@ -207,7 +213,6 @@ public class CredentialDialog extends JDialog {
             gc.fill = GridBagConstraints.BOTH;
             gc.weightx = 1.0;
             gc.weighty = 0.0;
-            lblWarning = new JMultilineLabel("");
             lblWarning.setFont(lblWarning.getFont().deriveFont(Font.ITALIC));
             add(lblWarning, gc);
 
@@ -343,7 +348,7 @@ public class CredentialDialog extends JDialog {
      *   If current text field is not empty, but the next one is (or just contains a sequence of spaces), focuses the next text field.
      *   If both text fields contain characters, submits the form by calling owner's {@link OKAction}.
      */
-    private static class TFKeyListener implements KeyListener {
+    private static class TFKeyListener extends KeyAdapter {
         protected CredentialDialog owner; // owner Dependency Injection to call OKAction
         protected JTextField currentTF;
         protected JTextField nextTF;
@@ -370,14 +375,6 @@ public class CredentialDialog extends JDialog {
                 }
             }
         }
-
-        @Override
-        public void keyReleased(KeyEvent e) {
-        }
-
-        @Override
-        public void keyTyped(KeyEvent e) {
-        }
     }
 
     class OKAction extends AbstractAction {
diff --git a/src/org/openstreetmap/josm/gui/io/DownloadFileTask.java b/src/org/openstreetmap/josm/gui/io/DownloadFileTask.java
index f13c4d2..fc8ff6e 100644
--- a/src/org/openstreetmap/josm/gui/io/DownloadFileTask.java
+++ b/src/org/openstreetmap/josm/gui/io/DownloadFileTask.java
@@ -84,7 +84,9 @@ public class DownloadFileTask extends PleaseWaitRunnable {
     }
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing
+    }
 
     /**
      * Performs download.
@@ -116,12 +118,13 @@ public class DownloadFileTask extends PleaseWaitRunnable {
             ) {
                 byte[] buffer = new byte[32768];
                 int count = 0;
-                long p1 = 0, p2 = 0;
+                long p1 = 0;
+                long p2;
                 for (int read = in.read(buffer); read != -1; read = in.read(buffer)) {
                     out.write(buffer, 0, read);
                     count += read;
                     if (canceled) break;
-                    p2 = 100 * count / size;
+                    p2 = 100L * count / size;
                     if (p2 != p1) {
                         progressMonitor.setTicks((int) p2);
                         p1 = p2;
diff --git a/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java b/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
index 0f327ca..e7751f2 100644
--- a/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
+++ b/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
@@ -153,7 +153,7 @@ public class DownloadOpenChangesetsTask extends PleaseWaitRunnable {
                     query,
                     getProgressMonitor().createSubTaskMonitor(1, false /* not internal */)
             );
-        } catch (Exception e) {
+        } catch (OsmTransferException e) {
             if (canceled)
                 return;
             lastException = e;
diff --git a/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java b/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
index 9093f0e..e9c0877 100644
--- a/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
+++ b/src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
@@ -26,6 +26,9 @@ import org.openstreetmap.josm.tools.ImageProvider;
 public class RecentlyOpenedFilesMenu extends JMenu {
     private ClearAction clearAction;
 
+    /**
+     * Constructs a new {@code RecentlyOpenedFilesMenu}.
+     */
     public RecentlyOpenedFilesMenu() {
         super(tr("Open Recent"));
         setToolTipText(tr("List of recently opened files"));
@@ -41,10 +44,12 @@ public class RecentlyOpenedFilesMenu extends JMenu {
 
             @Override
             public void menuDeselected(MenuEvent e) {
+                // Do nothing
             }
 
             @Override
             public void menuCanceled(MenuEvent e) {
+                // Do nothing
             }
         });
     }
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java b/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
index e77e400..8a5d4fa 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayerTask.java
@@ -55,7 +55,7 @@ public class SaveLayerTask extends AbstractIOTask {
             if (!isCanceled()) {
                 layerInfo.getLayer().onPostSaveToFile();
             }
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             Main.error(e);
             setLastException(e);
         }
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
index 4a7b7c7..e4b9417 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
@@ -20,6 +20,7 @@ import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.List;
 import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -64,16 +65,27 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         CANCEL
     }
 
-    private SaveLayersModel model;
+    private final SaveLayersModel model = new SaveLayersModel();
     private UserAction action = UserAction.CANCEL;
-    private UploadAndSaveProgressRenderer pnlUploadLayers;
+    private final UploadAndSaveProgressRenderer pnlUploadLayers = new UploadAndSaveProgressRenderer();
 
-    private SaveAndProceedAction saveAndProceedAction;
-    private SaveSessionAction saveSessionAction;
-    private DiscardAndProceedAction discardAndProceedAction;
-    private CancelAction cancelAction;
+    private final SaveAndProceedAction saveAndProceedAction = new SaveAndProceedAction();
+    private final SaveSessionAction saveSessionAction = new SaveSessionAction();
+    private final DiscardAndProceedAction discardAndProceedAction = new DiscardAndProceedAction();
+    private final CancelAction cancelAction = new CancelAction();
     private transient SaveAndUploadTask saveAndUploadTask;
 
+    private final JButton saveAndProceedActionButton = new JButton(saveAndProceedAction);
+
+    /**
+     * Constructs a new {@code SaveLayersDialog}.
+     * @param parent parent component
+     */
+    public SaveLayersDialog(Component parent) {
+        super(GuiHelper.getFrameForComponent(parent), ModalityType.DOCUMENT_MODAL);
+        build();
+    }
+
     /**
      * builds the GUI
      */
@@ -82,7 +94,6 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         geometry.applySafe(this);
         getContentPane().setLayout(new BorderLayout());
 
-        model = new SaveLayersModel();
         SaveLayersTable table = new SaveLayersTable(model);
         JScrollPane pane = new JScrollPane(table);
         model.addPropertyChangeListener(table);
@@ -95,8 +106,6 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
     }
 
-    private JButton saveAndProceedActionButton;
-
     /**
      * builds the button row
      *
@@ -105,22 +114,18 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
     protected JPanel buildButtonRow() {
         JPanel pnl = new JPanel(new GridBagLayout());
 
-        saveAndProceedAction = new SaveAndProceedAction();
         model.addPropertyChangeListener(saveAndProceedAction);
-        pnl.add(saveAndProceedActionButton = new JButton(saveAndProceedAction), GBC.std(0, 0).insets(5, 5, 0, 0).fill(GBC.HORIZONTAL));
+        pnl.add(saveAndProceedActionButton, GBC.std(0, 0).insets(5, 5, 0, 0).fill(GBC.HORIZONTAL));
 
-        saveSessionAction = new SaveSessionAction();
         pnl.add(new JButton(saveSessionAction), GBC.std(1, 0).insets(5, 5, 5, 0).fill(GBC.HORIZONTAL));
 
-        discardAndProceedAction = new DiscardAndProceedAction();
         model.addPropertyChangeListener(discardAndProceedAction);
         pnl.add(new JButton(discardAndProceedAction), GBC.std(0, 1).insets(5, 5, 0, 5).fill(GBC.HORIZONTAL));
 
-        cancelAction = new CancelAction();
         pnl.add(new JButton(cancelAction), GBC.std(1, 1).insets(5, 5, 5, 5).fill(GBC.HORIZONTAL));
 
         JPanel pnl2 = new JPanel(new BorderLayout());
-        pnl2.add(pnlUploadLayers = new UploadAndSaveProgressRenderer(), BorderLayout.CENTER);
+        pnl2.add(pnlUploadLayers, BorderLayout.CENTER);
         model.addPropertyChangeListener(pnlUploadLayers);
         pnl2.add(pnl, BorderLayout.SOUTH);
         return pnl2;
@@ -138,11 +143,6 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         this.discardAndProceedAction.initForDiscardAndDelete();
     }
 
-    public SaveLayersDialog(Component parent) {
-        super(GuiHelper.getFrameForComponent(parent), ModalityType.DOCUMENT_MODAL);
-        build();
-    }
-
     public UserAction getUserAction() {
         return this.action;
     }
@@ -310,8 +310,10 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
 
         public void cancel() {
             switch(model.getMode()) {
-            case EDITING_DATA: cancelWhenInEditingModel(); break;
-            case UPLOADING_AND_SAVING: cancelSafeAndUploadTask(); break;
+            case EDITING_DATA: cancelWhenInEditingModel();
+                break;
+            case UPLOADING_AND_SAVING: cancelSafeAndUploadTask();
+                break;
             }
         }
 
@@ -349,8 +351,10 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
             if (evt.getPropertyName().equals(SaveLayersModel.MODE_PROP)) {
                 Mode mode = (Mode) evt.getNewValue();
                 switch(mode) {
-                case EDITING_DATA: setEnabled(true); break;
-                case UPLOADING_AND_SAVING: setEnabled(false); break;
+                case EDITING_DATA: setEnabled(true);
+                    break;
+                case UPLOADING_AND_SAVING: setEnabled(false);
+                    break;
                 }
             }
         }
@@ -406,18 +410,13 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
         }
 
         public void redrawIcon() {
-            try { // Can fail if model is not yet setup properly
-                Image base = ((ImageIcon) getValue(BASE_ICON)).getImage();
-                BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
-                Graphics2D g = newIco.createGraphics();
-                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);
-                putValue(SMALL_ICON, new ImageIcon(newIco));
-            } catch (Exception e) {
-                Main.warn(e);
-                putValue(SMALL_ICON, getValue(BASE_ICON));
-            }
+            Image base = ((ImageIcon) getValue(BASE_ICON)).getImage();
+            BufferedImage newIco = new BufferedImage(ICON_SIZE*3, ICON_SIZE, BufferedImage.TYPE_4BYTE_ABGR);
+            Graphics2D g = newIco.createGraphics();
+            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);
+            putValue(SMALL_ICON, new ImageIcon(newIco));
         }
 
         @Override
@@ -432,8 +431,10 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
             if (evt.getPropertyName().equals(SaveLayersModel.MODE_PROP)) {
                 SaveLayersModel.Mode mode = (SaveLayersModel.Mode) evt.getNewValue();
                 switch(mode) {
-                case EDITING_DATA: setEnabled(true); break;
-                case UPLOADING_AND_SAVING: setEnabled(false); break;
+                case EDITING_DATA: setEnabled(true);
+                    break;
+                case UPLOADING_AND_SAVING: setEnabled(false);
+                    break;
                 }
             }
         }
@@ -495,7 +496,7 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
                     currentFuture.get();
                 } catch (CancellationException e) {
                     model.setUploadState(layer, UploadOrSaveState.CANCELED);
-                } catch (Exception e) {
+                } catch (InterruptedException | ExecutionException e) {
                     Main.error(e);
                     model.setUploadState(layer, UploadOrSaveState.FAILED);
                     ExceptionDialogUtil.explainException(e);
@@ -536,7 +537,7 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
                     currentFuture.get();
                 } catch (CancellationException e) {
                     model.setSaveState(layerInfo.getLayer(), UploadOrSaveState.CANCELED);
-                } catch (Exception e) {
+                } catch (InterruptedException | ExecutionException e) {
                     Main.error(e);
                     model.setSaveState(layerInfo.getLayer(), UploadOrSaveState.FAILED);
                     ExceptionDialogUtil.explainException(e);
@@ -559,7 +560,8 @@ public class SaveLayersDialog extends JDialog implements TableModelListener {
 
         protected void warnBecauseOfUnsavedData() {
             int numProblems = model.getNumCancel() + model.getNumFailed();
-            if (numProblems == 0) return;
+            if (numProblems == 0)
+                return;
             Main.warn(numProblems + " problems occured during upload/save");
             String msg = trn(
                     "<html>An upload and/or save operation of one layer with modifications<br>"
diff --git a/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java b/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java
index 849ddc3..6313595 100644
--- a/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java
+++ b/src/org/openstreetmap/josm/gui/io/SaveLayersModel.java
@@ -115,6 +115,7 @@ public class SaveLayersModel extends DefaultTableModel {
             info.setDoUploadToServer(values[0]);
             info.setDoSaveToFile(values[1]);
             break;
+        default: // Do nothing
         }
         fireTableDataChanged();
     }
diff --git a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
index 54b741d..99c10c9 100644
--- a/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/TagSettingsPanel.java
@@ -3,10 +3,10 @@ package org.openstreetmap.josm.gui.io;
 
 import java.awt.BorderLayout;
 import java.util.Map;
-import java.util.Observable;
-import java.util.Observer;
 
 import javax.swing.JPanel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
 
@@ -40,8 +40,8 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
         CheckParameterUtil.ensureParameterNotNull(changesetSourceModel, "changesetSourceModel");
         this.changesetCommentModel = changesetCommentModel;
         this.changesetSourceModel = changesetSourceModel;
-        this.changesetCommentModel.addObserver(new ChangesetCommentObserver("comment"));
-        this.changesetSourceModel.addObserver(new ChangesetCommentObserver("source"));
+        this.changesetCommentModel.addChangeListener(new ChangesetCommentChangeListener("comment"));
+        this.changesetSourceModel.addChangeListener(new ChangesetCommentChangeListener("source"));
         build();
         pnlTagEditor.getModel().addTableModelListener(this);
     }
@@ -112,24 +112,24 @@ public class TagSettingsPanel extends JPanel implements TableModelListener {
      * Observes the changeset comment model and keeps the tag editor in sync
      * with the current changeset comment
      */
-    class ChangesetCommentObserver implements Observer {
+    class ChangesetCommentChangeListener implements ChangeListener {
 
         private final String key;
 
-        ChangesetCommentObserver(String key) {
+        ChangesetCommentChangeListener(String key) {
             this.key = key;
         }
 
         @Override
-        public void update(Observable o, Object arg) {
-            if (o instanceof ChangesetCommentModel) {
-                String newValue = (String) arg;
+        public void stateChanged(ChangeEvent e) {
+            if (e.getSource() instanceof ChangesetCommentModel) {
+                String newValue = ((ChangesetCommentModel) e.getSource()).getComment();
                 String oldValue = getTagEditorValue(key);
                 if (oldValue == null) {
                     oldValue = "";
                 }
                 if (!oldValue.equals(newValue)) {
-                    setProperty(key, (String) arg);
+                    setProperty(key, newValue);
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java b/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
index 3f55378..d33ff91 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadLayerTask.java
@@ -136,7 +136,7 @@ public class UploadLayerTask extends AbstractIOTask {
                     OsmApi.getOsmApi().closeChangeset(changeset, monitor.createSubTaskMonitor(0, false));
                 }
             }
-        } catch (Exception sxe) {
+        } catch (OsmTransferException sxe) {
             if (isCanceled()) {
                 Main.info("Ignoring exception caught because upload is canceled. Exception is: " + sxe);
                 return;
diff --git a/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java b/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
index b76c1c4..06cb470 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
@@ -50,8 +50,8 @@ import org.openstreetmap.josm.tools.WindowGeometry;
  */
 public class UploadSelectionDialog extends JDialog {
 
-    private OsmPrimitiveList lstSelectedPrimitives;
-    private OsmPrimitiveList lstDeletedPrimitives;
+    private final OsmPrimitiveList lstSelectedPrimitives = new OsmPrimitiveList();
+    private final OsmPrimitiveList lstDeletedPrimitives = new OsmPrimitiveList();
     private JSplitPane spLists;
     private boolean canceled;
     private SideButton btnContinue;
@@ -70,7 +70,7 @@ public class UploadSelectionDialog extends JDialog {
                 tr("<html>Mark modified objects <strong>from the current selection</strong> to be uploaded to the server.</html>"));
         lbl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         pnl.add(lbl, BorderLayout.NORTH);
-        pnl.add(new JScrollPane(lstSelectedPrimitives = new OsmPrimitiveList()), BorderLayout.CENTER);
+        pnl.add(new JScrollPane(lstSelectedPrimitives), BorderLayout.CENTER);
         lbl.setLabelFor(lstSelectedPrimitives);
         return pnl;
     }
@@ -80,7 +80,7 @@ public class UploadSelectionDialog extends JDialog {
         JLabel lbl = new JLabel(tr("<html>Mark <strong>locally deleted objects</strong> to be deleted on the server.</html>"));
         lbl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         pnl.add(lbl, BorderLayout.NORTH);
-        pnl.add(new JScrollPane(lstDeletedPrimitives = new OsmPrimitiveList()), BorderLayout.CENTER);
+        pnl.add(new JScrollPane(lstDeletedPrimitives), BorderLayout.CENTER);
         lbl.setLabelFor(lstDeletedPrimitives);
         return pnl;
     }
@@ -88,7 +88,8 @@ public class UploadSelectionDialog extends JDialog {
     protected JPanel buildButtonPanel() {
         JPanel pnl = new JPanel(new FlowLayout());
         ContinueAction continueAction = new ContinueAction();
-        pnl.add(btnContinue = new SideButton(continueAction));
+        btnContinue = new SideButton(continueAction);
+        pnl.add(btnContinue);
         btnContinue.setFocusable(true);
         lstDeletedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
         lstSelectedPrimitives.getSelectionModel().addListSelectionListener(continueAction);
@@ -175,11 +176,6 @@ public class UploadSelectionDialog extends JDialog {
     }
 
     static class OsmPrimitiveList extends JList<OsmPrimitive> {
-        protected void init() {
-            setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-            setCellRenderer(new OsmPrimitivRenderer());
-        }
-
         OsmPrimitiveList() {
             this(new OsmPrimitiveListModel());
         }
@@ -189,6 +185,11 @@ public class UploadSelectionDialog extends JDialog {
             init();
         }
 
+        protected void init() {
+            setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+            setCellRenderer(new OsmPrimitivRenderer());
+        }
+
         public OsmPrimitiveListModel getOsmPrimitiveListModel() {
             return (OsmPrimitiveListModel) getModel();
         }
@@ -207,7 +208,8 @@ public class UploadSelectionDialog extends JDialog {
                         @Override
                         public int compare(OsmPrimitive o1, OsmPrimitive o2) {
                             int ret = OsmPrimitiveType.from(o1).compareTo(OsmPrimitiveType.from(o2));
-                            if (ret != 0) return ret;
+                            if (ret != 0)
+                                return ret;
                             return o1.getDisplayName(formatter).compareTo(o1.getDisplayName(formatter));
                         }
                     }
diff --git a/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java b/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
index 75a7cd3..3239865 100644
--- a/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
+++ b/src/org/openstreetmap/josm/gui/io/UploadStrategySelectionPanel.java
@@ -11,8 +11,8 @@ import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.beans.PropertyChangeEvent;
@@ -55,10 +55,12 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
     private transient Map<UploadStrategy, JRadioButton> rbStrategy;
     private transient Map<UploadStrategy, JLabel> lblNumRequests;
     private transient Map<UploadStrategy, JMultilineLabel> lblStrategies;
-    private JosmTextField tfChunkSize;
-    private JPanel pnlMultiChangesetPolicyPanel;
-    private JRadioButton rbFillOneChangeset;
-    private JRadioButton rbUseMultipleChangesets;
+    private final JosmTextField tfChunkSize = new JosmTextField(4);
+    private final JPanel pnlMultiChangesetPolicyPanel = new JPanel(new GridBagLayout());
+    private final JRadioButton rbFillOneChangeset = new JRadioButton(
+            tr("Fill up one changeset and return to the Upload Dialog"));
+    private final JRadioButton rbUseMultipleChangesets = new JRadioButton(
+            tr("Open and use as many new changesets as necessary"));
     private JMultilineLabel lblMultiChangesetPoliciesHeader;
 
     private long numUploadedObjects;
@@ -137,7 +139,7 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
         gc.weightx = 0.0;
         gc.weighty = 0.0;
         gc.gridwidth = 1;
-        pnl.add(tfChunkSize = new JosmTextField(4), gc);
+        pnl.add(tfChunkSize, gc);
         gc.gridx = 3;
         gc.gridy = 2;
         gc.weightx = 0.0;
@@ -180,23 +182,21 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
     }
 
     protected JPanel buildMultiChangesetPolicyPanel() {
-        pnlMultiChangesetPolicyPanel = new JPanel(new GridBagLayout());
         GridBagConstraints gc = new GridBagConstraints();
         gc.gridx = 0;
         gc.gridy = 0;
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.FIRST_LINE_START;
         gc.weightx = 1.0;
-        pnlMultiChangesetPolicyPanel.add(lblMultiChangesetPoliciesHeader = new JMultilineLabel(
+        lblMultiChangesetPoliciesHeader = new JMultilineLabel(
                 tr("<html>There are <strong>multiple changesets</strong> necessary in order to upload {0} objects. " +
                    "Which strategy do you want to use?</html>",
-                        numUploadedObjects)), gc);
+                        numUploadedObjects));
+        pnlMultiChangesetPolicyPanel.add(lblMultiChangesetPoliciesHeader, gc);
         gc.gridy = 1;
-        pnlMultiChangesetPolicyPanel.add(rbFillOneChangeset = new JRadioButton(
-                tr("Fill up one changeset and return to the Upload Dialog")), gc);
+        pnlMultiChangesetPolicyPanel.add(rbFillOneChangeset, gc);
         gc.gridy = 2;
-        pnlMultiChangesetPolicyPanel.add(rbUseMultipleChangesets = new JRadioButton(
-                tr("Open and use as many new changesets as necessary")), gc);
+        pnlMultiChangesetPolicyPanel.add(rbUseMultipleChangesets, gc);
 
         ButtonGroup bgMultiChangesetPolicies = new ButtonGroup();
         bgMultiChangesetPolicies.add(rbFillOneChangeset);
@@ -254,17 +254,17 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
 
     public UploadStrategySpecification getUploadStrategySpecification() {
         UploadStrategy strategy = getUploadStrategy();
-        int chunkSize = getChunkSize();
         UploadStrategySpecification spec = new UploadStrategySpecification();
         if (strategy != null) {
             switch(strategy) {
+            case CHUNKED_DATASET_STRATEGY:
+                spec.setStrategy(strategy).setChunkSize(getChunkSize());
+                break;
             case INDIVIDUAL_OBJECTS_STRATEGY:
             case SINGLE_REQUEST_STRATEGY:
+            default:
                 spec.setStrategy(strategy);
                 break;
-            case CHUNKED_DATASET_STRATEGY:
-                spec.setStrategy(strategy).setChunkSize(chunkSize);
-                break;
             }
         }
         if (pnlMultiChangesetPolicyPanel.isVisible()) {
@@ -388,7 +388,7 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
         }
     }
 
-    static class TextFieldFocusHandler implements FocusListener {
+    static class TextFieldFocusHandler extends FocusAdapter {
         @Override
         public void focusGained(FocusEvent e) {
             Component c = e.getComponent();
@@ -397,9 +397,6 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
                 tf.selectAll();
             }
         }
-
-        @Override
-        public void focusLost(FocusEvent e) {}
     }
 
     class ChunkSizeInputVerifier implements DocumentListener, PropertyChangeListener {
@@ -466,7 +463,7 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
         }
     }
 
-    class StrategyChangeListener implements ItemListener, FocusListener, ActionListener {
+    class StrategyChangeListener extends FocusAdapter implements ItemListener, ActionListener {
 
         protected void notifyStrategy() {
             firePropertyChange(UPLOAD_STRATEGY_SPECIFICATION_PROP, null, getUploadStrategySpecification());
@@ -475,7 +472,8 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
         @Override
         public void itemStateChanged(ItemEvent e) {
             UploadStrategy strategy = getUploadStrategy();
-            if (strategy == null) return;
+            if (strategy == null)
+                return;
             switch(strategy) {
             case CHUNKED_DATASET_STRATEGY:
                 tfChunkSize.setEnabled(true);
@@ -488,9 +486,6 @@ public class UploadStrategySelectionPanel extends JPanel implements PropertyChan
         }
 
         @Override
-        public void focusGained(FocusEvent arg0) {}
-
-        @Override
         public void focusLost(FocusEvent arg0) {
             notifyStrategy();
         }
diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
index d3abdf5..4b3a885 100644
--- a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
@@ -1579,9 +1579,9 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
                 TMSCachedTileLoader cachedTileLoader = (TMSCachedTileLoader) tileLoader;
                 int offset = 200;
                 for (String part: cachedTileLoader.getStats().split("\n")) {
-                    myDrawString(g, tr("Cache stats: {0}", part), 50, offset += 15);
+                    offset += 15;
+                    myDrawString(g, tr("Cache stats: {0}", part), 50, offset);
                 }
-
             }
         }
     }
@@ -1624,7 +1624,7 @@ implements ImageObserver, TileLoaderListener, ZoomChangeListener {
         if (clickedTile == null)
             return null;
         if (Main.isTraceEnabled()) {
-            Main.trace("Clicked on tile: " + clickedTile.getXtile() + " " + clickedTile.getYtile() +
+            Main.trace("Clicked on tile: " + clickedTile.getXtile() + ' ' + clickedTile.getYtile() +
                 " currentZoomLevel: " + currentZoomLevel);
         }
         return clickedTile;
diff --git a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
index f18ad59..983093d 100644
--- a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
@@ -89,6 +89,7 @@ public class GpxLayer extends Layer {
         super(d.getString(GpxConstants.META_NAME));
         data = d;
         drawHelper = new GpxDrawHelper(data);
+        SystemOfMeasurement.addSoMChangeListener(drawHelper);
         ensureTrackVisibilityLength();
         setName(name);
         isLocalFile = isLocal;
@@ -389,4 +390,9 @@ public class GpxLayer extends Layer {
     public LayerPositionStrategy getDefaultLayerPosition() {
         return LayerPositionStrategy.AFTER_LAST_DATA_LAYER;
     }
+
+    @Override
+    public void destroy() {
+        SystemOfMeasurement.removeSoMChangeListener(drawHelper);
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
index 37ca1ec..effc254 100644
--- a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
@@ -102,7 +102,8 @@ public abstract class ImageryLayer extends Layer {
     }
 
     public double getPPD() {
-        if (!Main.isDisplayingMapView()) return Main.getProjection().getDefaultZoomInPPD();
+        if (!Main.isDisplayingMapView())
+            return Main.getProjection().getDefaultZoomInPPD();
         ProjectionBounds bounds = Main.map.mapView.getProjectionBounds();
         return Main.map.mapView.getWidth() / (bounds.maxEast - bounds.minEast);
     }
@@ -121,9 +122,15 @@ public abstract class ImageryLayer extends Layer {
     }
 
     public void displace(double dx, double dy) {
-        setOffset(this.dx += dx, this.dy += dy);
+        this.dx += dx;
+        this.dy += dy;
+        setOffset(this.dx, this.dy);
     }
 
+    /**
+     * Returns imagery info.
+     * @return imagery info
+     */
     public ImageryInfo getInfo() {
         return info;
     }
@@ -194,6 +201,7 @@ public abstract class ImageryLayer extends Layer {
     public class OffsetAction extends AbstractAction implements LayerAction {
         @Override
         public void actionPerformed(ActionEvent e) {
+            // Do nothing
         }
 
         @Override
@@ -295,6 +303,11 @@ public abstract class ImageryLayer extends Layer {
             to.getGraphics().drawImage(image, 0, 0, null);
             return process(to);
         }
+
+        @Override
+        public String toString() {
+            return "GammaImageProcessor [gamma=" + gamma + ']';
+        }
     }
 
     /**
@@ -378,7 +391,7 @@ public abstract class ImageryLayer extends Layer {
 
         @Override
         public String toString() {
-            return "SharpenImageProcessor [sharpenLevel=" + sharpenLevel + "]";
+            return "SharpenImageProcessor [sharpenLevel=" + sharpenLevel + ']';
         }
     }
 
@@ -428,7 +441,7 @@ public abstract class ImageryLayer extends Layer {
 
         @Override
         public String toString() {
-            return "ColorfulImageProcessor [colorfulness=" + colorfulness + "]";
+            return "ColorfulImageProcessor [colorfulness=" + colorfulness + ']';
         }
     }
 
@@ -461,7 +474,7 @@ public abstract class ImageryLayer extends Layer {
 
             int type = src.getType();
             if (type != dest.getType()) {
-                Main.trace("Cannot apply color filter: Src / Dest differ in type (" + type + "/" + dest.getType() + ")");
+                Main.trace("Cannot apply color filter: Src / Dest differ in type (" + type + '/' + dest.getType() + ')');
                 return src;
             }
             int redOffset, greenOffset, blueOffset, alphaOffset = 0;
diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
index e52e429..45f505c 100644
--- a/src/org/openstreetmap/josm/gui/layer/Layer.java
+++ b/src/org/openstreetmap/josm/gui/layer/Layer.java
@@ -168,7 +168,7 @@ public abstract class Layer extends AbstractMapViewPaintable implements Destroya
      */
     public void hookUpMapView() {
         // calculate total memory needed for all layers
-        long memoryBytesRequired = 50 * 1024 * 1024; // assumed minimum JOSM memory footprint
+        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();
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerManager.java b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
new file mode 100644
index 0000000..e6c4895
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/layer/LayerManager.java
@@ -0,0 +1,348 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * This class handles the layer management.
+ * <p>
+ * This manager handles a list of layers with the first layer being the front layer.
+ * <h1>Threading</h1>
+ * Methods of this manager may be called from any thread in any order.
+ * Listeners are called while this layer manager is locked, so they should not block.
+ *
+ * @author Michael Zangl
+ * @since 10273
+ */
+public class LayerManager {
+    /**
+     * Interface to notify listeners of a layer change.
+     */
+    public interface LayerChangeListener {
+        /**
+         * Notifies this listener that a layer has been added.
+         * <p>
+         * Listeners are called in the EDT thread and you can manipulate the layer manager in the current thread.
+         * @param e The new added layer event
+         */
+        void layerAdded(LayerAddEvent e);
+
+        /**
+         * Notifies this listener that a layer is about to be removed.
+         * <p>
+         * Listeners are called in the EDT thread and you can manipulate the layer manager in the current thread.
+         * @param e The layer to be removed (as event)
+         */
+        void layerRemoving(LayerRemoveEvent e);
+
+        /**
+         * Notifies this listener that the order of layers was changed.
+         * <p>
+         * Listeners are called in the EDT thread and you can manipulate the layer manager in the current thread.
+         * @param e The order change event.
+         */
+        void layerOrderChanged(LayerOrderChangeEvent e);
+    }
+
+    protected static class LayerManagerEvent {
+        private final LayerManager source;
+
+        LayerManagerEvent(LayerManager source) {
+            this.source = source;
+        }
+
+        public LayerManager getSource() {
+            return source;
+        }
+    }
+
+    /**
+     * The event that is fired whenever a layer was added.
+     * @author Michael Zangl
+     */
+    public static class LayerAddEvent extends LayerManagerEvent {
+        private final Layer addedLayer;
+
+        LayerAddEvent(LayerManager source, Layer addedLayer) {
+            super(source);
+            this.addedLayer = addedLayer;
+        }
+
+        /**
+         * Gets the layer that was added.
+         * @return The added layer.
+         */
+        public Layer getAddedLayer() {
+            return addedLayer;
+        }
+    }
+
+    /**
+     * The event that is fired before removing a layer.
+     * @author Michael Zangl
+     */
+    public static class LayerRemoveEvent extends LayerManagerEvent {
+        private final Layer removedLayer;
+
+        LayerRemoveEvent(LayerManager source, Layer removedLayer) {
+            super(source);
+            this.removedLayer = removedLayer;
+        }
+
+        /**
+         * Gets the layer that is about to be removed.
+         * @return The layer.
+         */
+        public Layer getRemovedLayer() {
+            return removedLayer;
+        }
+    }
+
+    /**
+     * An event that is fired whenever the order of layers changed.
+     * <p>
+     * We currently do not report the exact changes.
+     * @author Michael Zangl
+     */
+    public static class LayerOrderChangeEvent extends LayerManagerEvent {
+        LayerOrderChangeEvent(LayerManager source) {
+            super(source);
+        }
+
+    }
+
+    /**
+     * This is the list of layers we manage.
+     */
+    private final List<Layer> layers = new ArrayList<>();
+
+    private final List<LayerChangeListener> layerChangeListeners = new CopyOnWriteArrayList<>();
+
+    /**
+     * Add a layer. The layer will be added at a given psoition.
+     * @param layer The layer to add
+     */
+    public void addLayer(final Layer layer) {
+        // we force this on to the EDT Thread to make events fire from there.
+        // The synchronization lock needs to be held by the EDT.
+        GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+            @Override
+            public void run() {
+                realAddLayer(layer);
+            }
+        });
+    }
+
+    protected synchronized void realAddLayer(Layer layer) {
+        if (containsLayer(layer)) {
+            throw new IllegalArgumentException("Cannot add a layer twice.");
+        }
+        LayerPositionStrategy positionStrategy = layer.getDefaultLayerPosition();
+        int position = positionStrategy.getPosition(this);
+        checkPosition(position);
+        insertLayerAt(layer, position);
+        fireLayerAdded(layer);
+    }
+
+    /**
+     * Remove the layer from the mapview. If the layer was in the list before,
+     * an LayerChange event is fired.
+     * @param layer The layer to remove
+     */
+    public void removeLayer(final Layer layer) {
+        // we force this on to the EDT Thread to make events fire from there.
+        // The synchronization lock needs to be held by the EDT.
+        GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+            @Override
+            public void run() {
+                realRemoveLayer(layer);
+            }
+        });
+    }
+
+    protected synchronized void realRemoveLayer(Layer layer) {
+        checkContainsLayer(layer);
+
+        fireLayerRemoving(layer);
+        layers.remove(layer);
+    }
+
+    /**
+     * Move a layer to a new position.
+     * @param layer The layer to move.
+     * @param position The position.
+     * @throws IndexOutOfBoundsException if the position is out of bounds.
+     */
+    public void moveLayer(final Layer layer, final int position) {
+        // we force this on to the EDT Thread to make events fire from there.
+        // The synchronization lock needs to be held by the EDT.
+        GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+            @Override
+            public void run() {
+                realMoveLayer(layer, position);
+            }
+        });
+    }
+
+    protected synchronized void realMoveLayer(Layer layer, int position) {
+        checkContainsLayer(layer);
+        checkPosition(position);
+
+        int curLayerPos = layers.indexOf(layer);
+        if (position == curLayerPos)
+            return; // already in place.
+        layers.remove(curLayerPos);
+        insertLayerAt(layer, position);
+        fireLayerOrderChanged();
+    }
+
+    /**
+     * Insert a layer at a given position.
+     * @param layer The layer to add.
+     * @param position The position on which we should add it.
+     */
+    private void insertLayerAt(Layer layer, int position) {
+        if (position == layers.size()) {
+            layers.add(layer);
+        } else {
+            layers.add(position, layer);
+        }
+    }
+
+    /**
+     * Check if the (new) position is valid
+     * @param position The position index
+     * @throws IndexOutOfBoundsException if it is not.
+     */
+    private void checkPosition(int position) {
+        if (position < 0 || position > layers.size()) {
+            throw new IndexOutOfBoundsException("Position " + position + " out of range.");
+        }
+    }
+
+    /**
+     * Gets an unmodifiable list of all layers that are currently in this manager. This list won't update once layers are added or removed.
+     * @return The list of layers.
+     */
+    public List<Layer> getLayers() {
+        return Collections.unmodifiableList(new ArrayList<>(layers));
+    }
+
+    /**
+     * Replies an unmodifiable list of layers of a certain type.
+     *
+     * Example:
+     * <pre>
+     *     List<WMSLayer> wmsLayers = getLayersOfType(WMSLayer.class);
+     * </pre>
+     *
+     * @param ofType The layer type.
+     * @return an unmodifiable list of layers of a certain type.
+     */
+    public <T extends Layer> List<T> getLayersOfType(Class<T> ofType) {
+        return new ArrayList<>(Utils.filteredCollection(getLayers(), ofType));
+    }
+
+    /**
+     * replies true if the list of layers managed by this map view contain layer
+     *
+     * @param layer the layer
+     * @return true if the list of layers managed by this map view contain layer
+     */
+    public synchronized boolean containsLayer(Layer layer) {
+        return layers.contains(layer);
+    }
+
+    protected void checkContainsLayer(Layer layer) {
+        if (!containsLayer(layer)) {
+            throw new IllegalArgumentException(layer + " is not managed by us.");
+        }
+    }
+
+    /**
+     * Adds a layer change listener
+     *
+     * @param listener the listener.
+     * @throws IllegalArgumentException If the listener was added twice.
+     */
+    public synchronized void addLayerChangeListener(LayerChangeListener listener) {
+        addLayerChangeListener(listener, false);
+    }
+
+    /**
+     * Adds a layer change listener
+     *
+     * @param listener the listener.
+     * @param fireAdd if we should fire an add event for every layer in this manager.
+     * @throws IllegalArgumentException If the listener was added twice.
+     */
+    public synchronized void addLayerChangeListener(LayerChangeListener listener, boolean fireAdd) {
+        if (layerChangeListeners.contains(listener)) {
+            throw new IllegalArgumentException("Listener already registered.");
+        }
+        layerChangeListeners.add(listener);
+        if (fireAdd) {
+            for (Layer l : getLayers()) {
+                listener.layerAdded(new LayerAddEvent(this, l));
+            }
+        }
+    }
+
+    /**
+     * Removes a layer change listener
+     *
+     * @param listener the listener. Ignored if null or already registered.
+     */
+    public synchronized void removeLayerChangeListener(LayerChangeListener listener) {
+        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.
+     */
+    public synchronized void removeLayerChangeListener(LayerChangeListener listener, boolean fireRemove) {
+        if (!layerChangeListeners.remove(listener)) {
+            throw new IllegalArgumentException("Listener was not registered before: " + listener);
+        } else {
+            if (fireRemove) {
+                for (Layer l : getLayers()) {
+                    listener.layerRemoving(new LayerRemoveEvent(this, l));
+                }
+            }
+        }
+    }
+
+    private void fireLayerAdded(Layer layer) {
+        GuiHelper.assertCallFromEdt();
+        LayerAddEvent e = new LayerAddEvent(this, layer);
+        for (LayerChangeListener l : layerChangeListeners) {
+            l.layerAdded(e);
+        }
+    }
+
+    private void fireLayerRemoving(Layer layer) {
+        GuiHelper.assertCallFromEdt();
+        LayerRemoveEvent e = new LayerRemoveEvent(this, layer);
+        for (LayerChangeListener l : layerChangeListeners) {
+            l.layerRemoving(e);
+        }
+    }
+
+    private void fireLayerOrderChanged() {
+        GuiHelper.assertCallFromEdt();
+        LayerOrderChangeEvent e = new LayerOrderChangeEvent(this);
+        for (LayerChangeListener l : layerChangeListeners) {
+            l.layerOrderChanged(e);
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/LayerPositionStrategy.java b/src/org/openstreetmap/josm/gui/layer/LayerPositionStrategy.java
index 46d88d4..d577e30 100644
--- a/src/org/openstreetmap/josm/gui/layer/LayerPositionStrategy.java
+++ b/src/org/openstreetmap/josm/gui/layer/LayerPositionStrategy.java
@@ -3,7 +3,6 @@ package org.openstreetmap.josm.gui.layer;
 
 import java.util.List;
 
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.Predicates;
 
@@ -19,7 +18,7 @@ public abstract class LayerPositionStrategy {
      */
     public static final LayerPositionStrategy IN_FRONT = new LayerPositionStrategy() {
         @Override
-        public int getPosition(MapView manager) {
+        public int getPosition(LayerManager manager) {
             return 0;
         }
     };
@@ -72,8 +71,8 @@ public abstract class LayerPositionStrategy {
     public static LayerPositionStrategy inFrontOfFirst(final Predicate<Layer> what) {
         return new LayerPositionStrategy() {
             @Override
-            public int getPosition(MapView manager) {
-                List<Layer> layers = manager.getAllLayersAsList();
+            public int getPosition(LayerManager manager) {
+                List<Layer> layers = manager.getLayers();
                 for (int i = 0; i < layers.size(); i++) {
                     if (what.evaluate(layers.get(i))) {
                         return i;
@@ -92,8 +91,8 @@ public abstract class LayerPositionStrategy {
     public static LayerPositionStrategy afterLast(final Predicate<Layer> what) {
         return new LayerPositionStrategy() {
             @Override
-            public int getPosition(MapView manager) {
-                List<Layer> layers = manager.getAllLayersAsList();
+            public int getPosition(LayerManager manager) {
+                List<Layer> layers = manager.getLayers();
                 for (int i = layers.size() - 1; i >= 0; i--) {
                     if (what.evaluate(layers.get(i))) {
                         return i + 1;
@@ -109,5 +108,5 @@ public abstract class LayerPositionStrategy {
      * @param manager The layer manager to insert the layer in.
      * @return The position in the range 0...layers.size
      */
-    public abstract int getPosition(MapView manager);
+    public abstract int getPosition(LayerManager manager);
 }
diff --git a/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
new file mode 100644
index 0000000..e07d845
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
@@ -0,0 +1,282 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+
+/**
+ * This class extends the layer manager by adding an active and an edit layer.
+ * <p>
+ * The active layer is the layer the user is currently working on.
+ * <p>
+ * The edit layer is an data layer that we currently work with.
+ * @author Michael Zangl
+ * @since 10279
+ */
+public class MainLayerManager extends LayerManager {
+    /**
+     * This listener listens to changes of the active or the edit layer.
+     * @author Michael Zangl
+     *
+     */
+    public interface ActiveLayerChangeListener {
+        /**
+         * Called whenever the active or edit layer changed.
+         * <p>
+         * You can be sure that this layer is still contained in this set.
+         * <p>
+         * Listeners are called in the EDT thread and you can manipulate the layer manager in the current thread.
+         * @param e The change event.
+         */
+        void activeOrEditLayerChanged(ActiveLayerChangeEvent e);
+    }
+
+    /**
+     * This event is fired whenever the active or the edit layer changes.
+     * @author Michael Zangl
+     */
+    public class ActiveLayerChangeEvent extends LayerManagerEvent {
+
+        private final OsmDataLayer previousEditLayer;
+
+        private final Layer previousActiveLayer;
+
+        /**
+         * Create a new {@link ActiveLayerChangeEvent}
+         * @param source The source
+         * @param previousEditLayer the previous edit layer
+         * @param previousActiveLayer the previous active layer
+         */
+        ActiveLayerChangeEvent(MainLayerManager source, OsmDataLayer previousEditLayer,
+                Layer previousActiveLayer) {
+            super(source);
+            this.previousEditLayer = previousEditLayer;
+            this.previousActiveLayer = previousActiveLayer;
+        }
+
+        /**
+         * Gets the edit layer that was previously used.
+         * @return The old edit layer, <code>null</code> if there is none.
+         */
+        public OsmDataLayer getPreviousEditLayer() {
+            return previousEditLayer;
+        }
+
+        /**
+         * Gets the active layer that was previously used.
+         * @return The old active layer, <code>null</code> if there is none.
+         */
+        public Layer getPreviousActiveLayer() {
+            return previousActiveLayer;
+        }
+
+        @Override
+        public MainLayerManager getSource() {
+            return (MainLayerManager) super.getSource();
+        }
+    }
+
+    /**
+     * The layer from the layers list that is currently active.
+     */
+    private Layer activeLayer;
+
+    /**
+     * The edit layer is the current active data layer.
+     */
+    private OsmDataLayer editLayer;
+
+    private final List<ActiveLayerChangeListener> activeLayerChangeListeners = 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.
+     */
+    public synchronized void addActiveLayerChangeListener(ActiveLayerChangeListener listener, boolean initialFire) {
+        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));
+        }
+    }
+
+    /**
+     * Removes an active/edit layer change listener.
+     * @param listener the listener.
+     */
+    public synchronized void removeActiveLayerChangeListener(ActiveLayerChangeListener listener) {
+        if (!activeLayerChangeListeners.contains(listener)) {
+            throw new IllegalArgumentException("Attempted to remove listener that was not in list: " + listener);
+        }
+        activeLayerChangeListeners.remove(listener);
+    }
+
+    /**
+     * Set the active layer. If the layer is an OsmDataLayer, the edit layer is also changed.
+     * @param layer The active layer.
+     */
+    public void setActiveLayer(final Layer layer) {
+        // we force this on to the EDT Thread to make events fire from there.
+        // The synchronization lock needs to be held by the EDT.
+        GuiHelper.runInEDTAndWaitWithException(new Runnable() {
+            @Override
+            public void run() {
+                realSetActiveLayer(layer);
+            }
+        });
+    }
+
+    protected synchronized void realSetActiveLayer(final Layer layer) {
+        // to be called in EDT thread
+        checkContainsLayer(layer);
+        setActiveLayer(layer, false);
+    }
+
+    private void setActiveLayer(Layer layer, boolean forceEditLayerUpdate) {
+        ActiveLayerChangeEvent event = new ActiveLayerChangeEvent(this, editLayer, activeLayer);
+        activeLayer = layer;
+        if (activeLayer instanceof OsmDataLayer) {
+            editLayer = (OsmDataLayer) activeLayer;
+        } else if (forceEditLayerUpdate) {
+            editLayer = null;
+        }
+        fireActiveLayerChange(event);
+    }
+
+    private void fireActiveLayerChange(ActiveLayerChangeEvent event) {
+        GuiHelper.assertCallFromEdt();
+        if (event.getPreviousActiveLayer() != activeLayer || event.getPreviousEditLayer() != editLayer) {
+            for (ActiveLayerChangeListener l : activeLayerChangeListeners) {
+                l.activeOrEditLayerChanged(event);
+            }
+        }
+    }
+
+    @Override
+    protected synchronized void realAddLayer(Layer layer) {
+        super.realAddLayer(layer);
+
+        // update the active layer automatically.
+        if (layer instanceof OsmDataLayer || activeLayer == null) {
+            setActiveLayer(layer);
+        }
+    }
+
+    @Override
+    protected synchronized void realRemoveLayer(Layer layer) {
+        if (layer == activeLayer || layer == editLayer) {
+            Layer nextActive = suggestNextActiveLayer(layer);
+            setActiveLayer(nextActive, true);
+        }
+
+        super.realRemoveLayer(layer);
+    }
+
+    /**
+     * Determines the next active data layer according to the following
+     * rules:
+     * <ul>
+     *   <li>if there is at least one {@link OsmDataLayer} the first one
+     *     becomes active</li>
+     *   <li>otherwise, the top most layer of any type becomes active</li>
+     * </ul>
+     *
+     * @param except A layer to ignore.
+     * @return the next active data layer
+     */
+    private Layer suggestNextActiveLayer(Layer except) {
+        List<Layer> layersList = new ArrayList<>(getLayers());
+        layersList.remove(except);
+        // First look for data layer
+        for (Layer layer : layersList) {
+            if (layer instanceof OsmDataLayer) {
+                return layer;
+            }
+        }
+
+        // Then any layer
+        if (!layersList.isEmpty())
+            return layersList.get(0);
+
+        // and then give up
+        return null;
+    }
+
+    /**
+     * Replies the currently active layer
+     *
+     * @return the currently active layer (may be null)
+     */
+    public synchronized Layer getActiveLayer() {
+        return activeLayer;
+    }
+
+    /**
+     * Replies the current edit layer, if any
+     *
+     * @return the current edit layer. May be null.
+     */
+    public synchronized OsmDataLayer getEditLayer() {
+        return editLayer;
+    }
+
+    /**
+     * Gets the data set of the active edit layer.
+     * @return That data set, <code>null</code> if there is no edit layer.
+     */
+    public synchronized DataSet getEditDataSet() {
+        if (editLayer != null) {
+            return editLayer.data;
+        } else {
+            return null;
+        }
+    }
+
+
+    /**
+     * 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.
+     * <p>
+     * The active data layer is pulled above all adjacent data layers.
+     *
+     * @return a list of the visible in Z-Order, the layer with the lowest Z-Order
+     * first, layer with the highest Z-Order last.
+     */
+    public synchronized List<Layer> getVisibleLayersInZOrder() {
+        List<Layer> ret = new ArrayList<>();
+        // This is set while we delay the addition of the active layer.
+        boolean activeLayerDelayed = false;
+        List<Layer> layers = getLayers();
+        for (ListIterator<Layer> iterator = layers.listIterator(layers.size()); iterator.hasPrevious();) {
+            Layer l = iterator.previous();
+            if (!l.isVisible()) {
+                // ignored
+            } else if (l == activeLayer && l instanceof OsmDataLayer) {
+                // delay and add after the current block of OsmDataLayer
+                activeLayerDelayed = true;
+            } else {
+                if (activeLayerDelayed && !(l instanceof OsmDataLayer)) {
+                    // add active layer before the current one.
+                    ret.add(activeLayer);
+                    activeLayerDelayed = false;
+                }
+                // Add this layer now
+                ret.add(l);
+            }
+        }
+        if (activeLayerDelayed) {
+            ret.add(activeLayer);
+        }
+        return ret;
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java b/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
index 9eab095..76cb47b 100644
--- a/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
+++ b/src/org/openstreetmap/josm/gui/layer/MapViewPaintable.java
@@ -30,7 +30,6 @@ public interface MapViewPaintable {
          * @param paintable The paintable that is invalidated.
          */
         public PaintableInvalidationEvent(MapViewPaintable paintable) {
-            super();
             this.paintable = paintable;
         }
 
@@ -44,7 +43,7 @@ public interface MapViewPaintable {
 
         @Override
         public String toString() {
-            return "LayerInvalidationEvent [layer=" + paintable + "]";
+            return "LayerInvalidationEvent [layer=" + paintable + ']';
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java b/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
index a663e6a..036fc09 100644
--- a/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/NativeScaleLayer.java
@@ -239,7 +239,7 @@ public interface NativeScaleLayer {
         public String toString() {
             StringBuilder stringBuilder = new StringBuilder();
             for (Scale s: this.scales) {
-                stringBuilder.append(s + "\n");
+                stringBuilder.append(s.toString() + '\n');
             }
             return stringBuilder.toString();
         }
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
index 20e49e2..6cd3c50 100644
--- a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
@@ -10,6 +10,7 @@ import java.awt.AlphaComposite;
 import java.awt.Color;
 import java.awt.Composite;
 import java.awt.Graphics2D;
+import java.awt.GraphicsEnvironment;
 import java.awt.GridBagLayout;
 import java.awt.Point;
 import java.awt.Rectangle;
@@ -157,7 +158,9 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
      */
     public void setRecentRelation(Relation relation) {
         recentRelations.put(relation, null);
-        Main.map.relationListDialog.enableRecentRelations();
+        if (Main.map != null && Main.map.relationListDialog != null) {
+            Main.map.relationListDialog.enableRecentRelations();
+        }
     }
 
     /**
@@ -167,7 +170,9 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
      */
     public void removeRecentRelation(Relation relation) {
         recentRelations.remove(relation);
-        Main.map.relationListDialog.enableRecentRelations();
+        if (Main.map != null && Main.map.relationListDialog != null) {
+            Main.map.relationListDialog.enableRecentRelations();
+        }
     }
 
     protected void setRequiresSaveToFile(boolean newValue) {
@@ -514,7 +519,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
      * @param processed A list of all objects that were actually uploaded.
      *         May be <code>null</code>, which means nothing has been uploaded
      */
-    public void cleanupAfterUpload(final Collection<IPrimitive> processed) {
+    public void cleanupAfterUpload(final Collection<? extends IPrimitive> processed) {
         // return immediately if an upload attempt failed
         if (processed == null || processed.isEmpty())
             return;
@@ -798,7 +803,7 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
             final GpxData gpxData = toGpxData();
             final GpxLayer gpxLayer = new GpxLayer(gpxData, tr("Converted from: {0}", getName()));
             if (getAssociatedFile() != null) {
-                final String filename = getAssociatedFile().getName().replaceAll(Pattern.quote(".gpx.osm") + "$", "") + ".gpx";
+                String filename = getAssociatedFile().getName().replaceAll(Pattern.quote(".gpx.osm") + '$', "") + ".gpx";
                 gpxLayer.setAssociatedFile(new File(getAssociatedFile().getParentFile(), filename));
             }
             Main.main.addLayer(gpxLayer);
@@ -972,6 +977,9 @@ public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S
         if (isDataSetEmpty() && 1 != GuiHelper.runInEDTAndWaitAndReturn(new Callable<Integer>() {
             @Override
             public Integer call() {
+                if (GraphicsEnvironment.isHeadless()) {
+                    return 2;
+                }
                 ExtendedDialog dialog = new ExtendedDialog(
                         Main.parent,
                         tr("Empty document"),
diff --git a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
index aee7604..ff7fd32 100644
--- a/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
@@ -30,7 +30,7 @@ import org.openstreetmap.josm.data.projection.Projection;
  * @author LuVar <lubomir.varga at freemap.sk>
  * @author Dave Hansen <dave at sr71.net>
  * @author Upliner <upliner at gmail.com>
- *
+ * @since 3715
  */
 public class TMSLayer extends AbstractCachedTileSourceLayer<TMSTileSource> implements NativeScaleLayer {
     private static final String CACHE_REGION_NAME = "TMS";
@@ -71,7 +71,7 @@ public class TMSLayer extends AbstractCachedTileSourceLayer<TMSTileSource> imple
      * @throws IllegalArgumentException if url from imagery info is null or invalid
      */
     @Override
-    protected TMSTileSource getTileSource(ImageryInfo info) throws IllegalArgumentException {
+    protected TMSTileSource getTileSource(ImageryInfo info) {
         return getTileSourceStatic(info, new Runnable() {
             @Override
             public void run() {
@@ -103,7 +103,7 @@ public class TMSLayer extends AbstractCachedTileSourceLayer<TMSTileSource> imple
      * @return a new TileSource instance or null if no TileSource for the ImageryInfo/ImageryType could be found.
      * @throws IllegalArgumentException if url from imagery info is null or invalid
      */
-    public static AbstractTMSTileSource getTileSourceStatic(ImageryInfo info) throws IllegalArgumentException {
+    public static AbstractTMSTileSource getTileSourceStatic(ImageryInfo info) {
         return getTileSourceStatic(info, null);
     }
 
@@ -120,7 +120,7 @@ public class TMSLayer extends AbstractCachedTileSourceLayer<TMSTileSource> imple
      * @return a new TileSource instance or null if no TileSource for the ImageryInfo/ImageryType could be found.
      * @throws IllegalArgumentException if url from imagery info is null or invalid
      */
-    public static TMSTileSource getTileSourceStatic(ImageryInfo info, Runnable attributionLoadedTask) throws IllegalArgumentException {
+    public static TMSTileSource getTileSourceStatic(ImageryInfo info, Runnable attributionLoadedTask) {
         if (info.getImageryType() == ImageryType.TMS) {
             TemplatedTMSTileSource.checkUrl(info.getUrl());
             TMSTileSource t = new TemplatedTMSTileSource(info);
diff --git a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
index 82c57d6..51b64c7 100644
--- a/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java
@@ -107,6 +107,7 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
 
     @Override
     public void mergeFrom(Layer from) {
+        // Do nothing
     }
 
     @Override
@@ -121,6 +122,7 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
 
     @Override
     public void visitBoundingBox(BoundingXYVisitor v) {
+        // Do nothing
     }
 
     @Override
@@ -141,10 +143,12 @@ public class ValidatorLayer extends Layer implements LayerChangeListener {
 
     @Override
     public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+        // Do nothing
     }
 
     @Override
     public void layerAdded(Layer newLayer) {
+        // Do nothing
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
index c0deb62..64402b9 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
@@ -53,6 +53,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JSeparator;
 import javax.swing.JSlider;
 import javax.swing.ListSelectionModel;
+import javax.swing.MutableComboBoxModel;
 import javax.swing.SwingConstants;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -309,11 +310,15 @@ public class CorrelateGpxWithImages extends AbstractAction {
                     return;
                 }
 
+                MutableComboBoxModel<GpxDataWrapper> model = (MutableComboBoxModel<GpxDataWrapper>) cbGpx.getModel();
                 loadedGpxData.add(data);
                 if (gpxLst.get(0).file == null) {
                     gpxLst.remove(0);
+                    model.removeElementAt(0);
                 }
-                gpxLst.add(new GpxDataWrapper(sel.getName(), data, sel));
+                GpxDataWrapper elem = new GpxDataWrapper(sel.getName(), data, sel);
+                gpxLst.add(elem);
+                model.addElement(elem);
                 cbGpx.setSelectedIndex(cbGpx.getItemCount() - 1);
             } finally {
                 outerPanel.setCursor(Cursor.getDefaultCursor());
@@ -459,12 +464,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 @Override
                 public void valueChanged(ListSelectionEvent arg0) {
                     int index = imgList.getSelectedIndex();
-                    Integer orientation = null;
-                    try {
-                        orientation = ExifReader.readOrientation(yLayer.data.get(index).getFile());
-                    } catch (Exception e) {
-                        Main.warn(e);
-                    }
+                    Integer orientation = ExifReader.readOrientation(yLayer.data.get(index).getFile());
                     imgDisp.setImage(yLayer.data.get(index).getFile(), orientation);
                     Date date = yLayer.data.get(index).getExifTime();
                     if (date != null) {
@@ -494,20 +494,10 @@ public class CorrelateGpxWithImages extends AbstractAction {
                         return;
                     File sel = fc.getSelectedFile();
 
-                    Integer orientation = null;
-                    try {
-                        orientation = ExifReader.readOrientation(sel);
-                    } catch (Exception e) {
-                        Main.warn(e);
-                    }
+                    Integer orientation = ExifReader.readOrientation(sel);
                     imgDisp.setImage(sel, orientation);
 
-                    Date date = null;
-                    try {
-                        date = ExifReader.readTime(sel);
-                    } catch (Exception e) {
-                        Main.warn(e);
-                    }
+                    Date date = ExifReader.readTime(sel);
                     if (date != null) {
                         lbExifTime.setText(DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM).format(date));
                         tfGpsTime.setText(DateUtils.getDateFormat(DateFormat.SHORT).format(date)+' ');
@@ -792,6 +782,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
 
         @Override
         public void changedUpdate(DocumentEvent ev) {
+            // Do nothing
         }
 
         @Override
@@ -918,9 +909,9 @@ public class CorrelateGpxWithImages extends AbstractAction {
 
                     lblTimezone.setText(tr("Timezone: {0}", timezone.formatTimezone()));
                     lblMinutes.setText(tr("Minutes: {0}", sldMinutes.getValue()));
-                    lblSeconds.setText(tr("Seconds: {0}", Offset.milliseconds(100 * sldSeconds.getValue()).formatOffset()));
+                    lblSeconds.setText(tr("Seconds: {0}", Offset.milliseconds(100L * sldSeconds.getValue()).formatOffset()));
 
-                    delta = Offset.milliseconds(100 * sldSeconds.getValue()
+                    delta = Offset.milliseconds(100L * sldSeconds.getValue()
                             + 1000L * 60 * sldMinutes.getValue()
                             + 1000L * 60 * 60 * 24 * dayOffset);
 
@@ -960,7 +951,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 sldMinutes.setValue((int) (timezoneOffsetPair.b.getSeconds() / 60));
                 final long deciSeconds = timezoneOffsetPair.b.getMilliseconds() / 100;
                 sldSeconds.setValue((int) (deciSeconds % 60));
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 JOptionPane.showMessageDialog(Main.parent,
                         tr("An error occurred while trying to match the photos to the GPX track."
                                 +" You can adjust the sliders to manually match the photos."),
@@ -1008,14 +999,10 @@ public class CorrelateGpxWithImages extends AbstractAction {
         outer: for (GpxTrack trk : gpx.tracks) {
             for (GpxTrackSegment segment : trk.getSegments()) {
                 for (WayPoint curWp : segment.getWayPoints()) {
-                    try {
-                        final Date parsedTime = curWp.setTimeFromAttribute();
-                        if (parsedTime != null) {
-                            firstGPXDate = parsedTime.getTime();
-                            break outer;
-                        }
-                    } catch (Exception e) {
-                        Main.warn(e);
+                    final Date parsedTime = curWp.setTimeFromAttribute();
+                    if (parsedTime != null) {
+                        firstGPXDate = parsedTime.getTime();
+                        break outer;
                     }
                 }
             }
@@ -1143,18 +1130,14 @@ public class CorrelateGpxWithImages extends AbstractAction {
                 WayPoint prevWp = null;
 
                 for (WayPoint curWp : segment.getWayPoints()) {
-                    try {
-                        final Date parsedTime = curWp.setTimeFromAttribute();
-                        if (parsedTime != null) {
-                            final long curWpTime = parsedTime.getTime() + offset;
-                            ret += matchPoints(images, prevWp, prevWpTime, curWp, curWpTime, offset);
-
-                            prevWp = curWp;
-                            prevWpTime = curWpTime;
-                            continue;
-                        }
-                    } catch (Exception e) {
-                        Main.warn(e);
+                    final Date parsedTime = curWp.setTimeFromAttribute();
+                    if (parsedTime != null) {
+                        final long curWpTime = parsedTime.getTime() + offset;
+                        ret += matchPoints(images, prevWp, prevWpTime, curWp, curWpTime, offset);
+
+                        prevWp = curWp;
+                        prevWpTime = curWpTime;
+                        continue;
                     }
                     prevWp = null;
                     prevWpTime = 0;
@@ -1168,7 +1151,7 @@ public class CorrelateGpxWithImages extends AbstractAction {
         String value = wp.getString(GpxConstants.PT_ELE);
         if (value != null && !value.isEmpty()) {
             try {
-                return new Double(value);
+                return Double.valueOf(value);
             } catch (NumberFormatException e) {
                 Main.warn(e);
             }
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
index 4286aab..70ab30c 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
@@ -899,6 +899,7 @@ public class GeoImageLayer extends AbstractModifiableLayer implements PropertyCh
 
             @Override
             public void layerAdded(Layer newLayer) {
+                // Do nothing
             }
 
             @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
index 434b875..b8987cc 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
@@ -401,14 +401,17 @@ public class ImageDisplay extends JComponent {
 
         @Override
         public void mouseEntered(MouseEvent e) {
+            // Do nothing
         }
 
         @Override
         public void mouseExited(MouseEvent e) {
+            // Do nothing
         }
 
         @Override
         public void mouseMoved(MouseEvent e) {
+            // Do nothing
         }
 
         private void checkPointInVisibleRect(Point p, Rectangle visibleRect) {
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
index 9d712fc..403da40 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageEntry.java
@@ -491,7 +491,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
             }
             // default is K (km/h)
             setSpeed(speed);
-        } catch (Exception ex) {
+        } catch (MetadataException ex) {
             if (Main.isDebugEnabled()) {
                 Main.debug(ex.getMessage());
             }
@@ -515,7 +515,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
             setExifCoor(latlon);
             setPos(getExifCoor());
 
-        } catch (Exception ex) { // (other exceptions, e.g. #5271)
+        } catch (MetadataException | IndexOutOfBoundsException ex) { // (other exceptions, e.g. #5271)
             Main.error("Error reading EXIF from file: " + ex);
             setExifCoor(null);
             setPos(null);
@@ -526,7 +526,7 @@ public final class ImageEntry implements Comparable<ImageEntry>, Cloneable {
             if (direction != null) {
                 setExifImgDir(direction);
             }
-        } catch (Exception ex) { // (CompoundException and other exceptions, e.g. #5271)
+        } catch (IndexOutOfBoundsException ex) { // (other exceptions, e.g. #5271)
             if (Main.isDebugEnabled()) {
                 Main.debug(ex.getMessage());
             }
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
index e559e1d..63c5960 100644
--- a/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
+++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoader.java
@@ -94,7 +94,7 @@ public class ThumbsLoader implements Runnable {
     }
 
     private BufferedImage loadThumb(ImageEntry entry) {
-        final String cacheIdent = entry.getFile()+":"+maxSize;
+        final String cacheIdent = entry.getFile().toString()+':'+maxSize;
 
         if (!cacheOff && cache != null) {
             try {
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
index 60bfc8b..95eaf64 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
@@ -118,6 +118,7 @@ public class DownloadAlongTrackAction extends DownloadAlongAction {
 
             @Override
             protected void finish() {
+                // Do nothing
             }
 
             @Override
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
index 872fb78..f4c51c5 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
@@ -59,13 +59,13 @@ public class DownloadWmsAlongTrackAction extends AbstractAction {
         @Override
         protected void realRun() throws SAXException, IOException, OsmTransferException {
             precacheTask = layer.downloadAreaToCache(progressMonitor, points, 0, 0);
-            while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
-                synchronized (this) {
-                    try {
+            synchronized (this) {
+                try {
+                    while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
                         wait(200);
-                    } catch (InterruptedException ex) {
-                        Main.warn("InterruptedException in "+getClass().getSimpleName()+" while precaching WMS");
                     }
+                } catch (InterruptedException ex) {
+                    Main.warn("InterruptedException in "+getClass().getSimpleName()+" while precaching WMS");
                 }
             }
         }
diff --git a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
index 2ca6174..740f6a0 100644
--- a/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
+++ b/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
@@ -18,6 +18,8 @@ import java.util.Date;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SystemOfMeasurement;
+import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -29,7 +31,7 @@ import org.openstreetmap.josm.tools.ColorScale;
  * Class that helps to draw large set of GPS tracks with different colors and options
  * @since 7319
  */
-public class GpxDrawHelper {
+public class GpxDrawHelper implements SoMChangeListener {
     private final GpxData data;
 
     // draw lines between points belonging to different segments
@@ -96,11 +98,21 @@ public class GpxDrawHelper {
 
     private void setupColors() {
         hdopAlpha = Main.pref.getInteger("hdop.color.alpha", -1);
-        velocityScale = ColorScale.createHSBScale(256).addTitle(tr("Velocity, km/h"));
+        velocityScale = ColorScale.createHSBScale(256);
         /** Colors (without custom alpha channel, if given) for HDOP painting. **/
-        hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP, m"));
+        hdopScale = ColorScale.createHSBScale(256).makeReversed().addTitle(tr("HDOP"));
         dateScale = ColorScale.createHSBScale(256).addTitle(tr("Time"));
         directionScale = ColorScale.createCyclicScale(256).setIntervalCount(4).addTitle(tr("Direction"));
+        systemOfMeasurementChanged(null, null);
+    }
+
+    @Override
+    public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
+        SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
+        velocityScale.addTitle(tr("Velocity, {0}", som.speedName));
+        if (Main.isDisplayingMapView() && oldSoM != null && newSoM != null) {
+            Main.map.mapView.repaint();
+        }
     }
 
     /**
@@ -151,7 +163,7 @@ public class GpxDrawHelper {
         try {
             int i = Main.pref.getInteger("draw.rawgps.colors", specName(layerName), 0);
             return ColorMode.fromIndex(i);
-        } catch (Exception e) {
+        } catch (IndexOutOfBoundsException e) {
             Main.warn(e);
         }
         return ColorMode.NONE;
@@ -345,6 +357,7 @@ public class GpxDrawHelper {
                             color = dateScale.getNoDataColor();
                         }
                         break;
+                    default: // Do nothing
                     }
                     if (!noDraw && (maxLineLength == -1 || dist <= maxLineLength)) {
                         trkPnt.drawLine = true;
@@ -405,7 +418,7 @@ public class GpxDrawHelper {
                             && (oldA == null || screen.x < oldA.x - delta || screen.x > oldA.x + delta
                             || screen.y < oldA.y - delta || screen.y > oldA.y + delta)) {
                         g.setColor(trkPnt.customColoring);
-                        double t = Math.atan2(screen.y - old.y, screen.x - old.x) + Math.PI;
+                        double t = Math.atan2((double) screen.y - old.y, (double) screen.x - old.x) + Math.PI;
                         g.drawLine(screen.x, screen.y, (int) (screen.x + 10 * Math.cos(t - PHI)),
                                 (int) (screen.y + 10 * Math.sin(t - PHI)));
                         g.drawLine(screen.x, screen.y, (int) (screen.x + 10 * Math.cos(t + PHI)),
@@ -556,7 +569,8 @@ public class GpxDrawHelper {
         if (colored == ColorMode.HDOP) {
             hdopScale.drawColorBar(g, w-30, 50, 20, 100, 1.0);
         } else if (colored == ColorMode.VELOCITY) {
-            velocityScale.drawColorBar(g, w-30, 50, 20, 100, 3.6);
+            SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
+            velocityScale.drawColorBar(g, w-30, 50, 20, 100, som.speedValue);
         } else if (colored == ColorMode.DIRECTION) {
             directionScale.drawColorBar(g, w-30, 50, 20, 100, 180.0/Math.PI);
         }
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java
index c92cc6e..5455cee 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/ButtonMarker.java
@@ -65,7 +65,7 @@ public class ButtonMarker extends Marker {
         b.paintBorder(mv, g, r.x, r.y, r.width, r.height);
 
         String labelText = getText();
-        if ((labelText != null) && showTextOrIcon && Main.pref.getBoolean("marker.buttonlabels", true)) {
+        if (labelText != null && Main.pref.getBoolean("marker.buttonlabels", true)) {
             g.drawString(labelText, screen.x+4, screen.y+2);
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
index 704a5c7..daaa073 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
@@ -387,6 +387,7 @@ public class Marker implements TemplateEngineDataProvider {
      * @param ev A dummy ActionEvent
      */
     public void actionPerformed(ActionEvent ev) {
+        // Do nothing
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
index 4236d95..7f7724a 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java
@@ -221,19 +221,20 @@ public class MarkerLayer extends Layer implements JumpToMarkerLayer {
 
     @Override
     public String getToolTipText() {
-        return data.size()+" "+trn("marker", "markers", data.size());
+        return Integer.toString(data.size())+' '+trn("marker", "markers", data.size());
     }
 
     @Override
     public void mergeFrom(Layer from) {
-        MarkerLayer layer = (MarkerLayer) from;
-        data.addAll(layer.data);
-        Collections.sort(data, new Comparator<Marker>() {
-            @Override
-            public int compare(Marker o1, Marker o2) {
-                return Double.compare(o1.time, o2.time);
-            }
-        });
+        if (from instanceof MarkerLayer) {
+            data.addAll(((MarkerLayer) from).data);
+            Collections.sort(data, new Comparator<Marker>() {
+                @Override
+                public int compare(Marker o1, Marker o2) {
+                    return Double.compare(o1.time, o2.time);
+                }
+            });
+        }
     }
 
     @Override public boolean isMergable(Layer other) {
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
index 9b99a35..c2a1572 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
@@ -50,12 +50,7 @@ public final class PlayHeadMarker extends Marker {
      */
     public static PlayHeadMarker create() {
         if (playHead == null) {
-            try {
-                playHead = new PlayHeadMarker();
-            } catch (Exception ex) {
-                Main.error(ex);
-                return null;
-            }
+            playHead = new PlayHeadMarker();
         }
         return playHead;
     }
diff --git a/src/org/openstreetmap/josm/gui/layer/markerlayer/WebMarker.java b/src/org/openstreetmap/josm/gui/layer/markerlayer/WebMarker.java
index 99e49c4..c29369f 100644
--- a/src/org/openstreetmap/josm/gui/layer/markerlayer/WebMarker.java
+++ b/src/org/openstreetmap/josm/gui/layer/markerlayer/WebMarker.java
@@ -65,7 +65,7 @@ public class WebMarker extends ButtonMarker {
             String path = webUrl.getPath();
             try {
                 setErroneous(path.isEmpty() || !new File(path).exists());
-            } catch (Exception e) {
+            } catch (SecurityException e) {
                 Main.warn(e);
                 setErroneous(true);
             }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/Cascade.java b/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
index 3c61ae5..04ad894 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
@@ -7,6 +7,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.TreeSet;
 import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.Main;
@@ -128,7 +129,7 @@ public final class Cascade implements Cloneable {
                 return Float.valueOf((String) o);
             } catch (NumberFormatException e) {
                 if (Main.isDebugEnabled()) {
-                    Main.debug("'"+o+"' cannot be converted to float");
+                    Main.debug('\'' + (String) o + "' cannot be converted to float");
                 }
             }
         }
@@ -205,17 +206,24 @@ public final class Cascade implements Cloneable {
     @Override
     public String toString() {
         StringBuilder res = new StringBuilder("Cascade{ ");
+        // List properties in alphabetical order to be deterministic, without changing "prop" to a TreeMap
+        // (no reason too, not sure about the potential memory/performance impact of such a change)
+        TreeSet<String> props = new TreeSet<>();
         for (Entry<String, Object> entry : prop.entrySet()) {
-            res.append(entry.getKey()+':');
+            StringBuilder sb = new StringBuilder(entry.getKey()).append(':');
             Object val = entry.getValue();
             if (val instanceof float[]) {
-                res.append(Arrays.toString((float[]) val));
+                sb.append(Arrays.toString((float[]) val));
             } else if (val instanceof Color) {
-                res.append(Utils.toString((Color) val));
+                sb.append(Utils.toString((Color) val));
             } else if (val != null) {
-                res.append(val);
+                sb.append(val);
             }
-            res.append("; ");
+            sb.append("; ");
+            props.add(sb.toString());
+        }
+        for (String s : props) {
+            res.append(s);
         }
         return res.append('}').toString();
     }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/DividedScale.java b/src/org/openstreetmap/josm/gui/mappaint/DividedScale.java
index 50f6002..e4ba07e 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/DividedScale.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/DividedScale.java
@@ -22,12 +22,14 @@ import org.openstreetmap.josm.tools.Pair;
  */
 public class DividedScale<T> {
 
-    // this exception type is for debugging #8997 and can later be replaced
-    // by AssertionError
-    public static class RangeViolatedError extends Error {
-        public RangeViolatedError() {
-        }
-
+    /**
+     * This exception type is for debugging #8997 and can later be replaced by AssertionError
+     */
+    public static class RangeViolatedError extends RuntimeException {
+        /**
+         * Constructs a new {@code RangeViolatedError}
+         * @param message error message
+         */
         public RangeViolatedError(String message) {
             super(message);
         }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
index 0a343ac..6959fe3 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
@@ -97,7 +97,8 @@ public class MapPaintMenu extends JMenu implements MapPaintSylesUpdateListener {
             final String k = style.getDisplayString();
             MapPaintAction a = actions.get(k);
             if (a == null) {
-                actions.put(k, a = new MapPaintAction(style));
+                a = new MapPaintAction(style);
+                actions.put(k, a);
                 add(a.getButton());
             } else {
                 a.setStyle(style);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
index e08b72b..6a3435e 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Condition.java
@@ -118,7 +118,7 @@ public abstract class Condition {
         /** The value needs to contain the reference string. */
         CONTAINS;
 
-        protected static final Set<Op> NEGATED_OPS = EnumSet.of(NEQ, NREGEX);
+        static final Set<Op> NEGATED_OPS = EnumSet.of(NEQ, NREGEX);
 
         /**
          * Evaluates a value against a reference string.
@@ -742,6 +742,10 @@ public abstract class Condition {
 
         private final Expression e;
 
+        /**
+         * Constructs a new {@code ExpressionFactory}
+         * @param e expression
+         */
         public ExpressionCondition(Expression e) {
             this.e = e;
         }
@@ -754,7 +758,7 @@ public abstract class Condition {
 
         @Override
         public String toString() {
-            return "[" + e + ']';
+            return '[' + e.toString() + ']';
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/LiteralExpression.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/LiteralExpression.java
index 2414645..cc2af3a 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/LiteralExpression.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/LiteralExpression.java
@@ -8,10 +8,15 @@ import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
  * Simple literal value, that does not depend on other expressions.
+ * @since 5705
  */
 public class LiteralExpression implements Expression {
     private final Object literal;
 
+    /**
+     * Constructs a new {@code LiteralExpression}.
+     * @param literal literal
+     */
     public LiteralExpression(Object literal) {
         CheckParameterUtil.ensureParameterNotNull(literal);
         this.literal = literal;
@@ -27,6 +32,6 @@ public class LiteralExpression implements Expression {
         if (literal instanceof float[]) {
             return Arrays.toString((float[]) literal);
         }
-        return "<" + literal + '>';
+        return '<' + literal.toString() + '>';
     }
 }
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
index deedbab..14dfd73 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
@@ -638,8 +638,8 @@ public class MapCSSStyleSource extends StyleSource {
         while (candidates.hasNext()) {
             MapCSSRule r = candidates.next();
             env.clearSelectorMatchingInformation();
-            env.layer = null;
-            String sub = env.layer = r.selector.getSubpart().getId(env);
+            env.layer = r.selector.getSubpart().getId(env);
+            String sub = env.layer;
             if (r.selector.matches(env)) { // as side effect env.parent will be set (if s is a child selector)
                 Selector s = r.selector;
                 if (s.getRange().contains(scale)) {
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
index 63df174..b209e9c 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
@@ -434,7 +434,7 @@ public interface Selector {
 
         @Override
         public String toString() {
-            return left + " " + (ChildOrParentSelectorType.PARENT.equals(type) ? '<' : '>') + link + ' ' + right;
+            return left.toString() + ' ' + (ChildOrParentSelectorType.PARENT.equals(type) ? '<' : '>') + link + ' ' + right;
         }
     }
 
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
index 2a26fe1..02843eb 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
@@ -119,7 +119,6 @@ public class BoxTextElement extends StyleElement {
 
     public static BoxTextElement create(Environment env, BoxProvider boxProvider, Rectangle box) {
         initDefaultParameters();
-        Cascade c = env.mc.getCascade(env.layer);
 
         TextLabel text = TextLabel.create(env, DEFAULT_TEXT_COLOR, false);
         if (text == null) return null;
@@ -128,21 +127,22 @@ public class BoxTextElement extends StyleElement {
         // repaint. This way, one BoxTextElement object can be used by multiple primitives (to save memory).
         if (text.labelCompositionStrategy.compose(env.osm) == null) return null;
 
-        HorizontalTextAlignment hAlign = HorizontalTextAlignment.RIGHT;
-        Keyword hAlignKW = c.get(TEXT_ANCHOR_HORIZONTAL, Keyword.RIGHT, Keyword.class);
-        switch (hAlignKW.val) {
+        Cascade c = env.mc.getCascade(env.layer);
+
+        HorizontalTextAlignment hAlign;
+        switch (c.get(TEXT_ANCHOR_HORIZONTAL, Keyword.RIGHT, Keyword.class).val) {
             case "left":
                 hAlign = HorizontalTextAlignment.LEFT;
                 break;
             case "center":
                 hAlign = HorizontalTextAlignment.CENTER;
-        }
-        VerticalTextAlignment vAlign = VerticalTextAlignment.BOTTOM;
-        Keyword vAlignKW = c.get(TEXT_ANCHOR_VERTICAL, Keyword.BOTTOM, Keyword.class);
-        switch (vAlignKW.val) {
-            case "bottom":
-                vAlign = VerticalTextAlignment.BOTTOM;
                 break;
+            case "right":
+            default:
+                hAlign = HorizontalTextAlignment.RIGHT;
+        }
+        VerticalTextAlignment vAlign;
+        switch (c.get(TEXT_ANCHOR_VERTICAL, Keyword.BOTTOM, Keyword.class).val) {
             case "above":
                 vAlign = VerticalTextAlignment.ABOVE;
                 break;
@@ -154,6 +154,10 @@ public class BoxTextElement extends StyleElement {
                 break;
             case "below":
                 vAlign = VerticalTextAlignment.BELOW;
+                break;
+            case "bottom":
+            default:
+                vAlign = VerticalTextAlignment.BOTTOM;
         }
 
         return new BoxTextElement(c, text, boxProvider, box, hAlign, vAlign);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
index a43fc00..d4bf25d 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/LabelCompositionStrategy.java
@@ -268,7 +268,7 @@ public abstract class LabelCompositionStrategy {
 
         @Override
         public String toString() {
-            return "{" + getClass().getSimpleName() +'}';
+            return '{' + getClass().getSimpleName() + '}';
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
index 0eee3b9..9ac3b28 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
@@ -22,6 +22,7 @@ import org.openstreetmap.josm.gui.mappaint.StyleElementList;
 import org.openstreetmap.josm.gui.mappaint.styleelement.BoxTextElement.BoxProvider;
 import org.openstreetmap.josm.gui.mappaint.styleelement.BoxTextElement.SimpleBoxProvider;
 import org.openstreetmap.josm.gui.util.RotationAngle;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -78,6 +79,8 @@ public class NodeElement extends StyleElement {
         }
     }
 
+    private static final String[] ICON_KEYS = {ICON_IMAGE, ICON_WIDTH, ICON_HEIGHT, ICON_OPACITY, ICON_OFFSET_X, ICON_OFFSET_Y};
+
     public static final NodeElement SIMPLE_NODE_ELEMSTYLE;
     public static final BoxProvider SIMPLE_NODE_ELEMSTYLE_BOXPROVIDER;
     static {
@@ -141,6 +144,9 @@ public class NodeElement extends StyleElement {
     }
 
     public static MapImage createIcon(final Environment env, final String[] keys) {
+        CheckParameterUtil.ensureParameterNotNull(env, "env");
+        CheckParameterUtil.ensureParameterNotNull(keys, "keys");
+
         Cascade c = env.mc.getCascade(env.layer);
 
         final IconReference iconRef = c.get(keys[ICON_IMAGE_IDX], null, IconReference.class, true);
@@ -240,7 +246,7 @@ public class NodeElement extends StyleElement {
         }
 
         Stroke stroke = null;
-        if (strokeColor != null) {
+        if (strokeColor != null && strokeWidth != null) {
             Integer strokeAlpha = Utils.color_float2int(c.get("symbol-stroke-opacity", null, Float.class));
             if (strokeAlpha != null) {
                 strokeColor = new Color(strokeColor.getRed(), strokeColor.getGreen(),
@@ -372,9 +378,8 @@ public class NodeElement extends StyleElement {
     }
 
     @Override
-
     public String toString() {
-        StringBuilder s = new StringBuilder("NodeElemStyle{");
+        StringBuilder s = new StringBuilder(64).append("NodeElemStyle{");
         s.append(super.toString());
         if (mapImage != null) {
             s.append(" icon=[" + mapImage + ']');
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
index ca412dc..511f641 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
@@ -22,6 +22,9 @@ public class RepeatImageElement extends StyleElement {
     public float phase;
     public LineImageAlignment align;
 
+    private static final String[] REPEAT_IMAGE_KEYS = {REPEAT_IMAGE, REPEAT_IMAGE_WIDTH, REPEAT_IMAGE_HEIGHT, REPEAT_IMAGE_OPACITY,
+            null, null};
+
     public RepeatImageElement(Cascade c, MapImage pattern, float offset, float spacing, float phase, LineImageAlignment align) {
         super(c, 2.9f);
         CheckParameterUtil.ensureParameterNotNull(pattern);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
index 88c21ed..e60d028 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
@@ -23,9 +23,6 @@ public abstract class StyleElement implements StyleKeys {
     protected static final int ICON_OPACITY_IDX = 3;
     protected static final int ICON_OFFSET_X_IDX = 4;
     protected static final int ICON_OFFSET_Y_IDX = 5;
-    protected static final String[] ICON_KEYS = {ICON_IMAGE, ICON_WIDTH, ICON_HEIGHT, ICON_OPACITY, ICON_OFFSET_X, ICON_OFFSET_Y};
-    protected static final String[] REPEAT_IMAGE_KEYS = {REPEAT_IMAGE, REPEAT_IMAGE_WIDTH, REPEAT_IMAGE_HEIGHT, REPEAT_IMAGE_OPACITY,
-            null, null};
 
     public float majorZIndex;
     public float zIndex;
diff --git a/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
index 15c5056..dd06b88 100644
--- a/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/AbstractAuthorizationUI.java
@@ -21,11 +21,14 @@ public abstract class AbstractAuthorizationUI extends VerticallyScrollablePanel
     public static final String ACCESS_TOKEN_PROP = AbstractAuthorizationUI.class.getName() + ".accessToken";
 
     private String apiUrl;
-    private final AdvancedOAuthPropertiesPanel pnlAdvancedProperties;
+    private final AdvancedOAuthPropertiesPanel pnlAdvancedProperties = new AdvancedOAuthPropertiesPanel();
     private transient OAuthToken accessToken;
 
-    protected void fireAccessTokenChanged(OAuthToken oldValue, OAuthToken newValue) {
-        firePropertyChange(ACCESS_TOKEN_PROP, oldValue, newValue);
+    /**
+     * Constructs a new {@code AbstractAuthorizationUI} without API URL.
+     * @since 10189
+     */
+    public AbstractAuthorizationUI() {
     }
 
     /**
@@ -34,10 +37,13 @@ public abstract class AbstractAuthorizationUI extends VerticallyScrollablePanel
      * @since 5422
      */
     public AbstractAuthorizationUI(String apiUrl) {
-        pnlAdvancedProperties = new AdvancedOAuthPropertiesPanel();
         setApiUrl(apiUrl);
     }
 
+    protected void fireAccessTokenChanged(OAuthToken oldValue, OAuthToken newValue) {
+        firePropertyChange(ACCESS_TOKEN_PROP, oldValue, newValue);
+    }
+
     /**
      * Replies the URL of the OSM API for which this UI is currently trying to retrieve an OAuth
      * Access Token
diff --git a/src/org/openstreetmap/josm/gui/oauth/AccessTokenInfoPanel.java b/src/org/openstreetmap/josm/gui/oauth/AccessTokenInfoPanel.java
index f9c8fb5..450b6e7 100644
--- a/src/org/openstreetmap/josm/gui/oauth/AccessTokenInfoPanel.java
+++ b/src/org/openstreetmap/josm/gui/oauth/AccessTokenInfoPanel.java
@@ -17,13 +17,20 @@ import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
 /**
  * Displays the key and the secret of an OAuth Access Token.
- *
+ * @since 2746
  */
 public class AccessTokenInfoPanel extends JPanel {
 
-    private JosmTextField tfAccessTokenKey;
-    private JosmTextField tfAccessTokenSecret;
-    private JCheckBox cbSaveAccessTokenInPreferences;
+    private final JosmTextField tfAccessTokenKey = new JosmTextField();
+    private final JosmTextField tfAccessTokenSecret = new JosmTextField();
+    private final JCheckBox cbSaveAccessTokenInPreferences = new JCheckBox(tr("Save Access Token in preferences"));
+
+    /**
+     * Constructs a new {@code AccessTokenInfoPanel}.
+     */
+    public AccessTokenInfoPanel() {
+        build();
+    }
 
     protected final void build() {
         setLayout(new GridBagLayout());
@@ -38,7 +45,7 @@ public class AccessTokenInfoPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfAccessTokenKey = new JosmTextField(), gc);
+        add(tfAccessTokenKey, gc);
         tfAccessTokenKey.setEditable(false);
 
         // the access token secret
@@ -50,14 +57,14 @@ public class AccessTokenInfoPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfAccessTokenSecret = new JosmTextField(), gc);
+        add(tfAccessTokenSecret, gc);
         tfAccessTokenSecret.setEditable(false);
 
         // the checkbox
         gc.gridx = 0;
         gc.gridy = 2;
         gc.gridwidth = 2;
-        add(cbSaveAccessTokenInPreferences = new JCheckBox(tr("Save Access Token in preferences")), gc);
+        add(cbSaveAccessTokenInPreferences, gc);
         cbSaveAccessTokenInPreferences.setToolTipText(tr(
                 "<html>Select to save the Access Token in the JOSM preferences.<br>"
                 + "Unselect to use the Access Token in this JOSM session only.</html>"
@@ -74,10 +81,6 @@ public class AccessTokenInfoPanel extends JPanel {
         add(new JPanel(), gc);
     }
 
-    public AccessTokenInfoPanel() {
-        build();
-    }
-
     /**
      * Displays the key and secret in <code>token</code>.
      *
diff --git a/src/org/openstreetmap/josm/gui/oauth/AdvancedOAuthPropertiesPanel.java b/src/org/openstreetmap/josm/gui/oauth/AdvancedOAuthPropertiesPanel.java
index 0469cb6..b3d247a 100644
--- a/src/org/openstreetmap/josm/gui/oauth/AdvancedOAuthPropertiesPanel.java
+++ b/src/org/openstreetmap/josm/gui/oauth/AdvancedOAuthPropertiesPanel.java
@@ -43,17 +43,24 @@ import org.openstreetmap.josm.tools.ImageProvider;
  */
 public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
-    private JCheckBox cbUseDefaults;
-    private JosmTextField tfConsumerKey;
-    private JosmTextField tfConsumerSecret;
-    private JosmTextField tfRequestTokenURL;
-    private JosmTextField tfAccessTokenURL;
-    private JosmTextField tfAuthoriseURL;
-    private JosmTextField tfOsmLoginURL;
-    private JosmTextField tfOsmLogoutURL;
+    private final JCheckBox cbUseDefaults = new JCheckBox(tr("Use default settings"));
+    private final JosmTextField tfConsumerKey = new JosmTextField();
+    private final JosmTextField tfConsumerSecret = new JosmTextField();
+    private final JosmTextField tfRequestTokenURL = new JosmTextField();
+    private final JosmTextField tfAccessTokenURL = new JosmTextField();
+    private final JosmTextField tfAuthoriseURL = new JosmTextField();
+    private final JosmTextField tfOsmLoginURL = new JosmTextField();
+    private final JosmTextField tfOsmLogoutURL = new JosmTextField();
     private transient UseDefaultItemListener ilUseDefault;
     private String apiUrl;
 
+    /**
+     * Constructs a new {@code AdvancedOAuthPropertiesPanel}.
+     */
+    public AdvancedOAuthPropertiesPanel() {
+        build();
+    }
+
     protected final void build() {
         setLayout(new GridBagLayout());
         setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
@@ -64,7 +71,6 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
         gc.weightx = 1.0;
         gc.insets = new Insets(0, 0, 3, 3);
         gc.gridwidth = 2;
-        cbUseDefaults = new JCheckBox(tr("Use default settings"));
         add(cbUseDefaults, gc);
 
         // -- consumer key
@@ -75,7 +81,7 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfConsumerKey = new JosmTextField(), gc);
+        add(tfConsumerKey, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfConsumerKey);
 
         // -- consumer secret
@@ -86,7 +92,7 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfConsumerSecret = new JosmTextField(), gc);
+        add(tfConsumerSecret, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfConsumerSecret);
 
         // -- request token URL
@@ -97,7 +103,7 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfRequestTokenURL = new JosmTextField(), gc);
+        add(tfRequestTokenURL, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfRequestTokenURL);
 
         // -- access token URL
@@ -108,10 +114,9 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfAccessTokenURL = new JosmTextField(), gc);
+        add(tfAccessTokenURL, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfAccessTokenURL);
 
-
         // -- authorise URL
         gc.gridy = 5;
         gc.gridx = 0;
@@ -120,10 +125,9 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfAuthoriseURL = new JosmTextField(), gc);
+        add(tfAuthoriseURL, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfAuthoriseURL);
 
-
         // -- OSM login URL
         gc.gridy = 6;
         gc.gridx = 0;
@@ -132,10 +136,9 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfOsmLoginURL = new JosmTextField(), gc);
+        add(tfOsmLoginURL, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfOsmLoginURL);
 
-
         // -- OSM logout URL
         gc.gridy = 7;
         gc.gridx = 0;
@@ -144,10 +147,11 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfOsmLogoutURL = new JosmTextField(), gc);
+        add(tfOsmLogoutURL, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfOsmLogoutURL);
 
-        cbUseDefaults.addItemListener(ilUseDefault = new UseDefaultItemListener());
+        ilUseDefault = new UseDefaultItemListener();
+        cbUseDefaults.addItemListener(ilUseDefault);
     }
 
     protected boolean hasCustomSettings() {
@@ -250,13 +254,6 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
     }
 
     /**
-     * Constructs a new {@code AdvancedOAuthPropertiesPanel}.
-     */
-    public AdvancedOAuthPropertiesPanel() {
-        build();
-    }
-
-    /**
      * Initializes the panel from the values in the preferences <code>preferences</code>.
      *
      * @param pref the preferences. Must not be null.
@@ -308,6 +305,7 @@ public class AdvancedOAuthPropertiesPanel extends VerticallyScrollablePanel {
             case ItemEvent.DESELECTED:
                 setChildComponentsEnabled(true);
                 break;
+            default: // Do nothing
             }
         }
 
diff --git a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
index 445e503..3082bc0 100644
--- a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUI.java
@@ -59,11 +59,11 @@ import org.xml.sax.SAXException;
  */
 public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
-    private JosmTextField tfUserName;
-    private JosmPasswordField tfPassword;
+    private final JosmTextField tfUserName = new JosmTextField();
+    private final JosmPasswordField tfPassword = new JosmPasswordField();
     private transient UserNameValidator valUserName;
     private transient PasswordValidator valPassword;
-    private AccessTokenInfoPanel pnlAccessTokenInfo;
+    private final AccessTokenInfoPanel pnlAccessTokenInfo = new AccessTokenInfoPanel();
     private OsmPrivilegesPanel pnlOsmPrivileges;
     private JPanel pnlPropertiesPanel;
     private JPanel pnlActionButtonsPanel;
@@ -119,7 +119,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfUserName = new JosmTextField(), gc);
+        pnl.add(tfUserName, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfUserName);
         valUserName = new UserNameValidator(tfUserName);
         valUserName.validate();
@@ -134,7 +134,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfPassword = new JosmPasswordField(), gc);
+        pnl.add(tfPassword, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfPassword);
         valPassword = new PasswordValidator(tfPassword);
         valPassword.validate();
@@ -231,7 +231,7 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
         // infos about the access token
         gc.gridy = 1;
         gc.insets = new Insets(5, 0, 0, 0);
-        pnl.add(pnlAccessTokenInfo = new AccessTokenInfoPanel(), gc);
+        pnl.add(pnlAccessTokenInfo, gc);
 
         // the actions
         JPanel pnl1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
@@ -410,7 +410,9 @@ public class FullyAutomaticAuthorizationUI extends AbstractAuthorizationUI {
         }
 
         @Override
-        protected void finish() {}
+        protected void finish() {
+            // Do nothing
+        }
 
         protected void alertAuthorisationFailed(OsmOAuthAuthorizationException e) {
             HelpAwareOptionPane.showOptionDialog(
diff --git a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanel.java b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanel.java
index 4a6f98e..64f4114 100644
--- a/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanel.java
+++ b/src/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanel.java
@@ -18,8 +18,27 @@ import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 
 public class FullyAutomaticPropertiesPanel extends JPanel {
 
-    private JosmTextField tfUserName;
-    private JosmPasswordField tfPassword;
+    private final JosmTextField tfUserName = new JosmTextField();
+    private final JosmPasswordField tfPassword = new JosmPasswordField();
+
+    /**
+     * Constructs a new {@code FullyAutomaticPropertiesPanel}.
+     */
+    public FullyAutomaticPropertiesPanel() {
+        setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+        setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
+
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 1.0;
+        add(buildUserNamePasswordPanel(), gc);
+
+        gc.gridy = 1;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        add(new JPanel(), gc);
+    }
 
     protected final JPanel buildUserNamePasswordPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
@@ -33,7 +52,7 @@ public class FullyAutomaticPropertiesPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfUserName = new JosmTextField(), gc);
+        pnl.add(tfUserName, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfUserName);
         UserNameValidator valUserName = new UserNameValidator(tfUserName);
         valUserName.validate();
@@ -47,28 +66,9 @@ public class FullyAutomaticPropertiesPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfPassword = new JosmPasswordField(), gc);
+        pnl.add(tfPassword, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfPassword);
 
         return pnl;
     }
-
-    /**
-     * Constructs a new {@code FullyAutomaticPropertiesPanel}.
-     */
-    public FullyAutomaticPropertiesPanel() {
-        setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-        setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
-
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 1.0;
-        add(buildUserNamePasswordPanel(), gc);
-
-        gc.gridy = 1;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        add(new JPanel(), gc);
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
index ca46f9c..fbb129b 100644
--- a/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUI.java
@@ -33,21 +33,33 @@ import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
- * This is an UI which supports a JOSM user to get an OAuth Access Token in a fully
- * manual process.
+ * This is an UI which supports a JOSM user to get an OAuth Access Token in a fully manual process.
  *
  * @since 2746
  */
 public class ManualAuthorizationUI extends AbstractAuthorizationUI {
 
-    private JosmTextField tfAccessTokenKey;
+    private final JosmTextField tfAccessTokenKey = new JosmTextField();
     private transient AccessTokenKeyValidator valAccessTokenKey;
-    private JosmTextField tfAccessTokenSecret;
+    private final JosmTextField tfAccessTokenSecret = new JosmTextField();
     private transient AccessTokenSecretValidator valAccessTokenSecret;
-    private JCheckBox cbSaveToPreferences;
-    private HtmlPanel pnlMessage;
+    private final JCheckBox cbSaveToPreferences = new JCheckBox(tr("Save Access Token in preferences"));
+    private final HtmlPanel pnlMessage = new HtmlPanel();
     private final transient Executor executor;
 
+    /**
+     * Constructs a new {@code ManualAuthorizationUI} for the given API URL.
+     * @param apiUrl The OSM API URL
+     * @param executor the executor used for running the HTTP requests for the authorization
+     * @since 5422
+     */
+    public ManualAuthorizationUI(String apiUrl, Executor executor) {
+        super(/* dont pass apiURL because setApiUrl is overriden and references a local field */);
+        setApiUrl(apiUrl);
+        this.executor = executor;
+        build();
+    }
+
     protected JPanel buildAccessTokenPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
         pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
@@ -60,7 +72,6 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
         gc.weightx = 0.0;
         gc.gridwidth = 2;
         gc.insets = new Insets(0, 0, 5, 0);
-        pnlMessage = new HtmlPanel();
         pnlMessage.setText("<html><body>"
                 + tr("Please enter an OAuth Access Token which is authorized to access the OSM server "
                         + "''{0}''.",
@@ -76,7 +87,7 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfAccessTokenKey = new JosmTextField(), gc);
+        pnl.add(tfAccessTokenKey, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfAccessTokenKey);
         valAccessTokenKey = new AccessTokenKeyValidator(tfAccessTokenKey);
         valAccessTokenKey.validate();
@@ -90,7 +101,7 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfAccessTokenSecret = new JosmTextField(), gc);
+        pnl.add(tfAccessTokenSecret, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfAccessTokenSecret);
         valAccessTokenSecret = new AccessTokenSecretValidator(tfAccessTokenSecret);
         valAccessTokenSecret.validate();
@@ -101,7 +112,7 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
         gc.gridx = 0;
         gc.gridwidth = 2;
         gc.weightx = 1.0;
-        pnl.add(cbSaveToPreferences = new JCheckBox(tr("Save Access Token in preferences")), gc);
+        pnl.add(cbSaveToPreferences, gc);
         cbSaveToPreferences.setSelected(OAuthAccessTokenHolder.getInstance().isSaveToPreferences());
 
         // filler - grab remaining space
@@ -160,18 +171,6 @@ public class ManualAuthorizationUI extends AbstractAuthorizationUI {
         add(buildActionsPanel(), BorderLayout.SOUTH);
     }
 
-    /**
-     * Constructs a new {@code ManualAuthorizationUI} for the given API URL.
-     * @param apiUrl The OSM API URL
-     * @param executor the executor used for running the HTTP requests for the authorization
-     * @since 5422
-     */
-    public ManualAuthorizationUI(String apiUrl, Executor executor) {
-        super(apiUrl);
-        this.executor = executor;
-        build();
-    }
-
     @Override
     public boolean isSaveAccessTokenToPreferences() {
         return cbSaveToPreferences.isSelected();
diff --git a/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java b/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
index e4c81b7..211c580 100644
--- a/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
+++ b/src/org/openstreetmap/josm/gui/oauth/OAuthAuthorizationWizard.java
@@ -12,8 +12,8 @@ import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyEvent;
@@ -57,18 +57,18 @@ import org.openstreetmap.josm.tools.WindowGeometry;
 /**
  * This wizard walks the user to the necessary steps to retrieve an OAuth Access Token which
  * allows JOSM to access the OSM API on the users behalf.
- *
+ * @since 2746
  */
 public class OAuthAuthorizationWizard extends JDialog {
     private boolean canceled;
     private final String apiUrl;
 
-    private AuthorizationProcedureComboBox cbAuthorisationProcedure;
+    private final AuthorizationProcedureComboBox cbAuthorisationProcedure = new AuthorizationProcedureComboBox();
     private FullyAutomaticAuthorizationUI pnlFullyAutomaticAuthorisationUI;
     private SemiAutomaticAuthorizationUI pnlSemiAutomaticAuthorisationUI;
     private ManualAuthorizationUI pnlManualAuthorisationUI;
     private JScrollPane spAuthorisationProcedureUI;
-    private final Executor executor;
+    private final transient Executor executor;
 
     /**
      * Launches the wizard, {@link OAuthAccessTokenHolder#setAccessToken(OAuthToken) sets the token}
@@ -149,7 +149,7 @@ public class OAuthAuthorizationWizard extends JDialog {
         gc.gridx = 1;
         gc.gridwidth = 1;
         gc.weightx = 1.0;
-        pnl.add(cbAuthorisationProcedure = new AuthorizationProcedureComboBox(), gc);
+        pnl.add(cbAuthorisationProcedure, gc);
         cbAuthorisationProcedure.addItemListener(new AuthorisationProcedureChangeListener());
         lbl.setLabelFor(cbAuthorisationProcedure);
 
@@ -215,7 +215,7 @@ public class OAuthAuthorizationWizard extends JDialog {
 
         spAuthorisationProcedureUI = GuiHelper.embedInVerticalScrollPane(new JPanel());
         spAuthorisationProcedureUI.getVerticalScrollBar().addComponentListener(
-                new ComponentListener() {
+                new ComponentAdapter() {
                     @Override
                     public void componentShown(ComponentEvent e) {
                         spAuthorisationProcedureUI.setBorder(UIManager.getBorder("ScrollPane.border"));
@@ -225,12 +225,6 @@ public class OAuthAuthorizationWizard extends JDialog {
                     public void componentHidden(ComponentEvent e) {
                         spAuthorisationProcedureUI.setBorder(null);
                     }
-
-                    @Override
-                    public void componentResized(ComponentEvent e) {}
-
-                    @Override
-                    public void componentMoved(ComponentEvent e) {}
                 }
         );
         getContentPane().add(spAuthorisationProcedureUI, BorderLayout.CENTER);
diff --git a/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java b/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
index 38ddbb8..6c58f8e 100644
--- a/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
+++ b/src/org/openstreetmap/josm/gui/oauth/OsmOAuthAuthorizationClient.java
@@ -90,9 +90,8 @@ public class OsmOAuthAuthorizationClient {
         canceled = true;
         if (provider != null) {
             try {
-                // TODO
-                Field f =  provider.getClass().getDeclaredField("connection");
-                f.setAccessible(true);
+                Field f = provider.getClass().getDeclaredField("connection");
+                Utils.setObjectsAccessible(f);
                 HttpURLConnection con = (HttpURLConnection) f.get(provider);
                 if (con != null) {
                     con.disconnect();
diff --git a/src/org/openstreetmap/josm/gui/oauth/OsmPrivilegesPanel.java b/src/org/openstreetmap/josm/gui/oauth/OsmPrivilegesPanel.java
index aaadf58..0e3f79a 100644
--- a/src/org/openstreetmap/josm/gui/oauth/OsmPrivilegesPanel.java
+++ b/src/org/openstreetmap/josm/gui/oauth/OsmPrivilegesPanel.java
@@ -16,12 +16,19 @@ import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
 
 public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
 
-    private JCheckBox cbWriteApi;
-    private JCheckBox cbWriteGpx;
-    private JCheckBox cbReadGpx;
-    private JCheckBox cbWritePrefs;
-    private JCheckBox cbReadPrefs;
-    private JCheckBox cbModifyNotes;
+    private final JCheckBox cbWriteApi = new JCheckBox();
+    private final JCheckBox cbWriteGpx = new JCheckBox();
+    private final JCheckBox cbReadGpx = new JCheckBox();
+    private final JCheckBox cbWritePrefs = new JCheckBox();
+    private final JCheckBox cbReadPrefs = new JCheckBox();
+    private final JCheckBox cbModifyNotes = new JCheckBox();
+
+    /**
+     * Constructs a new {@code OsmPrivilegesPanel}.
+     */
+    public OsmPrivilegesPanel() {
+        build();
+    }
 
     protected final void build() {
         setLayout(new GridBagLayout());
@@ -34,7 +41,7 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weightx = 1.0;
         gc.insets = new Insets(0, 0, 3, 3);
-        add(cbWriteApi = new JCheckBox(), gc);
+        add(cbWriteApi, gc);
         cbWriteApi.setText(tr("Allow to upload map data"));
         cbWriteApi.setToolTipText(tr("Select to grant JOSM the right to upload map data on your behalf"));
         cbWriteApi.setSelected(true);
@@ -42,7 +49,7 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
         // checkbox for "allow to upload gps traces"
         //
         gc.gridy = 1;
-        add(cbWriteGpx = new JCheckBox(), gc);
+        add(cbWriteGpx, gc);
         cbWriteGpx.setText(tr("Allow to upload GPS traces"));
         cbWriteGpx.setToolTipText(tr("Select to grant JOSM the right to upload GPS traces on your behalf"));
         cbWriteGpx.setSelected(true);
@@ -50,7 +57,7 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
         // checkbox for "allow to download private gps traces"
         //
         gc.gridy = 2;
-        add(cbReadGpx = new JCheckBox(), gc);
+        add(cbReadGpx, gc);
         cbReadGpx.setText(tr("Allow to download your private GPS traces"));
         cbReadGpx.setToolTipText(tr("Select to grant JOSM the right to download your private GPS traces into JOSM layers"));
         cbReadGpx.setSelected(true);
@@ -58,7 +65,7 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
         // checkbox for "allow to download private gps traces"
         //
         gc.gridy = 3;
-        add(cbReadPrefs = new JCheckBox(), gc);
+        add(cbReadPrefs, gc);
         cbReadPrefs.setText(tr("Allow to read your preferences"));
         cbReadPrefs.setToolTipText(tr("Select to grant JOSM the right to read your server preferences"));
         cbReadPrefs.setSelected(true);
@@ -66,13 +73,13 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
         // checkbox for "allow to download private gps traces"
         //
         gc.gridy = 4;
-        add(cbWritePrefs = new JCheckBox(), gc);
+        add(cbWritePrefs, gc);
         cbWritePrefs.setText(tr("Allow to write your preferences"));
         cbWritePrefs.setToolTipText(tr("Select to grant JOSM the right to write your server preferences"));
         cbWritePrefs.setSelected(true);
 
         gc.gridy = 5;
-        add(cbModifyNotes = new JCheckBox(), gc);
+        add(cbModifyNotes, gc);
         cbModifyNotes.setText(tr("Allow modifications of notes"));
         cbModifyNotes.setToolTipText(tr("Select to grant JOSM the right to modify notes on your behalf"));
         cbModifyNotes.setSelected(true);
@@ -86,13 +93,6 @@ public class OsmPrivilegesPanel extends VerticallyScrollablePanel {
     }
 
     /**
-     * Constructs a new {@code OsmPrivilegesPanel}.
-     */
-    public OsmPrivilegesPanel() {
-        build();
-    }
-
-    /**
      * Replies the currently entered privileges
      *
      * @return the privileges
diff --git a/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java b/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
index 11a334d..8db7d99 100644
--- a/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
+++ b/src/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUI.java
@@ -40,7 +40,7 @@ import org.openstreetmap.josm.tools.OpenBrowser;
  * @since 2746
  */
 public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
-    private AccessTokenInfoPanel pnlAccessTokenInfo;
+    private final AccessTokenInfoPanel pnlAccessTokenInfo = new AccessTokenInfoPanel();
     private transient OAuthToken requestToken;
 
     private RetrieveRequestTokenPanel pnlRetrieveRequestToken;
@@ -216,7 +216,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
      */
     private class RetrieveAccessTokenPanel extends JPanel {
 
-        private JosmTextField tfAuthoriseUrl;
+        private final JosmTextField tfAuthoriseUrl = new JosmTextField();
 
         /**
          * Constructs a new {@code RetrieveAccessTokenPanel}.
@@ -260,7 +260,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
 
             gc.gridx = 1;
             gc.weightx = 1.0;
-            pnl.add(tfAuthoriseUrl = new JosmTextField(), gc);
+            pnl.add(tfAuthoriseUrl, gc);
             tfAuthoriseUrl.setEditable(false);
 
             return pnl;
@@ -339,7 +339,7 @@ public class SemiAutomaticAuthorizationUI extends AbstractAuthorizationUI {
             gc.gridy = 1;
             gc.weightx = 1.0;
             gc.gridwidth = 1;
-            pnl.add(pnlAccessTokenInfo = new AccessTokenInfoPanel(), gc);
+            pnl.add(pnlAccessTokenInfo, gc);
             pnlAccessTokenInfo.setSaveToPreferences(
                     OAuthAccessTokenHolder.getInstance().isSaveToPreferences()
             );
diff --git a/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java b/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
index e9c791d..8d06631 100644
--- a/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
+++ b/src/org/openstreetmap/josm/gui/oauth/TestAccessTokenTask.java
@@ -77,7 +77,9 @@ public class TestAccessTokenTask extends PleaseWaitRunnable {
     }
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing
+    }
 
     protected void sign(HttpClient con) throws OAuthException {
         OAuthConsumer consumer = oauthParameters.buildConsumer();
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
index 2e13611..7dd4b85 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
@@ -36,9 +36,22 @@ import org.openstreetmap.josm.tools.WindowGeometry;
 
 public class PreferenceDialog extends JDialog {
 
-    private PreferenceTabbedPane tpPreferences;
+    private final PreferenceTabbedPane tpPreferences = new PreferenceTabbedPane();
     private boolean canceled;
 
+    /**
+     * Constructs a new {@code PreferenceDialog}.
+     * @param parent parent component
+     */
+    public PreferenceDialog(Component parent) {
+        super(GuiHelper.getFrameForComponent(parent), tr("Preferences"), ModalityType.DOCUMENT_MODAL);
+        build();
+        this.setMinimumSize(new Dimension(600, 350));
+        // set the maximum width to the current screen. If the dialog is opened on a
+        // smaller screen than before, this will reset the stored preference.
+        this.setMaximumSize(GuiHelper.getScreenSize());
+    }
+
     protected JPanel buildActionPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
 
@@ -64,7 +77,7 @@ public class PreferenceDialog extends JDialog {
     protected final void build() {
         Container c = getContentPane();
         c.setLayout(new BorderLayout());
-        c.add(tpPreferences = new PreferenceTabbedPane(), BorderLayout.CENTER);
+        c.add(tpPreferences, BorderLayout.CENTER);
         tpPreferences.buildGui();
         tpPreferences.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         c.add(buildActionPanel(), BorderLayout.SOUTH);
@@ -76,15 +89,6 @@ public class PreferenceDialog extends JDialog {
         HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Action/Preferences"));
     }
 
-    public PreferenceDialog(Component parent) {
-        super(GuiHelper.getFrameForComponent(parent), tr("Preferences"), ModalityType.DOCUMENT_MODAL);
-        build();
-        this.setMinimumSize(new Dimension(600, 350));
-        // set the maximum width to the current screen. If the dialog is opened on a
-        // smaller screen than before, this will reset the stored preference.
-        this.setMaximumSize(GuiHelper.getScreenSize());
-    }
-
     /**
      * Replies the preferences tabbed pane.
      * @return The preferences tabbed pane, or null if the dialog is not yet initialized.
@@ -125,14 +129,26 @@ public class PreferenceDialog extends JDialog {
         super.setVisible(visible);
     }
 
+    /**
+     * Select preferences tab by name.
+     * @param name preferences tab name (icon)
+     */
     public void selectPreferencesTabByName(String name) {
         tpPreferences.selectTabByName(name);
     }
 
+    /**
+     * Select preferences tab by class.
+     * @param clazz preferences tab class
+     */
     public void selectPreferencesTabByClass(Class<? extends TabPreferenceSetting> clazz) {
         tpPreferences.selectTabByPref(clazz);
     }
 
+    /**
+     * Select preferences sub-tab by class.
+     * @param clazz preferences sub-tab class
+     */
     public void selectSubPreferencesTabByClass(Class<? extends SubPreferenceSetting> clazz) {
         tpPreferences.selectSubTabByPref(clazz);
     }
diff --git a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
index 0d2bde9..d6a2887 100644
--- a/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
+++ b/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
@@ -621,7 +621,7 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
                                     sps.addGui(this);
                                 } catch (SecurityException ex) {
                                     Main.error(ex);
-                                } catch (Exception ex) {
+                                } catch (RuntimeException ex) {
                                     BugReportExceptionHandler.handleException(ex);
                                 } finally {
                                     settingsInitialized.add(sps);
@@ -635,7 +635,7 @@ public final class PreferenceTabbedPane extends JTabbedPane implements MouseWhee
                     setSelectedIndex(index);
                 } catch (SecurityException ex) {
                     Main.error(ex);
-                } catch (Exception ex) {
+                } catch (RuntimeException ex) {
                     // allow to change most settings even if e.g. a plugin fails
                     BugReportExceptionHandler.handleException(ex);
                 } finally {
diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
index 8abedba..0e76360 100644
--- a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
+++ b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
@@ -497,15 +497,14 @@ public abstract class SourceEditor extends JPanel {
     /**
      * Synchronously loads available sources and returns the parsed list.
      * @return list of available sources
+     * @throws OsmTransferException in case of OSM transfer error
+     * @throws IOException in case of any I/O error
+     * @throws SAXException in case of any SAX error
      */
-    public final Collection<ExtendedSourceEntry> loadAndGetAvailableSources() {
-        try {
-            final SourceLoader loader = new SourceLoader(availableSourcesUrl, sourceProviders);
-            loader.realRun();
-            return loader.sources;
-        } catch (Exception ex) {
-            throw new RuntimeException(ex);
-        }
+    public final Collection<ExtendedSourceEntry> loadAndGetAvailableSources() throws SAXException, IOException, OsmTransferException {
+        final SourceLoader loader = new SourceLoader(availableSourcesUrl, sourceProviders);
+        loader.realRun();
+        return loader.sources;
     }
 
     /**
@@ -1485,7 +1484,8 @@ public abstract class SourceEditor extends JPanel {
                         last = null;
                         Matcher m = Pattern.compile("^(.+);(.+)$").matcher(line);
                         if (m.matches()) {
-                            sources.add(last = new ExtendedSourceEntry(m.group(1), m.group(2)));
+                            last = new ExtendedSourceEntry(m.group(1), m.group(2));
+                            sources.add(last);
                         } else {
                             Main.error(tr(getStr(I18nString.ILLEGAL_FORMAT_OF_ENTRY), url, line));
                         }
@@ -1513,7 +1513,7 @@ public abstract class SourceEditor extends JPanel {
         private static String fromSourceEntry(SourceEntry entry) {
             if (entry == null)
                 return null;
-            StringBuilder s = new StringBuilder("<html><b>");
+            StringBuilder s = new StringBuilder(128).append("<html><b>");
             if (entry.title != null) {
                 s.append(entry.title).append("</b> <span color=\"gray\">");
             }
@@ -1527,7 +1527,7 @@ public abstract class SourceEditor extends JPanel {
     }
 
     class FileOrUrlCellEditor extends JPanel implements TableCellEditor {
-        private JosmTextField tfFileName;
+        private final JosmTextField tfFileName = new JosmTextField();
         private final CopyOnWriteArrayList<CellEditorListener> listeners;
         private String value;
         private final boolean isFile;
@@ -1543,7 +1543,7 @@ public abstract class SourceEditor extends JPanel {
             gc.fill = GridBagConstraints.BOTH;
             gc.weightx = 1.0;
             gc.weighty = 1.0;
-            add(tfFileName = new JosmTextField(), gc);
+            add(tfFileName, gc);
 
             gc.gridx = 1;
             gc.gridy = 0;
@@ -1601,7 +1601,7 @@ public abstract class SourceEditor extends JPanel {
         public boolean isCellEditable(EventObject anEvent) {
             if (anEvent instanceof MouseEvent)
                 return ((MouseEvent) anEvent).getClickCount() >= 2;
-                return true;
+            return true;
         }
 
         @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
index bf29846..bb8794d 100644
--- a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
+++ b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
@@ -461,10 +461,14 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
                 }
 
                 @Override
-                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                    // Do nothing
+                }
 
                 @Override
-                public void popupMenuCanceled(PopupMenuEvent e) {}
+                public void popupMenuCanceled(PopupMenuEvent e) {
+                    // Do nothing
+                }
             });
             add(remove);
             add(configure);
@@ -570,7 +574,7 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
                     selectedList.setSelectedIndices(indices);
                     movingComponent = "";
                     return true;
-                } catch (Exception e) {
+                } catch (IOException | UnsupportedFlavorException e) {
                     Main.error(e);
                 }
                 return false;
@@ -589,7 +593,7 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
                                 selected.remove(indices[i]);
                             }
                         }
-                    } catch (Exception e) {
+                    } catch (IOException | UnsupportedFlavorException e) {
                         Main.error(e);
                     }
                     movingComponent = "";
@@ -677,13 +681,17 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
         private final JTable actionParametersTable = new JTable(actionParametersModel);
         private JPanel actionParametersPanel;
 
-        private JButton upButton;
-        private JButton downButton;
-        private JButton removeButton;
-        private JButton addButton;
+        private final JButton upButton = createButton("up");
+        private final JButton downButton = createButton("down");
+        private final JButton removeButton = createButton(">");
+        private final JButton addButton = createButton("<");
 
         private String movingComponent;
 
+        /**
+         * Constructs a new {@code Settings}.
+         * @param rootActionsNode root actions node
+         */
         public Settings(DefaultMutableTreeNode rootActionsNode) {
             super(/* ICON(preferences/) */ "toolbar", tr("Toolbar customization"), tr("Customize the elements on the toolbar."));
             actionsTreeModel = new DefaultTreeModel(rootActionsNode);
@@ -810,19 +818,23 @@ public class ToolbarPreferences implements PreferenceSettingFactory {
             right.add(new JScrollPane(actionsTree), GBC.eol().fill(GBC.BOTH));
 
             final JPanel buttons = new JPanel(new GridLayout(6, 1));
-            buttons.add(upButton = createButton("up"));
-            buttons.add(addButton = createButton("<"));
-            buttons.add(removeButton = createButton(">"));
-            buttons.add(downButton = createButton("down"));
+            buttons.add(upButton);
+            buttons.add(addButton);
+            buttons.add(removeButton);
+            buttons.add(downButton);
             updateEnabledState();
 
             final JPanel p = new JPanel();
             p.setLayout(new LayoutManager() {
                 @Override
-                public void addLayoutComponent(String name, Component comp) {}
+                public void addLayoutComponent(String name, Component comp) {
+                    // Do nothing
+                }
 
                 @Override
-                public void removeLayoutComponent(Component comp) {}
+                public void removeLayoutComponent(Component comp) {
+                    // Do nothing
+                }
 
                 @Override
                 public Dimension minimumLayoutSize(Container parent) {
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
index 49aaf24..cb35231 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/GPXSettingsPanel.java
@@ -356,12 +356,14 @@ public class GPXSettingsPanel extends JPanel implements ValidationListener {
             colorDynamic.setSelected(false);
             colorDynamic.setEnabled(false);
         } else {
-            switch(Main.pref.getInteger("draw.rawgps.colors", layerName, 0)) {
+            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 3: colorTypeDirection.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);
             colorTypeVelocityTune.setSelectedIndex(ccts == 10 ? 2 : (ccts == 20 ? 1 : 0));
diff --git a/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java b/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
index df9aff0..0f720fa 100644
--- a/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
@@ -83,7 +83,7 @@ public class LafPreference implements SubPreferenceSetting {
                 lafCombo.addItem(
                         new UIManager.LookAndFeelInfo(((LookAndFeel) oquaqua).getName(), "ch.randelshofer.quaqua.QuaquaLookAndFeel")
                 );
-            } catch (Exception ex) {
+            } catch (ReflectiveOperationException ex) {
                 // just debug, Quaqua may not even be installed...
                 Main.debug(ex.getMessage());
             }
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java b/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
index bd260f0..d76f357 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java
@@ -65,7 +65,8 @@ public class AddWMSLayerPanel extends AddImageryPanel {
         add(new JLabel(tr("3. Select image format")), GBC.eol());
         add(formats, GBC.eol().fill());
 
-        add(wmsInstruction = new JLabel(tr("4. Verify generated WMS URL")), GBC.eol());
+        wmsInstruction = new JLabel(tr("4. Verify generated WMS URL"));
+        add(wmsInstruction, GBC.eol());
         wmsInstruction.setLabelFor(wmsUrl);
         add(wmsUrl, GBC.eop().fill());
         wmsUrl.setLineWrap(true);
diff --git a/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java b/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
index 01c3e77..7d5643a 100644
--- a/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
@@ -78,9 +78,9 @@ public final class ImageryPreference extends DefaultTabPreferenceSetting {
     private ImageryProvidersPanel imageryProviders;
     private ImageryLayerInfo layerInfo;
 
-    private CommonSettingsPanel commonSettings;
-    private WMSSettingsPanel wmsSettings;
-    private TMSSettingsPanel tmsSettings;
+    private final CommonSettingsPanel commonSettings = new CommonSettingsPanel();
+    private final WMSSettingsPanel wmsSettings = new WMSSettingsPanel();
+    private final TMSSettingsPanel tmsSettings = new TMSSettingsPanel();
 
     /**
      * Factory used to create a new {@code ImageryPreference}.
@@ -114,10 +114,10 @@ public final class ImageryPreference extends DefaultTabPreferenceSetting {
         final JPanel p = new JPanel(new GridBagLayout());
         p.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 
-        addSettingsSection(p, tr("Common Settings"), commonSettings = new CommonSettingsPanel());
-        addSettingsSection(p, tr("WMS Settings"), wmsSettings = new WMSSettingsPanel(),
+        addSettingsSection(p, tr("Common Settings"), commonSettings);
+        addSettingsSection(p, tr("WMS Settings"), wmsSettings,
                 GBC.eol().fill(GBC.HORIZONTAL));
-        addSettingsSection(p, tr("TMS Settings"), tmsSettings = new TMSSettingsPanel(),
+        addSettingsSection(p, tr("TMS Settings"), tmsSettings,
                 GBC.eol().fill(GBC.HORIZONTAL));
 
         p.add(new JPanel(), GBC.eol().fill(GBC.BOTH));
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginCheckBox.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginCheckBox.java
new file mode 100644
index 0000000..6cb3f41
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginCheckBox.java
@@ -0,0 +1,101 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.plugin;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JCheckBox;
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * A plugin checkbox.
+ * @since 10228
+ */
+public class PluginCheckBox extends JCheckBox implements ActionListener {
+    private final transient PluginInformation pi;
+    private final PluginListPanel panel;
+    private final transient PluginPreferencesModel ppModel;
+
+    PluginCheckBox(PluginInformation pi, boolean selected, PluginListPanel panel, PluginPreferencesModel ppModel) {
+        this.pi = pi;
+        this.panel = panel;
+        this.ppModel = ppModel;
+        setSelected(selected);
+        setToolTipText(PluginListPanel.formatCheckboxTooltipText(pi));
+        addActionListener(this);
+    }
+
+    protected void selectRequiredPlugins(PluginInformation info) {
+        if (info != null && info.requires != null) {
+            for (String s : info.getRequiredPlugins()) {
+                if (!ppModel.isSelectedPlugin(s)) {
+                    ppModel.setPluginSelected(s, true);
+                    selectRequiredPlugins(ppModel.getPluginInformation(s));
+                }
+            }
+        }
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        // Select/unselect corresponding plugin in the model
+        ppModel.setPluginSelected(pi.getName(), isSelected());
+        // Does the newly selected plugin require other plugins ?
+        if (isSelected() && pi.requires != null) {
+            // Select required plugins
+            selectRequiredPlugins(pi);
+            // Alert user if plugin requirements are not met
+            PluginHandler.checkRequiredPluginsPreconditions(panel, ppModel.getAvailablePlugins(), pi, false);
+        } else if (!isSelected()) {
+            // If the plugin has been unselected, was it required by other plugins still selected ?
+            Set<String> otherPlugins = new HashSet<>();
+            for (PluginInformation p : ppModel.getAvailablePlugins()) {
+                if (!p.equals(pi) && p.requires != null && ppModel.isSelectedPlugin(p.getName())) {
+                    for (String s : p.getRequiredPlugins()) {
+                        if (s.equals(pi.getName())) {
+                            otherPlugins.add(p.getName());
+                            break;
+                        }
+                    }
+                }
+            }
+            if (!otherPlugins.isEmpty()) {
+                alertPluginStillRequired(panel, pi.getName(), otherPlugins);
+            }
+        }
+    }
+
+    /**
+     * Alerts the user if an unselected plugin is still required by another plugins
+     *
+     * @param parent The parent Component used to display error popup
+     * @param plugin the plugin
+     * @param otherPlugins the other plugins
+     */
+    private static void alertPluginStillRequired(Component parent, String plugin, Set<String> otherPlugins) {
+        StringBuilder sb = new StringBuilder("<html>")
+          .append(trn("Plugin {0} is still required by this plugin:",
+                "Plugin {0} is still required by these {1} plugins:",
+                otherPlugins.size(),
+                plugin,
+                otherPlugins.size()))
+          .append(Utils.joinAsHtmlUnorderedList(otherPlugins))
+          .append("</html>");
+        JOptionPane.showMessageDialog(
+                parent,
+                sb.toString(),
+                tr("Warning"),
+                JOptionPane.WARNING_MESSAGE
+        );
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
index 9025304..7f8bcbd 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginListPanel.java
@@ -2,24 +2,16 @@
 package org.openstreetmap.josm.gui.preferences.plugin;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.awt.Component;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.Rectangle;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
-import javax.swing.JCheckBox;
 import javax.swing.JLabel;
-import javax.swing.JOptionPane;
 import javax.swing.SwingConstants;
 import javax.swing.SwingUtilities;
 import javax.swing.event.HyperlinkEvent;
@@ -28,10 +20,8 @@ import javax.swing.event.HyperlinkListener;
 
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
-import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.tools.OpenBrowser;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
  * A panel displaying the list of known plugins.
@@ -55,7 +45,7 @@ public class PluginListPanel extends VerticallyScrollablePanel {
         setLayout(new GridBagLayout());
     }
 
-    protected String formatPluginRemoteVersion(PluginInformation pi) {
+    protected static String formatPluginRemoteVersion(PluginInformation pi) {
         StringBuilder sb = new StringBuilder();
         if (pi.version == null || pi.version.trim().isEmpty()) {
             sb.append(tr("unknown"));
@@ -68,7 +58,7 @@ public class PluginListPanel extends VerticallyScrollablePanel {
         return sb.toString();
     }
 
-    protected String formatPluginLocalVersion(PluginInformation pi) {
+    protected static String formatPluginLocalVersion(PluginInformation pi) {
         if (pi == null)
             return tr("unknown");
         if (pi.localversion == null || pi.localversion.trim().isEmpty())
@@ -76,7 +66,7 @@ public class PluginListPanel extends VerticallyScrollablePanel {
         return pi.localversion;
     }
 
-    protected String formatCheckboxTooltipText(PluginInformation pi) {
+    protected static String formatCheckboxTooltipText(PluginInformation pi) {
         if (pi == null)
             return "";
         if (pi.downloadlink == null)
@@ -107,95 +97,6 @@ public class PluginListPanel extends VerticallyScrollablePanel {
     }
 
     /**
-     * A plugin checkbox.
-     */
-    private class JPluginCheckBox extends JCheckBox {
-        protected final transient PluginInformation pi;
-
-        JPluginCheckBox(final PluginInformation pi, boolean selected) {
-            this.pi = pi;
-            setSelected(selected);
-            setToolTipText(formatCheckboxTooltipText(pi));
-            addActionListener(new PluginCbActionListener(this));
-        }
-    }
-
-    /**
-     * Listener called when the user selects/unselects a plugin checkbox.
-     */
-    private class PluginCbActionListener implements ActionListener {
-        private final JPluginCheckBox cb;
-
-        PluginCbActionListener(JPluginCheckBox cb) {
-            this.cb = cb;
-        }
-
-        protected void selectRequiredPlugins(PluginInformation info) {
-            if (info != null && info.requires != null) {
-                for (String s : info.getRequiredPlugins()) {
-                    if (!model.isSelectedPlugin(s)) {
-                        model.setPluginSelected(s, true);
-                        selectRequiredPlugins(model.getPluginInformation(s));
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            // Select/unselect corresponding plugin in the model
-            model.setPluginSelected(cb.pi.getName(), cb.isSelected());
-            // Does the newly selected plugin require other plugins ?
-            if (cb.isSelected() && cb.pi.requires != null) {
-                // Select required plugins
-                selectRequiredPlugins(cb.pi);
-                // Alert user if plugin requirements are not met
-                PluginHandler.checkRequiredPluginsPreconditions(PluginListPanel.this, model.getAvailablePlugins(), cb.pi, false);
-            } else if (!cb.isSelected()) {
-                // If the plugin has been unselected, was it required by other plugins still selected ?
-                Set<String> otherPlugins = new HashSet<>();
-                for (PluginInformation pi : model.getAvailablePlugins()) {
-                    if (!pi.equals(cb.pi) && pi.requires != null && model.isSelectedPlugin(pi.getName())) {
-                        for (String s : pi.getRequiredPlugins()) {
-                            if (s.equals(cb.pi.getName())) {
-                                otherPlugins.add(pi.getName());
-                                break;
-                            }
-                        }
-                    }
-                }
-                if (!otherPlugins.isEmpty()) {
-                    alertPluginStillRequired(PluginListPanel.this, cb.pi.getName(), otherPlugins);
-                }
-            }
-        }
-    }
-
-    /**
-     * Alerts the user if an unselected plugin is still required by another plugins
-     *
-     * @param parent The parent Component used to display error popup
-     * @param plugin the plugin
-     * @param otherPlugins the other plugins
-     */
-    private static void alertPluginStillRequired(Component parent, String plugin, Set<String> otherPlugins) {
-        StringBuilder sb = new StringBuilder("<html>")
-          .append(trn("Plugin {0} is still required by this plugin:",
-                "Plugin {0} is still required by these {1} plugins:",
-                otherPlugins.size(),
-                plugin,
-                otherPlugins.size()))
-          .append(Utils.joinAsHtmlUnorderedList(otherPlugins))
-          .append("</html>");
-        JOptionPane.showMessageDialog(
-                parent,
-                sb.toString(),
-                tr("Warning"),
-                JOptionPane.WARNING_MESSAGE
-        );
-    }
-
-    /**
      * Refreshes the list.
      */
     public void refreshView() {
@@ -220,7 +121,7 @@ public class PluginListPanel extends VerticallyScrollablePanel {
             String remoteversion = formatPluginRemoteVersion(pi);
             String localversion = formatPluginLocalVersion(model.getPluginInformation(pi.getName()));
 
-            final JPluginCheckBox cbPlugin = new JPluginCheckBox(pi, selected);
+            final PluginCheckBox cbPlugin = new PluginCheckBox(pi, selected, this, model);
             String pluginText = tr("{0}: Version {1} (local: {2})", pi.getName(), remoteversion, localversion);
             if (pi.requires != null && !pi.requires.isEmpty()) {
                 pluginText += tr(" (requires: {0})", pi.requires);
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
index c1738f6..4170caf 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreferencesModel.java
@@ -13,10 +13,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Observable;
 import java.util.Set;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.util.ChangeNotifier;
 import org.openstreetmap.josm.plugins.PluginException;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.plugins.PluginInformation;
@@ -24,7 +24,7 @@ import org.openstreetmap.josm.plugins.PluginInformation;
 /**
  * The plugin model behind a {@code PluginListPanel}.
  */
-public class PluginPreferencesModel extends Observable {
+public class PluginPreferencesModel extends ChangeNotifier {
     // remember the initial list of active plugins
     private final Set<String> currentActivePlugins;
     private final List<PluginInformation> availablePlugins = new ArrayList<>();
@@ -60,8 +60,7 @@ public class PluginPreferencesModel extends Observable {
             }
         }
         filterExpression = filter;
-        clearChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     /**
@@ -86,8 +85,7 @@ public class PluginPreferencesModel extends Observable {
                 selectedPluginsMap.put(pi, Boolean.TRUE);
             }
         }
-        clearChanged();
-        notifyObservers();
+        fireStateChanged();
     }
 
     protected void updateAvailablePlugin(PluginInformation other) {
diff --git a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
index da91315..1100225 100644
--- a/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/plugin/PluginUpdatePolicyPanel.java
@@ -45,10 +45,11 @@ public class PluginUpdatePolicyPanel extends JPanel {
         }
 
         static Policy fromPreferenceValue(String preferenceValue) {
-            if (preferenceValue == null) return null;
-            preferenceValue = preferenceValue.trim().toLowerCase(Locale.ENGLISH);
+            if (preferenceValue == null)
+                return null;
+            String prefValue = preferenceValue.trim().toLowerCase(Locale.ENGLISH);
             for (Policy p: Policy.values()) {
-                if (p.getPreferencesValue().equals(preferenceValue))
+                if (p.getPreferencesValue().equals(prefValue))
                     return p;
             }
             return null;
@@ -57,8 +58,16 @@ public class PluginUpdatePolicyPanel extends JPanel {
 
     private transient Map<Policy, JRadioButton> rbVersionBasedUpatePolicy;
     private transient Map<Policy, JRadioButton> rbTimeBasedUpatePolicy;
-    private JosmTextField tfUpdateInterval;
-    private JLabel lblUpdateInterval;
+    private final JosmTextField tfUpdateInterval = new JosmTextField(5);
+    private final JLabel lblUpdateInterval = new JLabel(tr("Update interval (in days):"));
+
+    /**
+     * Constructs a new {@code PluginUpdatePolicyPanel}.
+     */
+    public PluginUpdatePolicyPanel() {
+        build();
+        initFromPreferences();
+    }
 
     protected JPanel buildVersionBasedUpdatePolicyPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
@@ -94,8 +103,8 @@ public class PluginUpdatePolicyPanel extends JPanel {
 
     protected JPanel buildUpdateIntervalPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        pnl.add(lblUpdateInterval = new JLabel(tr("Update interval (in days):")));
-        pnl.add(tfUpdateInterval = new JosmTextField(5));
+        pnl.add(lblUpdateInterval);
+        pnl.add(tfUpdateInterval);
         lblUpdateInterval.setLabelFor(tfUpdateInterval);
         SelectAllOnFocusGainedDecorator.decorate(tfUpdateInterval);
         return pnl;
@@ -159,16 +168,7 @@ public class PluginUpdatePolicyPanel extends JPanel {
     }
 
     /**
-     * Constructs a new {@code PluginUpdatePolicyPanel}.
-     */
-    public PluginUpdatePolicyPanel() {
-        build();
-        initFromPreferences();
-    }
-
-    /**
      * Loads the relevant preference values from the JOSM preferences
-     *
      */
     public final void initFromPreferences() {
         String pref = Main.pref.get("pluginmanager.version-based-update.policy", "ask");
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java b/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
index 1943c6f..ee19213 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
@@ -46,8 +46,8 @@ public class CodeProjectionChoice extends AbstractProjectionChoice implements Su
 
     private static class CodeSelectionPanel extends JPanel implements ListSelectionListener, DocumentListener {
 
-        public JosmTextField filter;
-        private ProjectionCodeListModel model;
+        public final JosmTextField filter = new JosmTextField(30);
+        private final ProjectionCodeListModel model = new ProjectionCodeListModel();
         public JList<String> selectionList;
         private final List<String> data;
         private final List<String> filteredData;
@@ -88,12 +88,11 @@ public class CodeProjectionChoice extends AbstractProjectionChoice implements Su
         }
 
         private void build() {
-            filter = new JosmTextField(30);
             filter.setColumns(10);
             filter.getDocument().addDocumentListener(this);
 
             selectionList = new JList<>(data.toArray(new String[0]));
-            selectionList.setModel(model = new ProjectionCodeListModel());
+            selectionList.setModel(model);
             JScrollPane scroll = new JScrollPane(selectionList);
             scroll.setPreferredSize(new Dimension(200, 214));
 
@@ -104,7 +103,8 @@ public class CodeProjectionChoice extends AbstractProjectionChoice implements Su
 
         public String getCode() {
             int idx = selectionList.getSelectedIndex();
-            if (idx == -1) return lastCode;
+            if (idx == -1)
+                return lastCode;
             return filteredData.get(selectionList.getSelectedIndex());
         }
 
@@ -173,7 +173,8 @@ public class CodeProjectionChoice extends AbstractProjectionChoice implements Su
             if (matcher1.matches()) {
                 if (matcher2.matches()) {
                     int cmp1 = matcher1.group(1).compareTo(matcher2.group(1));
-                    if (cmp1 != 0) return cmp1;
+                    if (cmp1 != 0)
+                        return cmp1;
                     int num1 = Integer.parseInt(matcher1.group(2));
                     int num2 = Integer.parseInt(matcher2.group(2));
                     return Integer.compare(num1, num2);
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java b/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
index d3c9805..8b78f80 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/CustomProjectionChoice.java
@@ -163,7 +163,7 @@ public class CustomProjectionChoice extends AbstractProjectionChoice implements
         }
 
         private static JComponent build() {
-            StringBuilder s = new StringBuilder();
+            StringBuilder s = new StringBuilder(1024);
             s.append("<b>+proj=...</b> - <i>").append(tr("Projection name"))
              .append("</i><br>    ").append(tr("Supported values:")).append(' ')
              .append(Projections.listProjs())
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java b/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
index 23975bd..e732953 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
@@ -68,8 +68,45 @@ public class ProjectionPreference implements SubPreferenceSetting {
     private static List<ProjectionChoice> projectionChoices = new ArrayList<>();
     private static Map<String, ProjectionChoice> projectionChoicesById = new HashMap<>();
 
-    // some ProjectionChoices that are referenced from other parts of the code
-    public static final ProjectionChoice wgs84, mercator, lambert, utm_france_dom, lambert_cc9;
+    /**
+     * WGS84: Directly use latitude / longitude values as x/y.
+     */
+    public static final ProjectionChoice wgs84 = registerProjectionChoice(tr("WGS84 Geographic"), "core:wgs84", 4326, "epsg4326");
+
+    /**
+     * Mercator Projection.
+     *
+     * The center of the mercator projection is always the 0 grad coordinate.
+     *
+     * See also USGS Bulletin 1532 (http://pubs.usgs.gov/bul/1532/report.pdf)
+     * initially EPSG used 3785 but that has been superseded by 3857, see https://www.epsg-registry.org/
+     */
+    public static final ProjectionChoice mercator = registerProjectionChoice(tr("Mercator"), "core:mercator", 3857);
+
+    /**
+     * Lambert conic conform 4 zones using the French geodetic system NTF.
+     *
+     * This newer version uses the grid translation NTF<->RGF93 provided by IGN for a submillimetric accuracy.
+     * (RGF93 is the French geodetic system similar to WGS84 but not mathematically equal)
+     *
+     * Source: http://geodesie.ign.fr/contenu/fichiers/Changement_systeme_geodesique.pdf
+     */
+    public static final ProjectionChoice lambert = new LambertProjectionChoice();
+
+    /**
+     * French departements in the Caribbean Sea and Indian Ocean.
+     *
+     * Using the UTM transvers Mercator projection and specific geodesic settings.
+     */
+    public static final ProjectionChoice utm_france_dom = new UTMFranceDOMProjectionChoice();
+
+    /**
+     * Lambert Conic Conform 9 Zones projection.
+     *
+     * As specified by the IGN in this document
+     * http://geodesie.ign.fr/contenu/fichiers/documentation/rgf93/cc9zones.pdf
+     */
+    public static final ProjectionChoice lambert_cc9 = new LambertCC9ZonesProjectionChoice();
 
     static {
 
@@ -78,24 +115,6 @@ public class ProjectionPreference implements SubPreferenceSetting {
          */
 
         /**
-         * WGS84: Directly use latitude / longitude values as x/y.
-         */
-        wgs84 = registerProjectionChoice(tr("WGS84 Geographic"), "core:wgs84", 4326, "epsg4326");
-
-        /**
-         * Mercator Projection.
-         *
-         * The center of the mercator projection is always the 0 grad
-         * coordinate.
-         *
-         * See also USGS Bulletin 1532
-         * (http://pubs.usgs.gov/bul/1532/report.pdf)
-         * initially EPSG used 3785 but that has been superseded by 3857,
-         * see https://www.epsg-registry.org/
-         */
-        mercator = registerProjectionChoice(tr("Mercator"), "core:mercator", 3857);
-
-        /**
          * UTM.
          */
         registerProjectionChoice(new UTMProjectionChoice());
@@ -155,7 +174,7 @@ public class ProjectionPreference implements SubPreferenceSetting {
          * Source: http://geodesie.ign.fr/contenu/fichiers/Changement_systeme_geodesique.pdf
          * @author Pieren
          */
-        registerProjectionChoice(lambert = new LambertProjectionChoice());                          // FR
+        registerProjectionChoice(lambert);                                                          // FR
 
         /**
          * Lambert 93 projection.
@@ -173,14 +192,14 @@ public class ProjectionPreference implements SubPreferenceSetting {
          * http://geodesie.ign.fr/contenu/fichiers/documentation/rgf93/cc9zones.pdf
          * @author Pieren
          */
-        registerProjectionChoice(lambert_cc9 = new LambertCC9ZonesProjectionChoice());              // FR
+        registerProjectionChoice(lambert_cc9);                                                      // FR
 
         /**
          * French departements in the Caribbean Sea and Indian Ocean.
          *
          * Using the UTM transvers Mercator projection and specific geodesic settings.
          */
-        registerProjectionChoice(utm_france_dom = new UTMFranceDOMProjectionChoice());              // FR
+        registerProjectionChoice(utm_france_dom);                                                   // FR
 
         /**
          * LKS-92/ Latvia TM projection.
@@ -280,11 +299,11 @@ public class ProjectionPreference implements SubPreferenceSetting {
     private JPanel projSubPrefPanel;
     private final JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
 
-    private JLabel projectionCodeLabel;
-    private Component projectionCodeGlue;
+    private JLabel projectionCodeLabel = new JLabel(tr("Projection code"));
+    private Component projectionCodeGlue = GBC.glue(5, 0);
     private final JLabel projectionCode = new JLabel();
-    private JLabel projectionNameLabel;
-    private Component projectionNameGlue;
+    private final JLabel projectionNameLabel = new JLabel(tr("Projection name"));
+    private final Component projectionNameGlue = GBC.glue(5, 0);
     private final JLabel projectionName = new JLabel();
     private final JLabel bounds = new JLabel();
 
@@ -322,11 +341,11 @@ public class ProjectionPreference implements SubPreferenceSetting {
         projPanel.add(new JLabel(tr("Projection method")), GBC.std().insets(5, 5, 0, 5));
         projPanel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
-        projPanel.add(projectionCodeLabel = new JLabel(tr("Projection code")), GBC.std().insets(25, 5, 0, 5));
-        projPanel.add(projectionCodeGlue = GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionCodeLabel, GBC.std().insets(25, 5, 0, 5));
+        projPanel.add(projectionCodeGlue, GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionCode, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
-        projPanel.add(projectionNameLabel = new JLabel(tr("Projection name")), GBC.std().insets(25, 5, 0, 5));
-        projPanel.add(projectionNameGlue = GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionNameLabel, GBC.std().insets(25, 5, 0, 5));
+        projPanel.add(projectionNameGlue, GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(projectionName, GBC.eop().fill(GBC.HORIZONTAL).insets(0, 5, 5, 5));
         projPanel.add(new JLabel(tr("Bounds")), GBC.std().insets(25, 5, 0, 5));
         projPanel.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
diff --git a/src/org/openstreetmap/josm/gui/preferences/projection/SingleProjectionChoice.java b/src/org/openstreetmap/josm/gui/preferences/projection/SingleProjectionChoice.java
index b4e90fa..fb82165 100644
--- a/src/org/openstreetmap/josm/gui/preferences/projection/SingleProjectionChoice.java
+++ b/src/org/openstreetmap/josm/gui/preferences/projection/SingleProjectionChoice.java
@@ -53,6 +53,7 @@ public class SingleProjectionChoice extends AbstractProjectionChoice {
 
     @Override
     public void setPreferences(Collection<String> args) {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ApiUrlTestTask.java b/src/org/openstreetmap/josm/gui/preferences/server/ApiUrlTestTask.java
index a295413..4ca33f5 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ApiUrlTestTask.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ApiUrlTestTask.java
@@ -142,7 +142,9 @@ public class ApiUrlTestTask extends PleaseWaitRunnable {
     }
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing
+    }
 
     /**
      * Removes leading and trailing whitespace from the API URL and removes trailing '/'.
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java
index 75f482b..1067f10 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/AuthenticationPreferencesPanel.java
@@ -24,20 +24,17 @@ import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
 
 /**
- * This is the preference panel for the authentication method and the authentication
- * parameters.
- *
+ * This is the preference panel for the authentication method and the authentication parameters.
+ * @since 2745
  */
 public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel implements PropertyChangeListener {
 
     /** indicates whether we use basic authentication */
-    private JRadioButton rbBasicAuthentication;
+    private final JRadioButton rbBasicAuthentication = new JRadioButton();
     /** indicates whether we use OAuth as authentication scheme */
-    private JRadioButton rbOAuth;
-    /** the panel which contains the authentication parameters for the respective
-     * authentication scheme
-     */
-    private JPanel pnlAuthenticationParameteters;
+    private final JRadioButton rbOAuth = new JRadioButton();
+    /** the panel which contains the authentication parameters for the respective authentication scheme */
+    private final JPanel pnlAuthenticationParameteters = new JPanel(new BorderLayout());
     /** the panel for the basic authentication parameters */
     private BasicAuthenticationPreferencesPanel pnlBasicAuthPreferences;
     /** the panel for the OAuth authentication parameters */
@@ -46,6 +43,15 @@ public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel im
     private FeaturesPanel pnlFeaturesPreferences;
 
     /**
+     * Constructs a new {@code AuthenticationPreferencesPanel}.
+     */
+    public AuthenticationPreferencesPanel() {
+        build();
+        initFromPreferences();
+        HelpUtil.setHelpContext(this, HelpUtil.ht("/Preferences/Connection#AuthenticationSettings"));
+    }
+
+    /**
      * builds the UI
      */
     protected final void build() {
@@ -60,7 +66,7 @@ public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel im
         gc.gridx = 1;
         gc.weightx = 1.0;
         gc.insets = new Insets(0, 0, 0, 3);
-        add(rbBasicAuthentication = new JRadioButton(), gc);
+        add(rbBasicAuthentication, gc);
         rbBasicAuthentication.setText(tr("Use Basic Authentication"));
         rbBasicAuthentication.setToolTipText(tr("Select to use HTTP basic authentication with your OSM username and password"));
         rbBasicAuthentication.addItemListener(authChangeListener);
@@ -68,7 +74,7 @@ public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel im
         //-- radio button for OAuth
         gc.gridx = 0;
         gc.weightx = 0.0;
-        add(rbOAuth = new JRadioButton(), gc);
+        add(rbOAuth, gc);
         rbOAuth.setText(tr("Use OAuth"));
         rbOAuth.setToolTipText(tr("Select to use OAuth as authentication mechanism"));
         rbOAuth.addItemListener(authChangeListener);
@@ -85,7 +91,6 @@ public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel im
         gc.fill = GridBagConstraints.BOTH;
         gc.weightx = 1.0;
         gc.weighty = 1.0;
-        pnlAuthenticationParameteters = new JPanel(new BorderLayout());
         add(pnlAuthenticationParameteters, gc);
 
         //-- the two panels for authentication parameters
@@ -106,15 +111,6 @@ public class AuthenticationPreferencesPanel extends VerticallyScrollablePanel im
     }
 
     /**
-     * Constructs a new {@code AuthenticationPreferencesPanel}.
-     */
-    public AuthenticationPreferencesPanel() {
-        build();
-        initFromPreferences();
-        HelpUtil.setHelpContext(this, HelpUtil.ht("/Preferences/Connection#AuthenticationSettings"));
-    }
-
-    /**
      * Initializes the panel from preferences
      */
     public final void initFromPreferences() {
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/BasicAuthenticationPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/BasicAuthenticationPreferencesPanel.java
index 203f700..5e2d47a 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/BasicAuthenticationPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/BasicAuthenticationPreferencesPanel.java
@@ -24,20 +24,26 @@ import org.openstreetmap.josm.io.auth.CredentialsAgentException;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
 
 /**
- * The preferences panel for parameters necessary for the Basic Authentication
- * Scheme.
- *
+ * The preferences panel for parameters necessary for the Basic Authentication Scheme.
+ * @since 2745
  */
 public class BasicAuthenticationPreferencesPanel extends JPanel {
 
     /** the OSM user name */
-    private JosmTextField tfOsmUserName;
+    private final JosmTextField tfOsmUserName = new JosmTextField();
     /** the OSM password */
-    private JosmPasswordField tfOsmPassword;
+    private final JosmPasswordField tfOsmPassword = new JosmPasswordField();
     /** a panel with further information, e.g. some warnings */
     private JPanel decorationPanel;
 
     /**
+     * Constructs a new {@code BasicAuthenticationPreferencesPanel}.
+     */
+    public BasicAuthenticationPreferencesPanel() {
+        build();
+    }
+
+    /**
      * builds the UI
      */
     protected final void build() {
@@ -54,7 +60,7 @@ public class BasicAuthenticationPreferencesPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfOsmUserName = new JosmTextField(), gc);
+        add(tfOsmUserName, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfOsmUserName);
         UserNameValidator valUserName = new UserNameValidator(tfOsmUserName);
         valUserName.validate();
@@ -67,7 +73,7 @@ public class BasicAuthenticationPreferencesPanel extends JPanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfOsmPassword = new JosmPasswordField(), gc);
+        add(tfOsmPassword, gc);
         SelectAllOnFocusGainedDecorator.decorate(tfOsmPassword);
         tfOsmPassword.setToolTipText(tr("Please enter your OSM password"));
 
@@ -84,13 +90,6 @@ public class BasicAuthenticationPreferencesPanel extends JPanel {
     }
 
     /**
-     * Constructs a new {@code BasicAuthenticationPreferencesPanel}.
-     */
-    public BasicAuthenticationPreferencesPanel() {
-        build();
-    }
-
-    /**
      * Inits contents from preferences.
      */
     public void initFromPreferences() {
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
index 2a5e24a..d4dd232 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OAuthAuthenticationPreferencesPanel.java
@@ -45,13 +45,13 @@ import org.openstreetmap.josm.tools.UserCancelException;
  * @since 2745
  */
 public class OAuthAuthenticationPreferencesPanel extends JPanel implements PropertyChangeListener {
-    private JPanel pnlAuthorisationMessage;
-    private NotYetAuthorisedPanel pnlNotYetAuthorised;
-    private AlreadyAuthorisedPanel pnlAlreadyAuthorised;
-    private AdvancedOAuthPropertiesPanel pnlAdvancedProperties;
+    private final JCheckBox cbShowAdvancedParameters = new JCheckBox();
+    private final JCheckBox cbSaveToPreferences = new JCheckBox(tr("Save to preferences"));
+    private final JPanel pnlAuthorisationMessage = new JPanel(new BorderLayout());
+    private final NotYetAuthorisedPanel pnlNotYetAuthorised = new NotYetAuthorisedPanel();
+    private final AdvancedOAuthPropertiesPanel pnlAdvancedProperties = new AdvancedOAuthPropertiesPanel();
+    private final AlreadyAuthorisedPanel pnlAlreadyAuthorised = new AlreadyAuthorisedPanel();
     private String apiUrl;
-    private JCheckBox cbShowAdvancedParameters;
-    private JCheckBox cbSaveToPreferences;
 
     /**
      * Create the panel
@@ -74,7 +74,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weightx = 0.0;
         gc.insets = new Insets(0, 0, 0, 3);
-        pnl.add(cbShowAdvancedParameters = new JCheckBox(), gc);
+        pnl.add(cbShowAdvancedParameters, gc);
         cbShowAdvancedParameters.setSelected(false);
         cbShowAdvancedParameters.addItemListener(
                 new ItemListener() {
@@ -97,7 +97,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         gc.fill = GridBagConstraints.BOTH;
         gc.weightx = 1.0;
         gc.weighty = 1.0;
-        pnl.add(pnlAdvancedProperties = new AdvancedOAuthPropertiesPanel(), gc);
+        pnl.add(pnlAdvancedProperties, gc);
         pnlAdvancedProperties.initFromPreferences(Main.pref);
         pnlAdvancedProperties.setBorder(
                 BorderFactory.createCompoundBorder(
@@ -125,12 +125,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
         gc.weighty = 1.0;
         gc.weightx = 1.0;
         gc.insets = new Insets(10, 0, 0, 0);
-        add(pnlAuthorisationMessage = new JPanel(new BorderLayout()), gc);
-
-        // create these two panels, they are going to be used later in refreshView
-        //
-        pnlAlreadyAuthorised = new AlreadyAuthorisedPanel();
-        pnlNotYetAuthorised = new NotYetAuthorisedPanel();
+        add(pnlAuthorisationMessage, gc);
     }
 
     protected void refreshView() {
@@ -195,9 +190,9 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
             gc.insets = new Insets(0, 0, 3, 0);
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
-            JMultilineLabel lbl;
-            add(lbl = new JMultilineLabel(
-                    tr("You do not have an Access Token yet to access the OSM server using OAuth. Please authorize first.")), gc);
+            JMultilineLabel lbl = new JMultilineLabel(
+                    tr("You do not have an Access Token yet to access the OSM server using OAuth. Please authorize first."));
+            add(lbl, gc);
             lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN));
 
             // Action for authorising now
@@ -220,8 +215,8 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
      *
      */
     private class AlreadyAuthorisedPanel extends JPanel {
-        private JosmTextField tfAccessTokenKey;
-        private JosmTextField tfAccessTokenSecret;
+        private final JosmTextField tfAccessTokenKey = new JosmTextField();
+        private final JosmTextField tfAccessTokenSecret = new JosmTextField();
 
         /**
          * Constructs a new {@code AlreadyAuthorisedPanel}.
@@ -239,8 +234,8 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weightx = 1.0;
             gc.gridwidth = 2;
-            JMultilineLabel lbl;
-            add(lbl = new JMultilineLabel(tr("You already have an Access Token to access the OSM server using OAuth.")), gc);
+            JMultilineLabel lbl = new JMultilineLabel(tr("You already have an Access Token to access the OSM server using OAuth."));
+            add(lbl, gc);
             lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN));
 
             // -- access token key
@@ -252,7 +247,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
 
             gc.gridx = 1;
             gc.weightx = 1.0;
-            add(tfAccessTokenKey = new JosmTextField(), gc);
+            add(tfAccessTokenKey, gc);
             tfAccessTokenKey.setEditable(false);
 
             // -- access token secret
@@ -264,7 +259,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
 
             gc.gridx = 1;
             gc.weightx = 1.0;
-            add(tfAccessTokenSecret = new JosmTextField(), gc);
+            add(tfAccessTokenSecret, gc);
             tfAccessTokenSecret.setEditable(false);
 
             // -- access token secret
@@ -272,7 +267,7 @@ public class OAuthAuthenticationPreferencesPanel extends JPanel implements Prope
             gc.gridx = 0;
             gc.gridwidth = 2;
             gc.weightx = 1.0;
-            add(cbSaveToPreferences = new JCheckBox(tr("Save to preferences")), gc);
+            add(cbSaveToPreferences, gc);
             cbSaveToPreferences.setSelected(OAuthAccessTokenHolder.getInstance().isSaveToPreferences());
 
             // -- action buttons
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
index 8448567..f87c268 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OsmApiUrlInputPanel.java
@@ -13,8 +13,6 @@ import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.Arrays;
 
 import javax.swing.AbstractAction;
@@ -35,6 +33,8 @@ import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
 import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmApiInitializationException;
+import org.openstreetmap.josm.io.OsmTransferCanceledException;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -48,9 +48,9 @@ public class OsmApiUrlInputPanel extends JPanel {
      */
     public static final String API_URL_PROP = OsmApiUrlInputPanel.class.getName() + ".apiUrl";
 
-    private JLabel lblValid;
-    private JLabel lblApiUrl;
-    private HistoryComboBox tfOsmServerUrl;
+    private final JLabel lblValid = new JLabel();
+    private final JLabel lblApiUrl = new JLabel(tr("OSM Server URL:"));
+    private final HistoryComboBox tfOsmServerUrl = new HistoryComboBox();
     private transient ApiUrlValidator valOsmServerUrl;
     private SideButton btnTest;
     /** indicates whether to use the default OSM URL or not */
@@ -94,11 +94,11 @@ public class OsmApiUrlInputPanel extends JPanel {
         gc.gridwidth = 1;
         gc.weightx = 0.0;
         gc.insets = new Insets(0, 0, 0, 3);
-        add(lblApiUrl = new JLabel(tr("OSM Server URL:")), gc);
+        add(lblApiUrl, gc);
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        add(tfOsmServerUrl = new HistoryComboBox(), gc);
+        add(tfOsmServerUrl, gc);
         lblApiUrl.setLabelFor(tfOsmServerUrl);
         SelectAllOnFocusGainedDecorator.decorate(tfOsmServerUrl.getEditorComponent());
         valOsmServerUrl = new ApiUrlValidator(tfOsmServerUrl.getEditorComponent());
@@ -109,13 +109,14 @@ public class OsmApiUrlInputPanel extends JPanel {
 
         gc.gridx = 2;
         gc.weightx = 0.0;
-        add(lblValid = new JLabel(), gc);
+        add(lblValid, gc);
 
         gc.gridx = 3;
         gc.weightx = 0.0;
         ValidateApiUrlAction actTest = new ValidateApiUrlAction();
         tfOsmServerUrl.getEditorComponent().getDocument().addDocumentListener(actTest);
-        add(btnTest = new SideButton(actTest), gc);
+        btnTest = new SideButton(actTest);
+        add(btnTest, gc);
     }
 
     /**
@@ -140,9 +141,7 @@ public class OsmApiUrlInputPanel extends JPanel {
     public void saveToPreferences() {
         String oldUrl = OsmApi.getOsmApi().getServerUrl();
         String hmiUrl = getStrippedApiUrl();
-        if (cbUseDefaultServerUrl.isSelected()) {
-            Main.pref.put("osm-server.url", null);
-        } else if (OsmApi.DEFAULT_API_URL.equals(hmiUrl)) {
+        if (cbUseDefaultServerUrl.isSelected() || OsmApi.DEFAULT_API_URL.equals(hmiUrl)) {
             Main.pref.put("osm-server.url", null);
         } else {
             Main.pref.put("osm-server.url", hmiUrl);
@@ -155,7 +154,7 @@ public class OsmApiUrlInputPanel extends JPanel {
         if (!oldUrl.equals(newUrl)) {
             try {
                 OsmApi.getOsmApi().initialize(null);
-            } catch (Exception x) {
+            } catch (OsmTransferCanceledException | OsmApiInitializationException x) {
                 Main.warn(x);
             }
         }
@@ -256,13 +255,7 @@ public class OsmApiUrlInputPanel extends JPanel {
         public boolean isValid() {
             if (getComponent().getText().trim().isEmpty())
                 return false;
-
-            try {
-                new URL(getComponent().getText().trim());
-                return true;
-            } catch (MalformedURLException e) {
-                return false;
-            }
+            return Utils.isValidUrl(getComponent().getText().trim());
         }
 
         @Override
@@ -296,6 +289,7 @@ public class OsmApiUrlInputPanel extends JPanel {
                 tfOsmServerUrl.requestFocusInWindow();
                 propagator.propagate();
                 break;
+            default: // Do nothing
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreference.java b/src/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreference.java
index d457e71..43f44ac 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/OverpassServerPreference.java
@@ -31,9 +31,9 @@ import org.openstreetmap.josm.tools.GBC;
 public class OverpassServerPreference implements SubPreferenceSetting {
 
     private static final StringProperty OVERPASS_SERVER = new StringProperty("download.overpass.server",
-            "http://overpass-api.de/api/");
+            "https://overpass-api.de/api/");
     private static final CollectionProperty OVERPASS_SERVER_HISTORY = new CollectionProperty("download.overpass.servers",
-            Arrays.asList("http://overpass-api.de/api/", "http://overpass.osm.rambler.ru/cgi/"));
+            Arrays.asList("https://overpass-api.de/api/", "http://overpass.osm.rambler.ru/cgi/"));
     private static final BooleanProperty FOR_MULTI_FETCH = new BooleanProperty("download.overpass.for-multi-fetch", false);
 
     private HistoryComboBox overpassServer = new HistoryComboBox();
diff --git a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
index c0e6178..dad6e01 100644
--- a/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
+++ b/src/org/openstreetmap/josm/gui/preferences/server/ProxyPreferencesPanel.java
@@ -101,12 +101,12 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
     public static final String PROXY_EXCEPTIONS = "proxy.exceptions";
 
     private transient Map<ProxyPolicy, JRadioButton> rbProxyPolicy;
-    private JosmTextField tfProxyHttpHost;
-    private JosmTextField tfProxyHttpPort;
-    private JosmTextField tfProxySocksHost;
-    private JosmTextField tfProxySocksPort;
-    private JosmTextField tfProxyHttpUser;
-    private JosmPasswordField tfProxyHttpPassword;
+    private final JosmTextField tfProxyHttpHost = new JosmTextField();
+    private final JosmTextField tfProxyHttpPort = new JosmTextField(5);
+    private final JosmTextField tfProxySocksHost = new JosmTextField(20);
+    private final JosmTextField tfProxySocksPort = new JosmTextField(5);
+    private final JosmTextField tfProxyHttpUser = new JosmTextField(20);
+    private final JosmPasswordField tfProxyHttpPassword = new JosmPasswordField(20);
 
     private JPanel pnlHttpProxyConfigurationPanel;
     private JPanel pnlSocksProxyConfigurationPanel;
@@ -133,7 +133,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxyHttpHost = new JosmTextField(), gc);
+        pnl.add(tfProxyHttpHost, gc);
 
         gc.gridy = 1;
         gc.gridx = 0;
@@ -143,7 +143,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxyHttpPort = new JosmTextField(5), gc);
+        pnl.add(tfProxyHttpPort, gc);
         tfProxyHttpPort.setMinimumSize(tfProxyHttpPort.getPreferredSize());
 
         gc.gridy = 2;
@@ -163,7 +163,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
         gc.gridy = 3;
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxyHttpUser = new JosmTextField(20), gc);
+        pnl.add(tfProxyHttpUser, gc);
         tfProxyHttpUser.setMinimumSize(tfProxyHttpUser.getPreferredSize());
 
         gc.gridy = 4;
@@ -173,7 +173,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxyHttpPassword = new JosmPasswordField(20), gc);
+        pnl.add(tfProxyHttpPassword, gc);
         tfProxyHttpPassword.setMinimumSize(tfProxyHttpPassword.getPreferredSize());
 
         // add an extra spacer, otherwise the layout is broken
@@ -208,7 +208,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxySocksHost = new JosmTextField(20), gc);
+        pnl.add(tfProxySocksHost, gc);
 
         gc.gridy = 1;
         gc.gridx = 0;
@@ -218,7 +218,7 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
 
         gc.gridx = 1;
         gc.weightx = 1.0;
-        pnl.add(tfProxySocksPort = new JosmTextField(5), gc);
+        pnl.add(tfProxySocksPort, gc);
         tfProxySocksPort.setMinimumSize(tfProxySocksPort.getPreferredSize());
 
         // add an extra spacer, otherwise the layout is broken
@@ -289,7 +289,8 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
         gc.fill = GridBagConstraints.HORIZONTAL;
         gc.weightx = 1.0;
         gc.weighty = 0.0;
-        pnl.add(pnlHttpProxyConfigurationPanel = buildHttpProxyConfigurationPanel(), gc);
+        pnlHttpProxyConfigurationPanel = buildHttpProxyConfigurationPanel();
+        pnl.add(pnlHttpProxyConfigurationPanel, gc);
 
         // radio button SOCKS proxy
         gc.gridx = 0;
@@ -308,7 +309,8 @@ public class ProxyPreferencesPanel extends VerticallyScrollablePanel {
         gc.anchor = GridBagConstraints.WEST;
         gc.weightx = 1.0;
         gc.weighty = 0.0;
-        pnl.add(pnlSocksProxyConfigurationPanel = buildSocksProxyConfigurationPanel(), gc);
+        pnlSocksProxyConfigurationPanel = buildSocksProxyConfigurationPanel();
+        pnl.add(pnlSocksProxyConfigurationPanel, gc);
 
         return pnl;
     }
diff --git a/src/org/openstreetmap/josm/gui/progress/ChildProgress.java b/src/org/openstreetmap/josm/gui/progress/ChildProgress.java
index b657e82..06c4947 100644
--- a/src/org/openstreetmap/josm/gui/progress/ChildProgress.java
+++ b/src/org/openstreetmap/josm/gui/progress/ChildProgress.java
@@ -29,6 +29,7 @@ public class ChildProgress extends AbstractProgressMonitor {
 
     @Override
     protected void doBeginTask() {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/progress/NullProgressMonitor.java b/src/org/openstreetmap/josm/gui/progress/NullProgressMonitor.java
index 7479336..8d39f79 100644
--- a/src/org/openstreetmap/josm/gui/progress/NullProgressMonitor.java
+++ b/src/org/openstreetmap/josm/gui/progress/NullProgressMonitor.java
@@ -15,11 +15,12 @@ public final class NullProgressMonitor implements ProgressMonitor {
     public static final ProgressMonitor INSTANCE = new NullProgressMonitor();
 
     private NullProgressMonitor() {
-
+        // Do nothing
     }
 
     @Override
     public void addCancelListener(CancelListener listener) {
+        // Do nothing
     }
 
     @Override
@@ -38,6 +39,7 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void cancel() {
+        // Do nothing
     }
 
     @Override
@@ -47,10 +49,7 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void finishTask() {
-    }
-
-    public String getErrorMessage() {
-        return null;
+        // Do nothing
     }
 
     @Override
@@ -67,6 +66,7 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void invalidate() {
+        // Do nothing
     }
 
     @Override
@@ -76,32 +76,32 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void removeCancelListener(CancelListener listener) {
+        // Do nothing
     }
 
     @Override
     public void setCustomText(String text) {
-    }
-
-    public void setErrorMessage(String message) {
+        // Do nothing
     }
 
     @Override
     public void setExtraText(String text) {
+        // Do nothing
     }
 
     @Override
     public void appendLogMessage(String message) {
-    }
-
-    public void setSilent(boolean value) {
+        // Do nothing
     }
 
     @Override
     public void setTicks(int ticks) {
+        // Do nothing
     }
 
     @Override
     public void setTicksCount(int ticks) {
+        // Do nothing
     }
 
     @Override
@@ -113,6 +113,7 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void worked(int ticks) {
+        // Do nothing
     }
 
     @Override
@@ -122,6 +123,7 @@ public final class NullProgressMonitor implements ProgressMonitor {
 
     @Override
     public void setProgressTaskId(ProgressTaskId taskId) {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/progress/SwingRenderingProgressMonitor.java b/src/org/openstreetmap/josm/gui/progress/SwingRenderingProgressMonitor.java
index 35b6946..83873f3 100644
--- a/src/org/openstreetmap/josm/gui/progress/SwingRenderingProgressMonitor.java
+++ b/src/org/openstreetmap/josm/gui/progress/SwingRenderingProgressMonitor.java
@@ -93,6 +93,7 @@ public class SwingRenderingProgressMonitor extends AbstractProgressMonitor {
 
     @Override
     public void setProgressTaskId(ProgressTaskId taskId) {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java b/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java
index 8594b1b..53499d8 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagEditorModel.java
@@ -79,6 +79,10 @@ public class TagEditorModel extends AbstractTableModel {
         this.colSelectionModel = colSelectionModel;
     }
 
+    /**
+     * Adds property change listener.
+     * @param listener property change listener to add
+     */
     public void addPropertyChangeListener(PropertyChangeListener listener) {
         propChangeSupport.addPropertyChangeListener(listener);
     }
@@ -101,6 +105,10 @@ public class TagEditorModel extends AbstractTableModel {
         return colSelectionModel;
     }
 
+    /**
+     * Removes property change listener.
+     * @param listener property change listener to remove
+     */
     public void removePropertyChangeListener(PropertyChangeListener listener) {
         propChangeSupport.removePropertyChangeListener(listener);
     }
@@ -145,11 +153,11 @@ public class TagEditorModel extends AbstractTableModel {
                 break;
             case 1:
                 String v = (String) value;
-                if (tag.getValueCount() > 1 && !v.isEmpty()) {
-                    updateTagValue(tag, v);
-                } else if (tag.getValueCount() <= 1) {
+                if ((tag.getValueCount() > 1 && !v.isEmpty()) || tag.getValueCount() <= 1) {
                     updateTagValue(tag, v);
                 }
+                break;
+            default: // Do nothing
             }
         }
     }
@@ -652,7 +660,7 @@ public class TagEditorModel extends AbstractTableModel {
             colMax = colSelectionModel.getMaxSelectionIndex();
         }
 
-        public void apply() {
+        void apply() {
             rowSelectionModel.setValueIsAdjusting(true);
             colSelectionModel.setValueIsAdjusting(true);
             if (rowMin >= 0 && rowMax >= 0) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java b/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
index 004e5bd..a9f317b 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagEditorPanel.java
@@ -74,23 +74,18 @@ public class TagEditorPanel extends JPanel {
         JPanel pnl = new JPanel();
         pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS));
 
-        // add action
-        //
-        JButton btn;
-        pnl.add(btn = new JButton(tagTable.getAddAction()));
-        btn.setMargin(new Insets(0, 0, 0, 0));
-        tagTable.addComponentNotStoppingCellEditing(btn);
+        buildButton(pnl, tagTable.getAddAction());
+        buildButton(pnl, tagTable.getDeleteAction());
+        buildButton(pnl, tagTable.getPasteAction());
 
-        // delete action
-        pnl.add(btn = new JButton(tagTable.getDeleteAction()));
-        btn.setMargin(new Insets(0, 0, 0, 0));
-        tagTable.addComponentNotStoppingCellEditing(btn);
+        return pnl;
+    }
 
-        // paste action
-        pnl.add(btn = new JButton(tagTable.getPasteAction()));
+    private void buildButton(JPanel pnl, AbstractAction action) {
+        JButton btn = new JButton(action);
+        pnl.add(btn);
         btn.setMargin(new Insets(0, 0, 0, 0));
         tagTable.addComponentNotStoppingCellEditing(btn);
-        return pnl;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/tagging/TagTable.java b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
index e2e7b37..e963fad 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TagTable.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TagTable.java
@@ -209,12 +209,13 @@ public class TagTable extends JosmTable  {
             case 2:
                 deleteTags();
                 break;
+            default: // Do nothing
             }
 
             if (isEditing()) {
-                CellEditor editor = getCellEditor();
-                if (editor != null) {
-                    editor.cancelCellEditing();
+                CellEditor cEditor = getCellEditor();
+                if (cEditor != null) {
+                    cEditor.cancelCellEditing();
                 }
             }
 
@@ -259,9 +260,9 @@ public class TagTable extends JosmTable  {
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            CellEditor editor = getCellEditor();
-            if (editor != null) {
-                getCellEditor().stopCellEditing();
+            CellEditor cEditor = getCellEditor();
+            if (cEditor != null) {
+                cEditor.stopCellEditing();
             }
             final int rowIdx = model.getRowCount()-1;
             if (rowIdx < 0 || !((TagModel) model.getValueAt(rowIdx, 0)).getName().trim().isEmpty()) {
@@ -598,10 +599,8 @@ public class TagTable extends JosmTable  {
                     // focus remains on one of the associated components
                     return;
                 else if (c instanceof Window) {
-                    if (c == SwingUtilities.getRoot(TagTable.this)) {
-                        if (!getCellEditor().stopCellEditing()) {
-                            getCellEditor().cancelCellEditing();
-                        }
+                    if (c == SwingUtilities.getRoot(TagTable.this) && !getCellEditor().stopCellEditing()) {
+                        getCellEditor().cancelCellEditing();
                     }
                     break;
                 }
diff --git a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
index 9a6b4a8..387275f 100644
--- a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
+++ b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletingComboBox.java
@@ -39,6 +39,8 @@ public class AutoCompletingComboBox extends JosmComboBox<AutoCompletionListItem>
     private int maxTextLength = -1;
     private boolean useFixedLocale;
 
+    private final transient InputContext privateInputContext = InputContext.getInstance();
+
     /**
      * Auto-complete a JosmComboBox.
      * <br>
@@ -334,8 +336,6 @@ public class AutoCompletingComboBox extends JosmComboBox<AutoCompletionListItem>
         }
     }
 
-    private final InputContext privateInputContext = InputContext.getInstance();
-
     @Override
     public InputContext getInputContext() {
         if (useFixedLocale) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
index 22764d3..0f34954 100644
--- a/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
+++ b/src/org/openstreetmap/josm/gui/tagging/ac/AutoCompletionItemPriority.java
@@ -116,15 +116,15 @@ public class AutoCompletionItemPriority implements Comparable<AutoCompletionItem
         if (ui != 0)
             return ui;
 
-        int sel = Boolean.valueOf(selected).compareTo(other.selected);
+        int sel = Boolean.compare(selected, other.selected);
         if (sel != 0)
             return sel;
 
-        int ds = Boolean.valueOf(inDataSet).compareTo(other.inDataSet);
+        int ds = Boolean.compare(inDataSet, other.inDataSet);
         if (ds != 0)
             return ds;
 
-        int std = Boolean.valueOf(inStandard).compareTo(other.inStandard);
+        int std = Boolean.compare(inStandard, other.inStandard);
         if (std != 0)
             return std;
 
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
index dfd77e4..7b0037f 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
@@ -95,7 +95,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
     /**
      * The types as preparsed collection.
      */
-    public Set<TaggingPresetType> types;
+    public transient Set<TaggingPresetType> types;
     public final transient List<TaggingPresetItem> data = new LinkedList<>();
     public transient Roles roles;
     public transient TemplateEntry nameTemplate;
@@ -529,7 +529,7 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
 
     @Override
     public String toString() {
-        return (types == null ? "" : types) + " " + name;
+        return (types == null ? "" : types.toString()) + ' ' + name;
     }
 
     public boolean typeMatches(Collection<TaggingPresetType> t) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
index 4ed08f3..e1b8bf5 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
@@ -117,7 +117,7 @@ public abstract class TaggingPresetItem {
             return null;
         try {
             return Integer.valueOf(str);
-        } catch (Exception e) {
+        } catch (NumberFormatException e) {
             if (Main.isTraceEnabled()) {
                 Main.trace(e.getMessage());
             }
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
index 74613dc..3591780 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
@@ -80,7 +80,7 @@ public final class TaggingPresetReader {
     }
 
     static class HashSetWithLast<E> extends LinkedHashSet<E> {
-        protected E last;
+        protected transient E last;
 
         @Override
         public boolean add(E e) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
index f8fedd3..30a419b 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSelector.java
@@ -167,7 +167,7 @@ public class TaggingPresetSelector extends SearchTextResultListPanel<TaggingPres
 
         @Override
         public String toString() {
-            return classification + " " + preset;
+            return Integer.toString(classification) + ' ' + preset;
         }
     }
 
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 893c9b1..e0801a0 100644
--- a/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
+++ b/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
@@ -446,7 +446,7 @@ public abstract class ComboMultiSelect extends KeyedItem {
                         Main.error(tr("Broken tagging preset \"{0}-{1}\" - Java method given in ''values_from'' is not \"{2}\"", key, text,
                                 "public static String[] methodName()"));
                     }
-                } catch (Exception e) {
+                } 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()));
                 }
diff --git a/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java b/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
index 803c16c..6f569b8 100644
--- a/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
+++ b/src/org/openstreetmap/josm/gui/util/AdjustmentSynchronizer.java
@@ -11,11 +11,11 @@ import java.awt.event.ItemListener;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Observable;
-import java.util.Observer;
 import java.util.Set;
 
 import javax.swing.JCheckBox;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -30,7 +30,7 @@ public class AdjustmentSynchronizer implements AdjustmentListener {
     private final Set<Adjustable> synchronizedAdjustables;
     private final Map<Adjustable, Boolean> enabledMap;
 
-    private final Observable observable;
+    private final ChangeNotifier observable;
 
     /**
      * Constructs a new {@code AdjustmentSynchronizer}
@@ -38,7 +38,7 @@ public class AdjustmentSynchronizer implements AdjustmentListener {
     public AdjustmentSynchronizer() {
         synchronizedAdjustables = new HashSet<>();
         enabledMap = new HashMap<>();
-        observable = new Observable();
+        observable = new ChangeNotifier();
     }
 
     /**
@@ -83,7 +83,7 @@ public class AdjustmentSynchronizer implements AdjustmentListener {
                     tr("Adjustable {0} not registered yet. Cannot set participation in synchronized adjustment.", adjustable));
 
         enabledMap.put(adjustable, isParticipating);
-        observable.notifyObservers();
+        observable.fireStateChanged();
     }
 
     /**
@@ -138,14 +138,15 @@ public class AdjustmentSynchronizer implements AdjustmentListener {
                         setParticipatingInSynchronizedScrolling(adjustable, false);
                     }
                     break;
+                default: // Do nothing
                 }
             }
         });
 
-        observable.addObserver(
-                new Observer() {
+        observable.addChangeListener(
+                new ChangeListener() {
                     @Override
-                    public void update(Observable o, Object arg) {
+                    public void stateChanged(ChangeEvent e) {
                         boolean sync = isParticipatingInSynchronizedScrolling(adjustable);
                         if (view.isSelected() != sync) {
                             view.setSelected(sync);
diff --git a/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java b/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java
new file mode 100644
index 0000000..d2e7e22
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/util/ChangeNotifier.java
@@ -0,0 +1,57 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+
+/**
+ * Replacement to {@code java.util.Observable} class, deprecated with Java 9.
+ * @since 10210
+ */
+public class ChangeNotifier {
+
+    /** Stores the listeners on this model. */
+    private final EventListenerList listenerList = new EventListenerList();
+
+    /**
+     * Only one {@code ChangeEvent} is needed per button model
+     * instance since the event's only state is the source property.
+     * The source of events generated is always "this".
+     */
+    private ChangeEvent changeEvent;
+
+    /**
+     * Adds a {@code ChangeListener}.
+     * @param l the listener to add
+     */
+    public final void addChangeListener(ChangeListener l) {
+        listenerList.add(ChangeListener.class, l);
+    }
+
+    /**
+     * Removes a {@code ChangeListener}.
+     * @param l the listener to add
+     */
+    public final void removeChangeListener(ChangeListener l) {
+        listenerList.remove(ChangeListener.class, l);
+    }
+
+    /**
+     * Notifies all listeners that have registered interest for notification on this event type.
+     * The event instance is created lazily.
+     */
+    protected final void fireStateChanged() {
+        // Guaranteed to return a non-null array
+        Object[] listeners = listenerList.getListenerList();
+        // Process the listeners last to first, notifying those that are interested in this event
+        for (int i = listeners.length-2; i >= 0; i -= 2) {
+            if (listeners[i] == ChangeListener.class) {
+                // Lazily create the event:
+                if (changeEvent == null)
+                    changeEvent = new ChangeEvent(this);
+                ((ChangeListener) listeners[i+1]).stateChanged(changeEvent);
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/gui/util/GuiHelper.java b/src/org/openstreetmap/josm/gui/util/GuiHelper.java
index c569db6..61b12fb 100644
--- a/src/org/openstreetmap/josm/gui/util/GuiHelper.java
+++ b/src/org/openstreetmap/josm/gui/util/GuiHelper.java
@@ -42,6 +42,7 @@ import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.Scrollable;
 import javax.swing.SwingUtilities;
@@ -129,6 +130,34 @@ public final class GuiHelper {
     }
 
     /**
+     * Executes synchronously a runnable in
+     * <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}.
+     * @param task The runnable to execute
+     * @see SwingUtilities#invokeAndWait
+     * @since 10271
+     */
+    public static void runInEDTAndWaitWithException(Runnable task) {
+        if (SwingUtilities.isEventDispatchThread()) {
+            task.run();
+        } 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());
+                }
+            }
+        }
+    }
+
+    /**
      * Executes synchronously a callable in
      * <a href="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html">Event Dispatch Thread</a>
      * and return a value.
@@ -158,6 +187,18 @@ public final class GuiHelper {
     }
 
     /**
+     * This function fails if it was not called from the EDT thread.
+     * @throws IllegalStateException if called from wrong thread.
+     * @since 10271
+     */
+    public static void assertCallFromEdt() {
+        if (!SwingUtilities.isEventDispatchThread()) {
+            throw new IllegalStateException(
+                    "Needs to be called from the EDT thread, not from " + Thread.currentThread().getName());
+        }
+    }
+
+    /**
      * Warns user about a dangerous action requiring confirmation.
      * @param title Title of dialog
      * @param content Content of dialog
@@ -477,7 +518,22 @@ public final class GuiHelper {
      * @since 9916
      */
     public static Window getWindowAncestorFor(EventObject e) {
-        return e != null && e.getSource() instanceof Component ? SwingUtilities.getWindowAncestor((Component) e.getSource()) : null;
+        if (e != null) {
+            Object source = e.getSource();
+            if (source instanceof Component) {
+                Window ancestor = SwingUtilities.getWindowAncestor((Component) source);
+                if (ancestor != null) {
+                    return ancestor;
+                } else {
+                    Container parent = ((Component) source).getParent();
+                    if (parent instanceof JPopupMenu) {
+                        Component invoker = ((JPopupMenu) parent).getInvoker();
+                        return SwingUtilities.getWindowAncestor(invoker);
+                    }
+                }
+            }
+        }
+        return null;
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/gui/util/RotationAngle.java b/src/org/openstreetmap/josm/gui/util/RotationAngle.java
index 9135eba..f068be0 100644
--- a/src/org/openstreetmap/josm/gui/util/RotationAngle.java
+++ b/src/org/openstreetmap/josm/gui/util/RotationAngle.java
@@ -66,7 +66,7 @@ public abstract class RotationAngle {
         switch (cardinal.toLowerCase(Locale.ENGLISH)) {
             case "n":
             case "north":
-                return Math.toRadians(0);
+                return 0; // 0 degree => 0 radian
             case "ne":
             case "northeast":
                 return Math.toRadians(45);
@@ -78,7 +78,7 @@ public abstract class RotationAngle {
                 return Math.toRadians(135);
             case "s":
             case "south":
-                return Math.toRadians(180);
+                return Math.PI; // 180 degree
             case "sw":
             case "southwest":
                 return Math.toRadians(225);
diff --git a/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java b/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
index 22523d6..a9d1f33 100644
--- a/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
+++ b/src/org/openstreetmap/josm/gui/widgets/AbstractIdTextField.java
@@ -37,7 +37,7 @@ public abstract class AbstractIdTextField<T extends AbstractTextComponentValidat
             if (klass != null) {
                 validator = klass.getConstructor(JTextComponent.class).newInstance(this);
             }
-        } catch (Exception e) {
+        } catch (ReflectiveOperationException e) {
             Main.error(e);
         } finally {
             this.validator = validator;
diff --git a/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java b/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
index cdc722d..34deaf8 100644
--- a/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
+++ b/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
@@ -21,7 +21,8 @@ public class HistoryComboBox extends AutoCompletingComboBox {
      */
     public HistoryComboBox() {
         int maxsize = Main.pref.getInteger("search.history-size", DEFAULT_SEARCH_HISTORY_SIZE);
-        setModel(model = new ComboBoxHistory(maxsize));
+        model = new ComboBoxHistory(maxsize);
+        setModel(model);
         setEditable(true);
     }
 
diff --git a/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java b/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
index 26b6b9a..466a5ce 100644
--- a/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
@@ -17,9 +17,9 @@ import org.openstreetmap.josm.tools.ImageProvider;
  * @since 5965
  */
 public class ImageLabel extends JPanel {
-    private final JLabel imgLabel;
-    private final JLabel tf;
-    private final int charCount;
+    private final JLabel imgLabel = new JLabel();
+    private final JLabel tf = new JLabel();
+    private int charCount;
 
     /**
      * Constructs a new {@code ImageLabel}.
@@ -31,11 +31,11 @@ public class ImageLabel extends JPanel {
     public ImageLabel(String img, String tooltip, int charCount, Color background) {
         setLayout(new GridBagLayout());
         setBackground(background);
-        add(imgLabel = new JLabel(), GBC.std().anchor(GBC.WEST).insets(0, 1, 1, 0));
+        add(imgLabel, GBC.std().anchor(GBC.WEST).insets(0, 1, 1, 0));
         setIcon(img);
-        add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2, 1, 1, 0));
+        add(tf, GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2, 1, 1, 0));
         setToolTipText(tooltip);
-        this.charCount = charCount;
+        setCharCount(charCount);
     }
 
     /**
@@ -63,4 +63,22 @@ public class ImageLabel extends JPanel {
     public Dimension getMinimumSize() {
         return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getMinimumSize().height);
     }
+
+    /**
+     * Returns the preferred char count.
+     * @return the preferred char count
+     * @since 10191
+     */
+    public final int getCharCount() {
+        return charCount;
+    }
+
+    /**
+     * Sets the preferred char count.
+     * @param charCount the preferred char count
+     * @since 10191
+     */
+    public final void setCharCount(int charCount) {
+        this.charCount = charCount;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/widgets/JosmImageView.java b/src/org/openstreetmap/josm/gui/widgets/JosmImageView.java
index 6114ded..b106cd4 100644
--- a/src/org/openstreetmap/josm/gui/widgets/JosmImageView.java
+++ b/src/org/openstreetmap/josm/gui/widgets/JosmImageView.java
@@ -16,6 +16,7 @@ import javax.swing.text.html.ImageView;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Specialized Image View allowing to display SVG images.
@@ -46,10 +47,7 @@ public class JosmImageView extends ImageView {
         stateField = ImageView.class.getDeclaredField("state");
         widthField = ImageView.class.getDeclaredField("width");
         heightField = ImageView.class.getDeclaredField("height");
-        imageField.setAccessible(true);
-        stateField.setAccessible(true);
-        widthField.setAccessible(true);
-        heightField.setAccessible(true);
+        Utils.setObjectsAccessible(imageField, stateField, widthField, heightField);
     }
 
     /**
@@ -101,7 +99,7 @@ public class JosmImageView extends ImageView {
 
             // And update the size params
             Method updateImageSize = ImageView.class.getDeclaredMethod("updateImageSize");
-            updateImageSize.setAccessible(true);
+            Utils.setObjectsAccessible(updateImageSize);
             updateImageSize.invoke(this);
         } finally {
             synchronized (this) {
@@ -129,7 +127,7 @@ public class JosmImageView extends ImageView {
                 imageField.set(this, imgIcon != null ? imgIcon.getImage() : null);
             } else {
                 Method loadImage = ImageView.class.getDeclaredMethod("loadImage");
-                loadImage.setAccessible(true);
+                Utils.setObjectsAccessible(loadImage);
                 loadImage.invoke(this);
             }
         } else {
diff --git a/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java b/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
index bbf547a..4e87379 100644
--- a/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
+++ b/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
@@ -28,23 +28,17 @@ import java.awt.LayoutManager;
 import java.awt.Rectangle;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
-import java.io.Reader;
-import java.io.StreamTokenizer;
-import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import java.util.Locale;
 import java.util.Map;
 
 import javax.swing.UIManager;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
-import org.openstreetmap.josm.tools.Utils;
 
 /**
  * The MultiSplitLayout layout manager recursively arranges its
@@ -103,18 +97,30 @@ public class MultiSplitLayout implements LayoutManager {
         }
     }
 
+    /**
+     * Add property change listener.
+     * @param listener listener to add
+     */
     public void addPropertyChangeListener(PropertyChangeListener listener) {
         if (listener != null) {
             pcs.addPropertyChangeListener(listener);
         }
     }
 
+    /**
+     * Remove property change listener.
+     * @param listener listener to remove
+     */
     public void removePropertyChangeListener(PropertyChangeListener listener) {
         if (listener != null) {
             pcs.removePropertyChangeListener(listener);
         }
     }
 
+    /**
+     * Replies list of property change listeners.
+     * @return list of property change listeners
+     */
     public PropertyChangeListener[] getPropertyChangeListeners() {
         return pcs.getPropertyChangeListeners();
     }
@@ -651,7 +657,7 @@ public class MultiSplitLayout implements LayoutManager {
                     Divider dividerChild =
                         splitChildren.hasNext() ? (Divider) splitChildren.next() : null;
 
-                        double childHeight = 0.0;
+                        double childHeight;
                         if (getFloatingDividers()) {
                             childHeight = preferredNodeSize(splitChild).getHeight();
                         } else {
@@ -713,7 +719,7 @@ public class MultiSplitLayout implements LayoutManager {
         throw new InvalidLayoutException(msg, node);
     }
 
-    private void checkLayout(Node root) {
+    private static void checkLayout(Node root) {
         if (root instanceof Split) {
             Split split = (Split) root;
             if (split.getChildren().size() <= 2) {
@@ -791,7 +797,7 @@ public class MultiSplitLayout implements LayoutManager {
         (r1.y <= (r2.y + r2.height)) && ((r1.y + r1.height) >= r2.y);
     }
 
-    private List<Divider> dividersThatOverlap(Node root, Rectangle r) {
+    private static List<Divider> dividersThatOverlap(Node root, Rectangle r) {
         if (nodeOverlapsRectangle(root, r) && (root instanceof Split)) {
             List<Divider> dividers = new ArrayList<>();
             for (Node child : ((Split) root).getChildren()) {
@@ -1137,143 +1143,4 @@ public class MultiSplitLayout implements LayoutManager {
             return "MultiSplitLayout.Divider " + getBounds();
         }
     }
-
-    private static void throwParseException(StreamTokenizer st, String msg) throws Exception {
-        throw new Exception("MultiSplitLayout.parseModel Error: " + msg);
-    }
-
-    private static void parseAttribute(String name, StreamTokenizer st, Node node) throws Exception {
-        if (st.nextToken() != '=') {
-            throwParseException(st, "expected '=' after " + name);
-        }
-        if ("WEIGHT".equalsIgnoreCase(name)) {
-            if (st.nextToken() == StreamTokenizer.TT_NUMBER) {
-                node.setWeight(st.nval);
-            } else {
-                throwParseException(st, "invalid weight");
-            }
-        } else if ("NAME".equalsIgnoreCase(name)) {
-            if (st.nextToken() == StreamTokenizer.TT_WORD) {
-                if (node instanceof Leaf) {
-                    ((Leaf) node).setName(st.sval);
-                } else {
-                    throwParseException(st, "can't specify name for " + node);
-                }
-            } else {
-                throwParseException(st, "invalid name");
-            }
-        } else {
-            throwParseException(st, "unrecognized attribute \"" + name + '\"');
-        }
-    }
-
-    private static void addSplitChild(Split parent, Node child) {
-        List<Node> children = new ArrayList<>(parent.getChildren());
-        if (children.isEmpty()) {
-            children.add(child);
-        } else {
-            children.add(new Divider());
-            children.add(child);
-        }
-        parent.setChildren(children);
-    }
-
-    private static void parseLeaf(StreamTokenizer st, Split parent) throws Exception {
-        Leaf leaf = new Leaf();
-        int token;
-        while ((token = st.nextToken()) != StreamTokenizer.TT_EOF) {
-            if (token == ')') {
-                break;
-            }
-            if (token == StreamTokenizer.TT_WORD) {
-                parseAttribute(st.sval, st, leaf);
-            } else {
-                throwParseException(st, "Bad Leaf: " + leaf);
-            }
-        }
-        addSplitChild(parent, leaf);
-    }
-
-    private static void parseSplit(StreamTokenizer st, Split parent) throws Exception {
-        int token;
-        while ((token = st.nextToken()) != StreamTokenizer.TT_EOF) {
-            if (token == ')') {
-                break;
-            } else if (token == StreamTokenizer.TT_WORD) {
-                if ("WEIGHT".equalsIgnoreCase(st.sval)) {
-                    parseAttribute(st.sval, st, parent);
-                } else {
-                    addSplitChild(parent, new Leaf(st.sval));
-                }
-            } else if (token == '(') {
-                if ((token = st.nextToken()) != StreamTokenizer.TT_WORD) {
-                    throwParseException(st, "invalid node type");
-                }
-                String nodeType = st.sval.toUpperCase(Locale.ENGLISH);
-                if ("LEAF".equals(nodeType)) {
-                    parseLeaf(st, parent);
-                } else if ("ROW".equals(nodeType) || "COLUMN".equals(nodeType)) {
-                    Split split = new Split();
-                    split.setRowLayout("ROW".equals(nodeType));
-                    addSplitChild(parent, split);
-                    parseSplit(st, split);
-                } else {
-                    throwParseException(st, "unrecognized node type '" + nodeType + '\'');
-                }
-            }
-        }
-    }
-
-    private static Node parseModel(Reader r) {
-        StreamTokenizer st = new StreamTokenizer(r);
-        try {
-            Split root = new Split();
-            parseSplit(st, root);
-            return root.getChildren().get(0);
-        } catch (Exception e) {
-            Main.error(e);
-        } finally {
-            Utils.close(r);
-        }
-        return null;
-    }
-
-    /**
-     * A convenience method that converts a string to a MultiSplitLayout model (a tree of Nodes) using a
-     * a simple syntax.  Nodes are represented by parenthetical expressions whose first token
-     * is one of ROW/COLUMN/LEAF.  ROW and COLUMN specify horizontal and vertical Split nodes respectively,
-     * LEAF specifies a Leaf node.  A Leaf's name and weight can be specified with attributes,
-     * name=<i>myLeafName</i> weight=<i>myLeafWeight</i>.
-     * Similarly, a Split's weight can be specified with weight=<i>mySplitWeight</i>.
-     *
-     * <p> For example, the following expression generates a horizontal Split node with three children:
-     * the Leafs named left and right, and a Divider in between:
-     * <pre>
-     * (ROW (LEAF name=left) (LEAF name=right weight=1.0))
-     * </pre>
-     *
-     * <p> Dividers should not be included in the string, they're added automatcially as needed.  Because
-     * Leaf nodes often only need to specify a name, one can specify a Leaf by just providing the name.
-     * The previous example can be written like this:
-     * <pre>
-     * (ROW left (LEAF name=right weight=1.0))
-     * </pre>
-     *
-     * <p>Here's a more complex example.  One row with three elements, the first and last of which are columns
-     * with two leaves each:
-     * <pre>
-     * (ROW (COLUMN weight=0.5 left.top left.bottom)
-     *      (LEAF name=middle)
-     *      (COLUMN weight=0.5 right.top right.bottom))
-     * </pre>
-     *
-     * <p> This syntax is not intended for archiving or configuration files .  It's just a convenience for
-     * examples and tests.
-     * @param s model as string
-     *
-     * @return the Node root of a tree based on s.
-     */
-    public static Node parseModel(String s) {
-        return parseModel(new StringReader(s));
-    }
 }
diff --git a/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java b/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
index b17989e..cb6a029 100644
--- a/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
+++ b/src/org/openstreetmap/josm/gui/widgets/MultiSplitPane.java
@@ -383,10 +383,14 @@ public class MultiSplitPane extends JPanel {
         }
 
         @Override
-        public void keyReleased(KeyEvent e) { }
+        public void keyReleased(KeyEvent e) {
+            // Do nothing
+        }
 
         @Override
-        public void keyTyped(KeyEvent e) { }
+        public void keyTyped(KeyEvent e) {
+            // Do nothing
+        }
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/widgets/PopupMenuLauncher.java b/src/org/openstreetmap/josm/gui/widgets/PopupMenuLauncher.java
index f4f5416..3cf1207 100644
--- a/src/org/openstreetmap/josm/gui/widgets/PopupMenuLauncher.java
+++ b/src/org/openstreetmap/josm/gui/widgets/PopupMenuLauncher.java
@@ -3,8 +3,8 @@ package org.openstreetmap.josm.gui.widgets;
 
 import java.awt.Component;
 import java.awt.Point;
+import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
@@ -94,10 +94,7 @@ public class PopupMenuLauncher extends MouseAdapter {
 
     protected void checkFocusAndShowMenu(final Component component, final MouseEvent evt) {
         if (component != null && component.isFocusable() && !component.hasFocus() && component.requestFocusInWindow()) {
-            component.addFocusListener(new FocusListener() {
-                @Override
-                public void focusLost(FocusEvent e) {}
-
+            component.addFocusListener(new FocusAdapter() {
                 @Override
                 public void focusGained(FocusEvent e) {
                     showMenu(evt);
diff --git a/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java b/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java
index 9185785..f2610f6 100644
--- a/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java
+++ b/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java
@@ -91,7 +91,9 @@ public class QuadStateCheckBox extends JCheckBox {
 
     /** Do not let anyone add mouse listeners */
     @Override
-    public void addMouseListener(MouseListener l) { }
+    public void addMouseListener(MouseListener l) {
+        // Do nothing
+    }
 
     /**
      * Sets a text describing this property in the tooltip text
@@ -210,13 +212,19 @@ public class QuadStateCheckBox extends JCheckBox {
         // ----------------------------------------------------------------------
 
         @Override
-        public void setArmed(boolean b) { }
+        public void setArmed(boolean b) {
+            // Do nothing
+        }
 
         @Override
-        public void setSelected(boolean b) { }
+        public void setSelected(boolean b) {
+            // Do nothing
+        }
 
         @Override
-        public void setPressed(boolean b) { }
+        public void setPressed(boolean b) {
+            // Do nothing
+        }
 
         /** We disable focusing on the component when it is not enabled. */
         @Override
diff --git a/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java b/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java
index 17094d1..1b2b81e 100644
--- a/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java
@@ -32,6 +32,9 @@ public abstract class SearchTextResultListPanel<T> extends JPanel {
 
     protected abstract void filterItems();
 
+    /**
+     * Constructs a new {@code SearchTextResultListPanel}.
+     */
     public SearchTextResultListPanel() {
         super(new BorderLayout());
 
@@ -74,6 +77,7 @@ public abstract class SearchTextResultListPanel<T> extends JPanel {
                     case KeyEvent.VK_END:
                         selectItem(lsResultModel.getSize());
                         break;
+                    default: // Do nothing
                 }
             }
         });
diff --git a/src/org/openstreetmap/josm/gui/widgets/UrlLabel.java b/src/org/openstreetmap/josm/gui/widgets/UrlLabel.java
index c9983f3..fbb21e4 100644
--- a/src/org/openstreetmap/josm/gui/widgets/UrlLabel.java
+++ b/src/org/openstreetmap/josm/gui/widgets/UrlLabel.java
@@ -67,7 +67,7 @@ public class UrlLabel extends JLabel implements MouseListener {
         setUrl(url);
         setDescription(description);
         if (fontPlus != 0) {
-            setFont(getFont().deriveFont(0, getFont().getSize()+fontPlus));
+            setFont(getFont().deriveFont(0, (float) getFont().getSize()+fontPlus));
         }
         refresh();
     }
diff --git a/src/org/openstreetmap/josm/io/AllFormatsImporter.java b/src/org/openstreetmap/josm/io/AllFormatsImporter.java
index ac2c155..4f77838 100644
--- a/src/org/openstreetmap/josm/io/AllFormatsImporter.java
+++ b/src/org/openstreetmap/josm/io/AllFormatsImporter.java
@@ -40,6 +40,6 @@ public class AllFormatsImporter extends FileImporter {
             ext.append(fi.filter.getExtensions()).append(',');
         }
         // remove last comma
-        return ext.substring(0, ext.length()-1).toString();
+        return ext.substring(0, ext.length()-1);
     }
 }
diff --git a/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java b/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
index 22a22b8..fb37c70 100644
--- a/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
+++ b/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
@@ -67,6 +67,8 @@ public class BoundingBoxDownloader extends OsmServerReader {
                 } else {
                     done = true;
                 }
+            } catch (OsmApiException ex) {
+                throw ex; // this avoids infinite loop in case of API error such as bad request (ex: bbox too large, see #12853)
             } catch (OsmTransferException | SocketException ex) {
                 if (isCanceled()) {
                     final OsmTransferCanceledException canceledException = new OsmTransferCanceledException("Operation canceled");
@@ -191,7 +193,7 @@ public class BoundingBoxDownloader extends OsmServerReader {
             return ds;
         } catch (OsmTransferException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (IllegalDataException | IOException e) {
             throw new OsmTransferException(e);
         } finally {
             progressMonitor.finishTask();
@@ -236,10 +238,14 @@ public class BoundingBoxDownloader extends OsmServerReader {
          */
         public final int limit;
 
+        /**
+         * Constructs a {@code MoreNotesException}.
+         * @param notes downloaded notes
+         * @param limit download limit sent to the server
+         */
         public MoreNotesException(List<Note> notes, int limit) {
             this.notes = notes;
             this.limit = limit;
         }
     }
-
 }
diff --git a/src/org/openstreetmap/josm/io/CachedFile.java b/src/org/openstreetmap/josm/io/CachedFile.java
index 7845e17..3ef698d 100644
--- a/src/org/openstreetmap/josm/io/CachedFile.java
+++ b/src/org/openstreetmap/josm/io/CachedFile.java
@@ -75,7 +75,7 @@ public class CachedFile implements Closeable {
     protected boolean initialized;
 
     public static final long DEFAULT_MAXTIME = -1L;
-    public static final long DAYS = 24*60*60; // factor to get caching time in days
+    public static final long DAYS = 24L*60L*60L; // factor to get caching time in days
 
     private final Map<String, String> httpHeaders = new ConcurrentHashMap<>();
 
@@ -175,6 +175,12 @@ public class CachedFile implements Closeable {
         return name;
     }
 
+    /**
+     * Returns maximum age of cache file. Only applies to URLs.
+     * When this time has passed after the last download of the file, the
+     * cache is considered stale and a new download will be attempted.
+     * @return the maximum cache age in seconds
+     */
     public long getMaxAge() {
         return maxAge;
     }
@@ -345,7 +351,7 @@ public class CachedFile implements Closeable {
             } else {
                 Utils.close(zipFile);
             }
-        } catch (Exception e) {
+        } catch (IOException e) {
             if (file.getName().endsWith(".zip")) {
                 Main.warn(tr("Failed to open file with extension ''{2}'' and namepart ''{3}'' in zip file ''{0}''. Exception was: {1}",
                         file.getName(), e.toString(), extension, namepart));
diff --git a/src/org/openstreetmap/josm/io/CertificateAmendment.java b/src/org/openstreetmap/josm/io/CertificateAmendment.java
index 192c91b..a0a8c30 100644
--- a/src/org/openstreetmap/josm/io/CertificateAmendment.java
+++ b/src/org/openstreetmap/josm/io/CertificateAmendment.java
@@ -10,13 +10,11 @@ import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
 import java.security.InvalidAlgorithmParameterException;
-import java.security.KeyManagementException;
 import java.security.KeyStore;
 import java.security.KeyStoreException;
 import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.PKIXParameters;
 import java.security.cert.TrustAnchor;
@@ -58,78 +56,51 @@ public final class CertificateAmendment {
     /**
      * Add missing root certificates to the list of trusted certificates for TLS connections.
      * @throws IOException if an I/O error occurs
+     * @throws GeneralSecurityException if a security error occurs
      */
-    public static void addMissingCertificates() throws IOException {
+    public static void addMissingCertificates() throws IOException, GeneralSecurityException {
         if (!Main.pref.getBoolean("tls.add-missing-certificates", true))
             return;
-        KeyStore keyStore;
-        try {
-            keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-        } catch (KeyStoreException ex) {
-            throw new IOException(ex);
-        }
+        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
         Path cacertsPath = Paths.get(System.getProperty("java.home"), "lib", "security", "cacerts");
         try (InputStream is = Files.newInputStream(cacertsPath)) {
             keyStore.load(is, "changeit".toCharArray());
-        } catch (NoSuchAlgorithmException ex) {
-            throw new RuntimeException(ex);
-        } catch (CertificateException ex) {
-            throw new IOException(ex);
         }
 
-        CertificateFactory cf;
-        try {
-            cf = CertificateFactory.getInstance("X.509");
-        } catch (CertificateException ex) {
-            throw new RuntimeException(ex);
-        }
+        CertificateFactory cf = CertificateFactory.getInstance("X.509");
         boolean certificateAdded = false;
         for (int i = 0; i < CERT_AMEND.length; i++) {
-            CachedFile certCF = new CachedFile(CERT_AMEND[i]);
-            byte[] certBytes = certCF.getByteContent();
-            ByteArrayInputStream certIS = new ByteArrayInputStream(certBytes);
-            X509Certificate cert;
-
-            try {
-                cert = (X509Certificate) cf.generateCertificate(certIS);
+            try (CachedFile certCF = new CachedFile(CERT_AMEND[i])) {
+                byte[] certBytes = certCF.getByteContent();
+                ByteArrayInputStream certIS = new ByteArrayInputStream(certBytes);
+                X509Certificate cert = (X509Certificate) cf.generateCertificate(certIS);
                 MessageDigest md = MessageDigest.getInstance("SHA-256");
                 String sha1 = Utils.toHexString(md.digest(cert.getEncoded()));
                 if (!SHA_HASHES[i].equals(sha1)) {
-                    throw new RuntimeException(tr("Error adding certificate {0} - certificate fingerprint mismatch. Expected {1}, was {2}",
+                    throw new IllegalStateException(
+                            tr("Error adding certificate {0} - certificate fingerprint mismatch. Expected {1}, was {2}",
                             CERT_AMEND[i],
                             SHA_HASHES[i],
                             sha1
                             ));
                 }
-            } catch (CertificateException ex) {
-                throw new IOException(ex);
-            } catch (NoSuchAlgorithmException ex) {
-                throw new RuntimeException(ex);
-            }
-            if (certificateIsMissing(keyStore, cert)) {
-                if (Main.isDebugEnabled()) {
-                    Main.debug(tr("Adding certificate for TLS connections: {0}", cert.getSubjectX500Principal().getName()));
-                }
-                String alias = "josm:" + new File(CERT_AMEND[i]).getName();
-                try {
+                if (certificateIsMissing(keyStore, cert)) {
+                    if (Main.isDebugEnabled()) {
+                        Main.debug(tr("Adding certificate for TLS connections: {0}", cert.getSubjectX500Principal().getName()));
+                    }
+                    String alias = "josm:" + new File(CERT_AMEND[i]).getName();
                     keyStore.setCertificateEntry(alias, cert);
-                } catch (KeyStoreException ex) {
-                    throw new AssertionError(ex);
+                    certificateAdded = true;
                 }
-                certificateAdded = true;
             }
         }
 
         if (certificateAdded) {
-            try {
-                TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
-                tmf.init(keyStore);
-                SSLContext sslContext = SSLContext.getInstance("TLS");
-                sslContext.init(null, tmf.getTrustManagers(), null);
-                SSLContext.setDefault(sslContext);
-            } catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException ex) {
-                throw new RuntimeException(ex);
-            }
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+            tmf.init(keyStore);
+            SSLContext sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(null, tmf.getTrustManagers(), null);
+            SSLContext.setDefault(sslContext);
         }
     }
 
@@ -138,16 +109,12 @@ public final class CertificateAmendment {
      * @param keyStore the keystore
      * @param crt the certificate
      * @return true, if the certificate is not contained in the keystore
+     * @throws InvalidAlgorithmParameterException if the keystore does not contain at least one trusted certificate entry
+     * @throws KeyStoreException if the keystore has not been initialized
      */
-    private static boolean certificateIsMissing(KeyStore keyStore, X509Certificate crt) {
-        PKIXParameters params;
-        try {
-            params = new PKIXParameters(keyStore);
-        } catch (KeyStoreException ex) {
-            throw new AssertionError(ex);
-        } catch (InvalidAlgorithmParameterException ex) {
-            throw new RuntimeException(ex);
-        }
+    private static boolean certificateIsMissing(KeyStore keyStore, X509Certificate crt)
+            throws KeyStoreException, InvalidAlgorithmParameterException {
+        PKIXParameters params = new PKIXParameters(keyStore);
         String id = crt.getSubjectX500Principal().getName();
         for (TrustAnchor ta : params.getTrustAnchors()) {
             X509Certificate cert = ta.getTrustedCert();
diff --git a/src/org/openstreetmap/josm/io/ChangesetQuery.java b/src/org/openstreetmap/josm/io/ChangesetQuery.java
index b1c4c35..24fa9ad 100644
--- a/src/org/openstreetmap/josm/io/ChangesetQuery.java
+++ b/src/org/openstreetmap/josm/io/ChangesetQuery.java
@@ -27,18 +27,7 @@ public class ChangesetQuery {
     /**
      * Maximum number of changesets returned by the OSM API call "/changesets?"
      */
-    public static int MAX_CHANGESETS_NUMBER = 100;
-
-    /**
-     * Replies a changeset query object from the query part of a OSM API URL for querying changesets.
-     *
-     * @param query the query part
-     * @return the query object
-     * @throws ChangesetQueryUrlException if query doesn't consist of valid query parameters
-     */
-    public static ChangesetQuery buildFromUrlQuery(String query) throws ChangesetQueryUrlException {
-        return new ChangesetQueryUrlParser().parse(query);
-    }
+    public static final int MAX_CHANGESETS_NUMBER = 100;
 
     /** the user id this query is restricted to. null, if no restriction to a user id applies */
     private Integer uid;
@@ -57,6 +46,17 @@ public class ChangesetQuery {
     private Collection<Long> changesetIds;
 
     /**
+     * Replies a changeset query object from the query part of a OSM API URL for querying changesets.
+     *
+     * @param query the query part
+     * @return the query object
+     * @throws ChangesetQueryUrlException if query doesn't consist of valid query parameters
+     */
+    public static ChangesetQuery buildFromUrlQuery(String query) throws ChangesetQueryUrlException {
+        return new ChangesetQueryUrlParser().parse(query);
+    }
+
+    /**
      * Restricts the query to changesets owned by the user with id <code>uid</code>.
      *
      * @param uid the uid of the user. > 0 expected.
@@ -240,7 +240,7 @@ public class ChangesetQuery {
     public ChangesetQuery forChangesetIds(Collection<Long> changesetIds) {
         CheckParameterUtil.ensureParameterNotNull(changesetIds, "changesetIds");
         if (changesetIds.size() > MAX_CHANGESETS_NUMBER) {
-            Main.warn("Changeset query built with more than " + MAX_CHANGESETS_NUMBER + " changeset ids (" + changesetIds.size() + ")");
+            Main.warn("Changeset query built with more than " + MAX_CHANGESETS_NUMBER + " changeset ids (" + changesetIds.size() + ')');
         }
         this.changesetIds = changesetIds;
         return this;
@@ -304,6 +304,9 @@ public class ChangesetQuery {
         return getQueryString();
     }
 
+    /**
+     * Exception thrown for invalid changeset queries.
+     */
     public static class ChangesetQueryUrlException extends Exception {
 
         /**
@@ -338,6 +341,9 @@ public class ChangesetQuery {
         }
     }
 
+    /**
+     * Changeset query URL parser.
+     */
     public static class ChangesetQueryUrlParser {
         protected int parseUid(String value) throws ChangesetQueryUrlException {
             if (value == null || value.trim().isEmpty())
@@ -393,7 +399,7 @@ public class ChangesetQuery {
                 return new Date[]{parseDate(dates[0], "time")};
             else if (dates.length == 2)
                 return new Date[]{parseDate(dates[0], "time"), parseDate(dates[1], "time")};
-            return null;
+            return new Date[]{};
         }
 
         protected Collection<Long> parseLongs(String value) {
@@ -440,6 +446,8 @@ public class ChangesetQuery {
                     case 2:
                         csQuery.closedAfterAndCreatedBefore(dates[0], dates[1]);
                         break;
+                    default:
+                        Main.warn("Unable to parse time: " + entry.getValue());
                     }
                     break;
                 case "bbox":
@@ -485,19 +493,17 @@ public class ChangesetQuery {
          *    uid=1234&open=true
          * </pre>
          *
-         * @param query the query string. If null, an empty query (identical to a query for all changesets) is
-         * assumed
+         * @param query the query string. If null, an empty query (identical to a query for all changesets) is assumed
          * @return the changeset query
          * @throws ChangesetQueryUrlException if the query string doesn't represent a legal query for changesets
          */
         public ChangesetQuery parse(String query) throws ChangesetQueryUrlException {
             if (query == null)
                 return new ChangesetQuery();
-            query = query.trim();
-            if (query.isEmpty())
+            String apiQuery = query.trim();
+            if (apiQuery.isEmpty())
                 return new ChangesetQuery();
-            Map<String, String> queryParams = createMapFromQueryString(query);
-            return createFromMap(queryParams);
+            return createFromMap(createMapFromQueryString(apiQuery));
         }
     }
 }
diff --git a/src/org/openstreetmap/josm/io/Compression.java b/src/org/openstreetmap/josm/io/Compression.java
index 63abf8c..d0d6277 100644
--- a/src/org/openstreetmap/josm/io/Compression.java
+++ b/src/org/openstreetmap/josm/io/Compression.java
@@ -95,9 +95,14 @@ public enum Compression {
      * @return un-compressing input stream
      * @throws IOException if any I/O error occurs
      */
-    @SuppressWarnings("resource")
     public static InputStream getUncompressedFileInputStream(File file) throws IOException {
-        return byExtension(file.getName()).getUncompressedInputStream(new FileInputStream(file));
+        FileInputStream in = new FileInputStream(file);
+        try {
+            return byExtension(file.getName()).getUncompressedInputStream(in);
+        } catch (IOException e) {
+            Utils.close(in);
+            throw e;
+        }
     }
 
     /**
@@ -128,8 +133,13 @@ public enum Compression {
      *
      * @throws IOException if any I/O error occurs
      */
-    @SuppressWarnings("resource")
     public static OutputStream getCompressedFileOutputStream(File file) throws IOException {
-        return byExtension(file.getName()).getCompressedOutputStream(new FileOutputStream(file));
+        FileOutputStream out = new FileOutputStream(file);
+        try {
+            return byExtension(file.getName()).getCompressedOutputStream(out);
+        } catch (IOException e) {
+            Utils.close(out);
+            throw e;
+        }
     }
 }
diff --git a/src/org/openstreetmap/josm/io/FileImporter.java b/src/org/openstreetmap/josm/io/FileImporter.java
index 44c7e52..4be7f44 100644
--- a/src/org/openstreetmap/josm/io/FileImporter.java
+++ b/src/org/openstreetmap/josm/io/FileImporter.java
@@ -98,7 +98,7 @@ public abstract class FileImporter implements Comparable<FileImporter>, LayerCha
                 displayError(f, e);
             }
             return false;
-        } catch (Exception e) {
+        } catch (IOException e) {
             displayError(f, e);
             return false;
         }
@@ -137,7 +137,7 @@ public abstract class FileImporter implements Comparable<FileImporter>, LayerCha
             Main.info("Open "+files.size()+" files");
             importData(files, progressMonitor);
             return true;
-        } catch (Exception e) {
+        } catch (IOException | IllegalDataException e) {
             Main.error(e);
             HelpAwareOptionPane.showMessageDialogInEDT(
                     Main.parent,
diff --git a/src/org/openstreetmap/josm/io/GeoJSONWriter.java b/src/org/openstreetmap/josm/io/GeoJSONWriter.java
index 3656f0a..2771b1e 100644
--- a/src/org/openstreetmap/josm/io/GeoJSONWriter.java
+++ b/src/org/openstreetmap/josm/io/GeoJSONWriter.java
@@ -113,6 +113,7 @@ public class GeoJSONWriter {
 
         @Override
         public void visit(IRelation r) {
+            // Do nothing
         }
     }
 
@@ -123,8 +124,7 @@ public class GeoJSONWriter {
     private static JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, EastNorth c) {
         return builder
                 .add(BigDecimal.valueOf(c.getX()).setScale(11, RoundingMode.HALF_UP))
-                .add(BigDecimal.valueOf(c.getY()).setScale(11, RoundingMode.HALF_UP))
-                ;
+                .add(BigDecimal.valueOf(c.getY()).setScale(11, RoundingMode.HALF_UP));
     }
 
     protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
diff --git a/src/org/openstreetmap/josm/io/GpxReader.java b/src/org/openstreetmap/josm/io/GpxReader.java
index dbbdefb..42cb724 100644
--- a/src/org/openstreetmap/josm/io/GpxReader.java
+++ b/src/org/openstreetmap/josm/io/GpxReader.java
@@ -44,17 +44,17 @@ import org.xml.sax.helpers.DefaultHandler;
 public class GpxReader implements GpxConstants {
 
     private enum State {
-        init,
-        gpx,
-        metadata,
-        wpt,
-        rte,
-        trk,
-        ext,
-        author,
-        link,
-        trkseg,
-        copyright
+        INIT,
+        GPX,
+        METADATA,
+        WPT,
+        RTE,
+        TRK,
+        EXT,
+        AUTHOR,
+        LINK,
+        TRKSEG,
+        COPYRIGHT
     }
 
     private String version;
@@ -71,7 +71,7 @@ public class GpxReader implements GpxConstants {
         private GpxRoute currentRoute;
         private WayPoint currentWayPoint;
 
-        private State currentState = State.init;
+        private State currentState = State.INIT;
 
         private GpxLink currentLink;
         private Extensions currentExtensions;
@@ -107,9 +107,9 @@ public class GpxReader implements GpxConstants {
         public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
             elements.push(localName);
             switch(currentState) {
-            case init:
+            case INIT:
                 states.push(currentState);
-                currentState = State.gpx;
+                currentState = State.GPX;
                 data.creator = atts.getValue("creator");
                 version = atts.getValue("version");
                 if (version != null && version.startsWith("1.0")) {
@@ -119,58 +119,60 @@ public class GpxReader implements GpxConstants {
                     version = "1.1";
                 }
                 break;
-            case gpx:
+            case GPX:
                 switch (localName) {
                 case "metadata":
                     states.push(currentState);
-                    currentState = State.metadata;
+                    currentState = State.METADATA;
                     break;
                 case "wpt":
                     states.push(currentState);
-                    currentState = State.wpt;
+                    currentState = State.WPT;
                     currentWayPoint = new WayPoint(parseLatLon(atts));
                     break;
                 case "rte":
                     states.push(currentState);
-                    currentState = State.rte;
+                    currentState = State.RTE;
                     currentRoute = new GpxRoute();
                     break;
                 case "trk":
                     states.push(currentState);
-                    currentState = State.trk;
+                    currentState = State.TRK;
                     currentTrack = new ArrayList<>();
                     currentTrackAttr = new HashMap<>();
                     break;
                 case "extensions":
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.EXT;
                     currentExtensions = new Extensions();
                     break;
                 case "gpx":
                     if (atts.getValue("creator") != null && atts.getValue("creator").startsWith("Nokia Sports Tracker")) {
                         nokiaSportsTrackerBug = true;
                     }
+                    break;
+                default: // Do nothing
                 }
                 break;
-            case metadata:
+            case METADATA:
                 switch (localName) {
                 case "author":
                     states.push(currentState);
-                    currentState = State.author;
+                    currentState = State.AUTHOR;
                     break;
                 case "extensions":
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.EXT;
                     currentExtensions = new Extensions();
                     break;
                 case "copyright":
                     states.push(currentState);
-                    currentState = State.copyright;
+                    currentState = State.COPYRIGHT;
                     data.put(META_COPYRIGHT_AUTHOR, atts.getValue("author"));
                     break;
                 case "link":
                     states.push(currentState);
-                    currentState = State.link;
+                    currentState = State.LINK;
                     currentLink = new GpxLink(atts.getValue("href"));
                     break;
                 case "bounds":
@@ -179,77 +181,86 @@ public class GpxReader implements GpxConstants {
                                 parseCoord(atts.getValue("minlon")),
                                 parseCoord(atts.getValue("maxlat")),
                                 parseCoord(atts.getValue("maxlon"))));
+                    break;
+                default: // Do nothing
                 }
                 break;
-            case author:
+            case AUTHOR:
                 switch (localName) {
                 case "link":
                     states.push(currentState);
-                    currentState = State.link;
+                    currentState = State.LINK;
                     currentLink = new GpxLink(atts.getValue("href"));
                     break;
                 case "email":
                     data.put(META_AUTHOR_EMAIL, atts.getValue("id") + '@' + atts.getValue("domain"));
+                    break;
+                default: // Do nothing
                 }
                 break;
-            case trk:
+            case TRK:
                 switch (localName) {
                 case "trkseg":
                     states.push(currentState);
-                    currentState = State.trkseg;
+                    currentState = State.TRKSEG;
                     currentTrackSeg = new ArrayList<>();
                     break;
                 case "link":
                     states.push(currentState);
-                    currentState = State.link;
+                    currentState = State.LINK;
                     currentLink = new GpxLink(atts.getValue("href"));
                     break;
                 case "extensions":
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.EXT;
                     currentExtensions = new Extensions();
+                    break;
+                default: // Do nothing
                 }
                 break;
-            case trkseg:
+            case TRKSEG:
                 if ("trkpt".equals(localName)) {
                     states.push(currentState);
-                    currentState = State.wpt;
+                    currentState = State.WPT;
                     currentWayPoint = new WayPoint(parseLatLon(atts));
                 }
                 break;
-            case wpt:
+            case WPT:
                 switch (localName) {
                 case "link":
                     states.push(currentState);
-                    currentState = State.link;
+                    currentState = State.LINK;
                     currentLink = new GpxLink(atts.getValue("href"));
                     break;
                 case "extensions":
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.EXT;
                     currentExtensions = new Extensions();
                     break;
+                default: // Do nothing
                 }
                 break;
-            case rte:
+            case RTE:
                 switch (localName) {
                 case "link":
                     states.push(currentState);
-                    currentState = State.link;
+                    currentState = State.LINK;
                     currentLink = new GpxLink(atts.getValue("href"));
                     break;
                 case "rtept":
                     states.push(currentState);
-                    currentState = State.wpt;
+                    currentState = State.WPT;
                     currentWayPoint = new WayPoint(parseLatLon(atts));
                     break;
                 case "extensions":
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.EXT;
                     currentExtensions = new Extensions();
                     break;
+                default: // Do nothing
                 }
                 break;
+            default: // Do nothing
             }
             accumulator.setLength(0);
         }
@@ -275,10 +286,10 @@ public class GpxReader implements GpxConstants {
 
         private Map<String, Object> getAttr() {
             switch (currentState) {
-            case rte: return currentRoute.attr;
-            case metadata: return data.attr;
-            case wpt: return currentWayPoint.attr;
-            case trk: return currentTrackAttr;
+            case RTE: return currentRoute.attr;
+            case METADATA: return data.attr;
+            case WPT: return currentWayPoint.attr;
+            case TRK: return currentTrackAttr;
             default: return null;
             }
         }
@@ -288,8 +299,8 @@ public class GpxReader implements GpxConstants {
         public void endElement(String namespaceURI, String localName, String qName) {
             elements.pop();
             switch (currentState) {
-            case gpx:       // GPX 1.0
-            case metadata:  // GPX 1.1
+            case GPX:       // GPX 1.0
+            case METADATA:  // GPX 1.1
                 switch (localName) {
                 case "name":
                     data.put(META_NAME, accumulator.toString());
@@ -320,8 +331,8 @@ public class GpxReader implements GpxConstants {
                     break;
                 case "metadata":
                 case "gpx":
-                    if ((currentState == State.metadata && "metadata".equals(localName)) ||
-                        (currentState == State.gpx && "gpx".equals(localName))) {
+                    if ((currentState == State.METADATA && "metadata".equals(localName)) ||
+                        (currentState == State.GPX && "gpx".equals(localName))) {
                         convertUrlToLink(data.attr);
                         if (currentExtensions != null && !currentExtensions.isEmpty()) {
                             data.put(META_EXTENSIONS, currentExtensions);
@@ -336,7 +347,7 @@ public class GpxReader implements GpxConstants {
                     //TODO: parse extensions
                 }
                 break;
-            case author:
+            case AUTHOR:
                 switch (localName) {
                 case "author":
                     currentState = states.pop();
@@ -350,9 +361,10 @@ public class GpxReader implements GpxConstants {
                 case "link":
                     data.put(META_AUTHOR_LINK, currentLink);
                     break;
+                default: // Do nothing
                 }
                 break;
-            case copyright:
+            case COPYRIGHT:
                 switch (localName) {
                 case "copyright":
                     currentState = states.pop();
@@ -363,9 +375,10 @@ public class GpxReader implements GpxConstants {
                 case "license":
                     data.put(META_COPYRIGHT_LICENSE, accumulator.toString());
                     break;
+                default: // Do nothing
                 }
                 break;
-            case link:
+            case LINK:
                 switch (localName) {
                 case "text":
                     currentLink.text = accumulator.toString();
@@ -379,10 +392,11 @@ public class GpxReader implements GpxConstants {
                     }
                     currentState = states.pop();
                     break;
+                default: // Do nothing
                 }
-                if (currentState == State.author) {
+                if (currentState == State.AUTHOR) {
                     data.put(META_AUTHOR_LINK, currentLink);
-                } else if (currentState != State.link) {
+                } else if (currentState != State.LINK) {
                     Map<String, Object> attr = getAttr();
                     if (!attr.containsKey(META_LINKS)) {
                         attr.put(META_LINKS, new LinkedList<GpxLink>());
@@ -390,7 +404,7 @@ public class GpxReader implements GpxConstants {
                     ((Collection<GpxLink>) attr.get(META_LINKS)).add(currentLink);
                 }
                 break;
-            case wpt:
+            case WPT:
                 switch (localName) {
                 case "ele":
                 case "magvar":
@@ -408,7 +422,7 @@ public class GpxReader implements GpxConstants {
                 case "pdop":
                     try {
                         currentWayPoint.put(localName, Float.valueOf(accumulator.toString()));
-                    } catch (Exception e) {
+                    } catch (NumberFormatException e) {
                         currentWayPoint.put(localName, 0f);
                     }
                     break;
@@ -436,15 +450,16 @@ public class GpxReader implements GpxConstants {
                     }
                     data.waypoints.add(currentWayPoint);
                     break;
+                default: // Do nothing
                 }
                 break;
-            case trkseg:
+            case TRKSEG:
                 if ("trkseg".equals(localName)) {
                     currentState = states.pop();
                     currentTrack.add(currentTrackSeg);
                 }
                 break;
-            case trk:
+            case TRK:
                 switch (localName) {
                 case "trk":
                     currentState = states.pop();
@@ -461,9 +476,10 @@ public class GpxReader implements GpxConstants {
                 case "urlname":
                     currentTrackAttr.put(localName, accumulator.toString());
                     break;
+                default: // Do nothing
                 }
                 break;
-            case ext:
+            case EXT:
                 if ("extensions".equals(localName)) {
                     currentState = states.pop();
                 } else if (JOSM_EXTENSIONS_NAMESPACE_URI.equals(namespaceURI)) {
@@ -481,6 +497,7 @@ public class GpxReader implements GpxConstants {
                     convertUrlToLink(currentRoute.attr);
                     data.routes.add(currentRoute);
                     break;
+                default: // Do nothing
                 }
             }
         }
@@ -515,7 +532,7 @@ public class GpxReader implements GpxConstants {
             }
         }
 
-        public void tryToFinish() throws SAXException {
+        void tryToFinish() throws SAXException {
             List<String> remainingElements = new ArrayList<>(elements);
             for (int i = remainingElements.size() - 1; i >= 0; i--) {
                 endElement(null, remainingElements.get(i), remainingElements.get(i));
diff --git a/src/org/openstreetmap/josm/io/MessageNotifier.java b/src/org/openstreetmap/josm/io/MessageNotifier.java
index 33907a3..1c39a0c 100644
--- a/src/org/openstreetmap/josm/io/MessageNotifier.java
+++ b/src/org/openstreetmap/josm/io/MessageNotifier.java
@@ -95,7 +95,7 @@ public final class MessageNotifier {
         if (Main.isOffline(OnlineResource.OSM_API)) {
             Main.info(tr("{0} not available (offline mode)", tr("Message notifier")));
         } else if (!isRunning() && interval > 0 && isUserEnoughIdentified()) {
-            task = EXECUTOR.scheduleAtFixedRate(WORKER, 0, interval * 60, TimeUnit.SECONDS);
+            task = EXECUTOR.scheduleAtFixedRate(WORKER, 0, interval * 60L, TimeUnit.SECONDS);
             Main.info("Message notifier active (checks every "+interval+" minute"+(interval > 1 ? "s" : "")+')');
         }
     }
diff --git a/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
index af4477c..4acd51e 100644
--- a/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
+++ b/src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
@@ -1,12 +1,12 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io;
 
+import java.util.Set;
+
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.gui.preferences.server.OverpassServerPreference;
 import org.openstreetmap.josm.tools.Utils;
 
-import java.util.Set;
-
 /**
  * Retrieves a set of {@link org.openstreetmap.josm.data.osm.OsmPrimitive}s from an Overpass API server.
  *
@@ -19,10 +19,10 @@ class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader {
         final Utils.Function<Long, Object> toOverpassExpression = new Utils.Function<Long, Object>() {
             @Override
             public Object apply(Long x) {
-                return type.getAPIName() + "(" + x + ");>;";
+                return type.getAPIName() + '(' + x + ");>;";
             }
         };
-        final String query = "(" + Utils.join("", Utils.transform(idPackage, toOverpassExpression)) + ");out meta;";
+        final String query = '(' + Utils.join("", Utils.transform(idPackage, toOverpassExpression)) + ");out meta;";
         return "interpreter?data=" + Utils.encodeUrl(query);
     }
 
diff --git a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
index 2b930a1..1b373e3 100644
--- a/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
+++ b/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
@@ -124,6 +124,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
         case NODE: nodes.add(id.getUniqueId()); break;
         case WAY: ways.add(id.getUniqueId()); break;
         case RELATION: relations.add(id.getUniqueId()); break;
+        default: throw new AssertionError();
         }
     }
 
@@ -309,12 +310,13 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
      * @throws OsmTransferException if an error occurs while communicating with the API server
      */
     protected void fetchPrimitives(Set<Long> ids, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
-        String msg = "";
+        String msg;
         final String baseUrl = getBaseUrl();
         switch (type) {
             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;
+            default: throw new AssertionError();
         }
         progressMonitor.setTicksCount(ids.size());
         progressMonitor.setTicks(0);
@@ -521,7 +523,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
                 progressMonitor.subTask(tr("Downloading OSM data..."));
                 try {
                     result = new FetchResult(OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(pkg.size(), false)), null);
-                } catch (Exception e) {
+                } catch (IllegalDataException e) {
                     throw new OsmTransferException(e);
                 }
             } catch (IOException ex) {
@@ -549,7 +551,7 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
                 progressMonitor.subTask(tr("Downloading OSM data..."));
                 try {
                     result = OsmReader.parseDataSet(in, progressMonitor.createSubTaskMonitor(1, false));
-                } catch (Exception e) {
+                } catch (IllegalDataException e) {
                     throw new OsmTransferException(e);
                 }
             } catch (IOException ex) {
@@ -579,11 +581,12 @@ public class MultiFetchServerObjectReader extends OsmServerReader {
             String baseUrl = OsmApi.getOsmApi().getBaseUrl();
             for (long id : pkg) {
                 try {
-                    String msg = "";
+                    String msg;
                     switch (type) {
                         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;
+                        default: throw new AssertionError();
                     }
                     progressMonitor.setCustomText(msg);
                     result.dataSet.mergeFrom(singleGetId(type, id, progressMonitor));
diff --git a/src/org/openstreetmap/josm/io/NoteReader.java b/src/org/openstreetmap/josm/io/NoteReader.java
index 5d56968..b6c5c42 100644
--- a/src/org/openstreetmap/josm/io/NoteReader.java
+++ b/src/org/openstreetmap/josm/io/NoteReader.java
@@ -125,6 +125,7 @@ public class NoteReader {
                     commentIsNew = Boolean.parseBoolean(isNew);
                 }
                 break;
+            default: // Do nothing
             }
         }
 
diff --git a/src/org/openstreetmap/josm/io/OsmApi.java b/src/org/openstreetmap/josm/io/OsmApi.java
index 9119c18..d661461 100644
--- a/src/org/openstreetmap/josm/io/OsmApi.java
+++ b/src/org/openstreetmap/josm/io/OsmApi.java
@@ -262,7 +262,7 @@ public class OsmApi extends OsmConnection {
             initialized = false;
             Main.addNetworkError(url, Utils.getRootCause(e));
             throw new OsmApiInitializationException(e);
-        } catch (Exception e) {
+        } catch (SAXException | IOException | ParserConfigurationException e) {
             initialized = false;
             throw new OsmApiInitializationException(e);
         }
diff --git a/src/org/openstreetmap/josm/io/OsmApiException.java b/src/org/openstreetmap/josm/io/OsmApiException.java
index efae93c..16eed4b 100644
--- a/src/org/openstreetmap/josm/io/OsmApiException.java
+++ b/src/org/openstreetmap/josm/io/OsmApiException.java
@@ -143,7 +143,7 @@ public class OsmApiException extends OsmTransferException {
                 .append(eh)
                 .append('>');
             }
-        } catch (Exception e) {
+        } catch (IllegalArgumentException e) {
             // Ignored
             if (Main.isTraceEnabled()) {
                 Main.trace(e.getMessage());
@@ -156,7 +156,7 @@ public class OsmApiException extends OsmTransferException {
                 .append(eb)
                 .append('>');
             }
-        } catch (Exception e) {
+        } catch (IllegalArgumentException e) {
             // Ignored
             if (Main.isTraceEnabled()) {
                 Main.trace(e.getMessage());
diff --git a/src/org/openstreetmap/josm/io/OsmApiPrimitiveGoneException.java b/src/org/openstreetmap/josm/io/OsmApiPrimitiveGoneException.java
index bec6e21..91695d7 100644
--- a/src/org/openstreetmap/josm/io/OsmApiPrimitiveGoneException.java
+++ b/src/org/openstreetmap/josm/io/OsmApiPrimitiveGoneException.java
@@ -10,7 +10,7 @@ import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 /**
  * Represents an exception thrown by the OSM API if JOSM tries to update or delete a primitive
  * which is already deleted on the server.
- *
+ * @since 2198
  */
 public class OsmApiPrimitiveGoneException extends OsmApiException {
     /**
@@ -18,18 +18,29 @@ public class OsmApiPrimitiveGoneException extends OsmApiException {
      */
     public static final String ERROR_HEADER_PATTERN = "The (\\S+) with the id (\\d+) has already been deleted";
     /** the type of the primitive which is gone on the server */
-    private OsmPrimitiveType type;
+    private final OsmPrimitiveType type;
     /** the id of the primitive */
-    private long id;
+    private final long id;
 
+    /**
+     * Constructs a new {@code OsmApiPrimitiveGoneException}.
+     * @param errorHeader error header
+     * @param errorBody error body
+     */
     public OsmApiPrimitiveGoneException(String errorHeader, String errorBody) {
         super(HttpURLConnection.HTTP_GONE, errorHeader, errorBody);
-        if (errorHeader == null) return;
-        Pattern p = Pattern.compile(ERROR_HEADER_PATTERN);
-        Matcher m = p.matcher(errorHeader);
-        if (m.matches()) {
-            type = OsmPrimitiveType.from(m.group(1));
-            id = Long.parseLong(m.group(2));
+        if (errorHeader != null) {
+            Matcher m = Pattern.compile(ERROR_HEADER_PATTERN).matcher(errorHeader);
+            if (m.matches()) {
+                type = OsmPrimitiveType.from(m.group(1));
+                id = Long.parseLong(m.group(2));
+            } else {
+                type = null;
+                id = 0;
+            }
+        } else {
+            type = null;
+            id = 0;
         }
     }
 
diff --git a/src/org/openstreetmap/josm/io/OsmChangeBuilder.java b/src/org/openstreetmap/josm/io/OsmChangeBuilder.java
index 8eb2cb0..082fc7c 100644
--- a/src/org/openstreetmap/josm/io/OsmChangeBuilder.java
+++ b/src/org/openstreetmap/josm/io/OsmChangeBuilder.java
@@ -12,27 +12,37 @@ import org.openstreetmap.josm.data.osm.IPrimitive;
 
 /**
  * Creates an OsmChange document from JOSM edits.
- * See http://wiki.openstreetmap.org/index.php/OsmChange for a documentation of the
- * OsmChange format.
- *
+ * See http://wiki.openstreetmap.org/index.php/OsmChange for a documentation of the OsmChange format.
+ * @since 1071
  */
 public class OsmChangeBuilder {
+    /** Default OSM API version */
     public static final String DEFAULT_API_VERSION = "0.6";
 
     private String currentMode;
-    private PrintWriter writer;
-    private StringWriter swriter;
-    private OsmWriter osmwriter;
+    private final PrintWriter writer;
+    private final StringWriter swriter;
+    private final OsmWriter osmwriter;
     private String apiVersion = DEFAULT_API_VERSION;
     private boolean prologWritten;
 
+    /**
+     * Constructs a new {@code OsmChangeBuilder}.
+     * @param changeset changeset
+     */
     public OsmChangeBuilder(Changeset changeset) {
         this(changeset, null /* default api version */);
     }
 
+    /**
+     * Constructs a new {@code OsmChangeBuilder}.
+     * @param changeset changeset
+     * @param apiVersion OSM API version
+     */
     public OsmChangeBuilder(Changeset changeset, String apiVersion) {
         this.apiVersion = apiVersion == null ? DEFAULT_API_VERSION : apiVersion;
-        writer = new PrintWriter(swriter = new StringWriter());
+        swriter = new StringWriter();
+        writer = new PrintWriter(swriter);
         osmwriter = OsmWriterFactory.createOsmWriter(writer, false, apiVersion);
         osmwriter.setChangeset(changeset);
         osmwriter.setIsOsmChange(true);
@@ -89,14 +99,19 @@ public class OsmChangeBuilder {
      * @see #append(IPrimitive)
      */
     public void append(Collection<? extends IPrimitive> primitives) {
-        if (primitives == null) return;
-        if (!prologWritten)
-            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write first."));
+        if (primitives == null)
+            return;
+        checkProlog();
         for (IPrimitive p : primitives) {
             write(p);
         }
     }
 
+    private void checkProlog() {
+        if (!prologWritten)
+            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write first."));
+    }
+
     /**
      * Appends an Primitive to the OsmChange document.
      *
@@ -106,9 +121,9 @@ public class OsmChangeBuilder {
      * @see #append(Collection)
      */
     public void append(IPrimitive p) {
-        if (p == null) return;
-        if (!prologWritten)
-            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write first."));
+        if (p == null)
+            return;
+        checkProlog();
         write(p);
     }
 
@@ -118,8 +133,7 @@ public class OsmChangeBuilder {
      * @throws IllegalStateException if the prologs has not been written yet
      */
     public void finish() {
-        if (!prologWritten)
-            throw new IllegalStateException(tr("Prolog of OsmChange document not written yet. Please write first."));
+        checkProlog();
         if (currentMode != null) {
             writer.print("</");
             writer.print(currentMode);
@@ -128,6 +142,10 @@ public class OsmChangeBuilder {
         writer.println("</osmChange>");
     }
 
+    /**
+     * Returns XML document.
+     * @return XML document
+     */
     public String getDocument() {
         return swriter.toString();
     }
diff --git a/src/org/openstreetmap/josm/io/OsmChangesetParser.java b/src/org/openstreetmap/josm/io/OsmChangesetParser.java
index 6ea669b..4ead551 100644
--- a/src/org/openstreetmap/josm/io/OsmChangesetParser.java
+++ b/src/org/openstreetmap/josm/io/OsmChangesetParser.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
@@ -282,7 +283,7 @@ public final class OsmChangesetParser {
             return parser.getChangesets();
         } catch (ParserConfigurationException | SAXException e) {
             throw new IllegalDataException(e.getMessage(), e);
-        } catch (Exception e) {
+        } catch (IOException e) {
             throw new IllegalDataException(e);
         } finally {
             progressMonitor.finishTask();
diff --git a/src/org/openstreetmap/josm/io/OsmConnection.java b/src/org/openstreetmap/josm/io/OsmConnection.java
index 6aee21f..daa38f4 100644
--- a/src/org/openstreetmap/josm/io/OsmConnection.java
+++ b/src/org/openstreetmap/josm/io/OsmConnection.java
@@ -16,6 +16,8 @@ import java.util.Objects;
 import java.util.concurrent.Callable;
 import java.util.concurrent.FutureTask;
 
+import javax.swing.SwingUtilities;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.oauth.OAuthParameters;
 import org.openstreetmap.josm.gui.oauth.OAuthAuthorizationWizard;
@@ -25,12 +27,10 @@ import org.openstreetmap.josm.io.auth.CredentialsAgentResponse;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
 import org.openstreetmap.josm.tools.Base64;
 import org.openstreetmap.josm.tools.HttpClient;
+import org.openstreetmap.josm.tools.Utils;
 
 import oauth.signpost.OAuthConsumer;
 import oauth.signpost.exception.OAuthException;
-import org.openstreetmap.josm.tools.Utils;
-
-import javax.swing.SwingUtilities;
 
 /**
  * Base class that handles common things like authentication for the reader and writer
@@ -150,7 +150,7 @@ public class OsmConnection {
                 SwingUtilities.invokeAndWait(authTask);
             }
         } catch (MalformedURLException | InterruptedException | InvocationTargetException e) {
-            throw new MissingOAuthAccessTokenException();
+            throw new MissingOAuthAccessTokenException(e);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/io/OsmReader.java b/src/org/openstreetmap/josm/io/OsmReader.java
index c360b35..dae3d96 100644
--- a/src/org/openstreetmap/josm/io/OsmReader.java
+++ b/src/org/openstreetmap/josm/io/OsmReader.java
@@ -3,12 +3,14 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -92,11 +94,11 @@ public class OsmReader extends AbstractReader {
     }
 
     protected void throwException(String msg, Throwable th) throws XMLStreamException {
-        throw new OsmParsingException(msg, parser.getLocation(), th);
+        throw new XmlStreamParsingException(msg, parser.getLocation(), th);
     }
 
     protected void throwException(String msg) throws XMLStreamException {
-        throw new OsmParsingException(msg, parser.getLocation());
+        throw new XmlStreamParsingException(msg, parser.getLocation());
     }
 
     protected void parse() throws XMLStreamException {
@@ -353,7 +355,7 @@ public class OsmReader extends AbstractReader {
             id = getLong("id");
         }
         // Read changeset info if neither upload-changeset nor id are set, or if they are both set to the same value
-        if (id == uploadChangesetId || (id != null && id.equals(uploadChangesetId))) {
+        if (Objects.equals(id, uploadChangesetId)) {
             uploadChangeset = new Changeset(id != null ? id.intValue() : 0);
             while (true) {
                 int event = parser.next();
@@ -557,39 +559,10 @@ public class OsmReader extends AbstractReader {
         return 0; // should not happen
     }
 
-    private static class OsmParsingException extends XMLStreamException {
-
-        OsmParsingException(String msg, Location location) {
-            super(msg); /* cannot use super(msg, location) because it messes with the message preventing localization */
-            this.location = location;
-        }
-
-        OsmParsingException(String msg, Location location, Throwable th) {
-            super(msg, th);
-            this.location = location;
-        }
-
-        @Override
-        public String getMessage() {
-            String msg = super.getMessage();
-            if (msg == null) {
-                msg = getClass().getName();
-            }
-            if (getLocation() == null)
-                return msg;
-            msg += ' ' + tr("(at line {0}, column {1})", getLocation().getLineNumber(), getLocation().getColumnNumber());
-            int offset = getLocation().getCharacterOffset();
-            if (offset > -1) {
-                msg += ". "+ tr("{0} bytes have been read", offset);
-            }
-            return msg;
-        }
-    }
-
     /**
      * Exception thrown after user cancelation.
      */
-    private static final class OsmParsingCanceledException extends OsmParsingException implements ImportCancelException {
+    private static final class OsmParsingCanceledException extends XmlStreamParsingException implements ImportCancelException {
         /**
          * Constructs a new {@code OsmParsingCanceledException}.
          * @param msg The error message
@@ -636,7 +609,7 @@ public class OsmReader extends AbstractReader {
             return getDataSet();
         } catch (IllegalDataException e) {
             throw e;
-        } catch (OsmParsingException e) {
+        } catch (XmlStreamParsingException e) {
             throw new IllegalDataException(e.getMessage(), e);
         } catch (XMLStreamException e) {
             String msg = e.getMessage();
@@ -650,7 +623,7 @@ public class OsmReader extends AbstractReader {
                         e.getLocation().getLineNumber(), e.getLocation().getColumnNumber()) + msg, e);
             else
                 throw new IllegalDataException(msg, e);
-        } catch (Exception e) {
+        } catch (IOException e) {
             throw new IllegalDataException(e);
         } finally {
             progressMonitor.finishTask();
diff --git a/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java b/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
index 7b91216..78168f1 100644
--- a/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -134,7 +135,7 @@ public class OsmServerBackreferenceReader extends OsmServerReader {
             }
         } catch (OsmTransferException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (IOException | IllegalDataException e) {
             if (cancel)
                 return null;
             throw new OsmTransferException(e);
diff --git a/src/org/openstreetmap/josm/io/OsmServerChangesetReader.java b/src/org/openstreetmap/josm/io/OsmServerChangesetReader.java
index c9ca53c..33ce484 100644
--- a/src/org/openstreetmap/josm/io/OsmServerChangesetReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerChangesetReader.java
@@ -44,8 +44,7 @@ public class OsmServerChangesetReader extends OsmServerReader {
 
     protected final InputStream getChangesetInputStream(long id, boolean includeDiscussion, ProgressMonitor monitor)
             throws OsmTransferException {
-        StringBuilder sb = new StringBuilder();
-        sb.append("changeset/").append(id);
+        StringBuilder sb = new StringBuilder(48).append("changeset/").append(id);
         if (includeDiscussion) {
             sb.append("?include_discussion=true");
         }
@@ -200,8 +199,7 @@ public class OsmServerChangesetReader extends OsmServerReader {
         ChangesetDataSet result = null;
         try {
             monitor.beginTask(tr("Downloading changeset content"));
-            StringBuilder sb = new StringBuilder();
-            sb.append("changeset/").append(id).append("/download");
+            StringBuilder sb = new StringBuilder(32).append("changeset/").append(id).append("/download");
             try (InputStream in = getInputStream(sb.toString(), monitor.createSubTaskMonitor(1, true))) {
                 if (in == null)
                     return null;
diff --git a/src/org/openstreetmap/josm/io/OsmServerHistoryReader.java b/src/org/openstreetmap/josm/io/OsmServerHistoryReader.java
index a29c94f..537e310 100644
--- a/src/org/openstreetmap/josm/io/OsmServerHistoryReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerHistoryReader.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.text.MessageFormat;
 
@@ -11,6 +12,7 @@ import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.xml.sax.SAXException;
 
 /**
  * Reads the history of an {@link org.openstreetmap.josm.data.osm.OsmPrimitive} from the OSM API server.
@@ -71,7 +73,7 @@ public class OsmServerHistoryReader extends OsmServerReader {
             }
         } catch (OsmTransferException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (IOException | SAXException e) {
             if (cancel)
                 return null;
             throw new OsmTransferException(e);
diff --git a/src/org/openstreetmap/josm/io/OsmServerLocationReader.java b/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
index 7504b62..ddcac1b 100644
--- a/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerLocationReader.java
@@ -51,7 +51,7 @@ public class OsmServerLocationReader extends OsmServerReader {
             return parser.parse();
         } catch (OsmTransferException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (IOException | SAXException | IllegalDataException e) {
             if (cancel)
                 return null;
             throw new OsmTransferException(e);
diff --git a/src/org/openstreetmap/josm/io/OsmServerObjectReader.java b/src/org/openstreetmap/josm/io/OsmServerObjectReader.java
index c0fbb44..bad26f6 100644
--- a/src/org/openstreetmap/josm/io/OsmServerObjectReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerObjectReader.java
@@ -3,6 +3,7 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.text.MessageFormat;
 
@@ -133,7 +134,7 @@ public class OsmServerObjectReader extends OsmServerReader {
         } catch (OsmTransferException e) {
             if (cancel) return null;
             throw e;
-        } catch (Exception e) {
+        } catch (IOException | IllegalDataException e) {
             if (cancel) return null;
             throw new OsmTransferException(e);
         } finally {
diff --git a/src/org/openstreetmap/josm/io/OsmServerReader.java b/src/org/openstreetmap/josm/io/OsmServerReader.java
index b19ba24..e0fb7df 100644
--- a/src/org/openstreetmap/josm/io/OsmServerReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerReader.java
@@ -143,7 +143,7 @@ public abstract class OsmServerReader extends OsmConnection {
             final HttpClient.Response response;
             try {
                 response = client.connect(progressMonitor);
-            } catch (Exception e) {
+            } catch (IOException e) {
                 Main.error(e);
                 OsmTransferException ote = new OsmTransferException(
                         tr("Could not connect to the OSM server. Please check your internet connection."), e);
@@ -162,7 +162,7 @@ public abstract class OsmServerReader extends OsmConnection {
                     String errorBody;
                     try {
                         errorBody = response.fetchContent();
-                    } catch (Exception e) {
+                    } catch (IOException e) {
                         errorBody = tr("Reading error text failed.");
                     }
                     throw new OsmApiException(response.getResponseCode(), errorHeader, errorBody, url.toString());
@@ -172,7 +172,7 @@ public abstract class OsmServerReader extends OsmConnection {
                 return response.getContent();
             } catch (OsmTransferException e) {
                 throw e;
-            } catch (Exception e) {
+            } catch (IOException e) {
                 throw new OsmTransferException(e);
             }
         } finally {
diff --git a/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java b/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
index a38e898..50aa2c9 100644
--- a/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
+++ b/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
@@ -3,11 +3,13 @@ package org.openstreetmap.josm.io;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.io.IOException;
 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;
 import javax.xml.xpath.XPathException;
@@ -22,6 +24,7 @@ import org.openstreetmap.josm.tools.date.DateUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
 
 public class OsmServerUserInfoReader extends OsmServerReader {
 
@@ -177,7 +180,7 @@ public class OsmServerUserInfoReader extends OsmServerReader {
             }
         } catch (OsmTransferException e) {
             throw e;
-        } catch (Exception e) {
+        } catch (IOException | ParserConfigurationException | SAXException e) {
             throw new OsmTransferException(e);
         } finally {
             monitor.finishTask();
diff --git a/src/org/openstreetmap/josm/io/OsmServerWriter.java b/src/org/openstreetmap/josm/io/OsmServerWriter.java
index e19a6ee..fec25f0 100644
--- a/src/org/openstreetmap/josm/io/OsmServerWriter.java
+++ b/src/org/openstreetmap/josm/io/OsmServerWriter.java
@@ -38,6 +38,11 @@ public class OsmServerWriter {
     private Collection<OsmPrimitive> processed;
 
     private static volatile List<OsmServerWritePostprocessor> postprocessors;
+
+    /**
+     * Registers a post-processor.
+     * @param pp post-processor to register
+     */
     public static void registerPostprocessor(OsmServerWritePostprocessor pp) {
         if (postprocessors == null) {
             postprocessors = new ArrayList<>();
@@ -45,6 +50,10 @@ public class OsmServerWriter {
         postprocessors.add(pp);
     }
 
+    /**
+     * Unregisters a post-processor.
+     * @param pp post-processor to unregister
+     */
     public static void unregisterPostprocessor(OsmServerWritePostprocessor pp) {
         if (postprocessors != null) {
             postprocessors.remove(pp);
@@ -60,14 +69,14 @@ public class OsmServerWriter {
 
     private long uploadStartTime;
 
-    public String timeLeft(int progress, int listSize) {
+    protected String timeLeft(int progress, int listSize) {
         long now = System.currentTimeMillis();
         long elapsed = now - uploadStartTime;
         if (elapsed == 0) {
             elapsed = 1;
         }
         double uploadsPerMs = (double) progress / elapsed;
-        double uploadsLeft = listSize - progress;
+        double uploadsLeft = (double) listSize - progress;
         long msLeft = (long) (uploadsLeft / uploadsPerMs);
         long minutesLeft = msLeft / MSECS_PER_MINUTE;
         long secondsLeft = (msLeft / MSECS_PER_SECOND) % SECONDS_PER_MINUTE;
@@ -92,22 +101,21 @@ public class OsmServerWriter {
             progressMonitor.setTicksCount(primitives.size());
             uploadStartTime = System.currentTimeMillis();
             for (OsmPrimitive osm : primitives) {
-                int progress = progressMonitor.getTicks();
-                String timeLeftStr = timeLeft(progress, primitives.size());
-                String msg = "";
+                String msg;
                 switch(OsmPrimitiveType.from(osm)) {
                 case NODE: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading node ''{4}'' (id: {5})"); break;
                 case WAY: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading way ''{4}'' (id: {5})"); break;
                 case RELATION: msg = marktr("{0}% ({1}/{2}), {3} left. Uploading relation ''{4}'' (id: {5})"); break;
+                default: throw new AssertionError();
                 }
+                int progress = progressMonitor.getTicks();
                 progressMonitor.subTask(
                         tr(msg,
                                 Math.round(100.0*progress/primitives.size()),
                                 progress,
                                 primitives.size(),
-                                timeLeftStr,
-                                osm.getName() == null ? osm.getId() : osm.getName(),
-                                        osm.getId()));
+                                timeLeft(progress, primitives.size()),
+                                osm.getName() == null ? osm.getId() : osm.getName(), osm.getId()));
                 makeApiRequest(osm, progressMonitor);
                 processed.add(osm);
                 progressMonitor.worked(1);
@@ -133,8 +141,6 @@ public class OsmServerWriter {
         try {
             progressMonitor.beginTask(tr("Starting to upload in one request ..."));
             processed.addAll(api.uploadDiff(primitives, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
-        } catch (OsmTransferException e) {
-            throw e;
         } finally {
             progressMonitor.finishTask();
         }
@@ -150,7 +156,7 @@ public class OsmServerWriter {
      * @throws OsmTransferException if an exception occurs
      */
     protected void uploadChangesInChunks(Collection<? extends OsmPrimitive> primitives, ProgressMonitor progressMonitor, int chunkSize)
-            throws OsmTransferException, IllegalArgumentException {
+            throws OsmTransferException {
         if (chunkSize <= 0)
             throw new IllegalArgumentException(tr("Value >0 expected for parameter ''{0}'', got {1}", "chunkSize", chunkSize));
         try {
@@ -175,8 +181,6 @@ public class OsmServerWriter {
                                 chunk.size(), i, numChunks, chunk.size()));
                 processed.addAll(api.uploadDiff(chunk, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)));
             }
-        } catch (OsmTransferException e) {
-            throw e;
         } finally {
             progressMonitor.finishTask();
         }
@@ -218,11 +222,10 @@ public class OsmServerWriter {
                 uploadChangesIndividually(primitives, monitor.createSubTaskMonitor(0, false));
                 break;
             case CHUNKED_DATASET_STRATEGY:
+            default:
                 uploadChangesInChunks(primitives, monitor.createSubTaskMonitor(0, false), strategy.getChunkSize());
                 break;
             }
-        } catch (OsmTransferException e) {
-            throw e;
         } finally {
             executePostprocessors(monitor);
             monitor.finishTask();
@@ -240,6 +243,9 @@ public class OsmServerWriter {
         }
     }
 
+    /**
+     * Cancel operation.
+     */
     public void cancel() {
         this.canceled = true;
         if (api != null) {
diff --git a/src/org/openstreetmap/josm/io/UTFInputStreamReader.java b/src/org/openstreetmap/josm/io/UTFInputStreamReader.java
index ac6f07f..8ababbe 100644
--- a/src/org/openstreetmap/josm/io/UTFInputStreamReader.java
+++ b/src/org/openstreetmap/josm/io/UTFInputStreamReader.java
@@ -8,10 +8,15 @@ import java.io.PushbackInputStream;
 import java.io.UnsupportedEncodingException;
 
 /**
- * Detects the different UTF encodings from byte order mark
+ * Detects the different UTF encodings from byte order mark.
+ * @since 3372
  */
 public final class UTFInputStreamReader extends InputStreamReader {
 
+    private UTFInputStreamReader(InputStream in, String cs) throws UnsupportedEncodingException {
+        super(in, cs);
+    }
+
     /**
      * Creates a new {@link InputStreamReader} from the {@link InputStream} with UTF-8 as default encoding.
      * @param input input stream
@@ -63,17 +68,8 @@ public final class UTFInputStreamReader extends InputStreamReader {
         }
 
         if (encoding == null) {
-            return new UTFInputStreamReader(pushbackStream);
-        } else {
-            return new UTFInputStreamReader(pushbackStream, encoding);
+            encoding = "UTF-8";
         }
-    }
-
-    private UTFInputStreamReader(InputStream in) {
-        super(in);
-    }
-
-    private UTFInputStreamReader(InputStream in, String cs) throws UnsupportedEncodingException {
-        super(in, cs);
+        return new UTFInputStreamReader(pushbackStream, encoding);
     }
 }
diff --git a/src/org/openstreetmap/josm/io/XmlStreamParsingException.java b/src/org/openstreetmap/josm/io/XmlStreamParsingException.java
new file mode 100644
index 0000000..db61439
--- /dev/null
+++ b/src/org/openstreetmap/josm/io/XmlStreamParsingException.java
@@ -0,0 +1,52 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import javax.xml.stream.Location;
+import javax.xml.stream.XMLStreamException;
+
+/**
+ * Exception for unexpected processing errors during XML stream parsing.
+ * It uses proper JOSM i18n system to translate error message, including file location.
+ * @since 10235
+ */
+public class XmlStreamParsingException extends XMLStreamException {
+
+    /**
+     * Constructs a new {@code XmlStreamParsingException}.
+     * @param msg error message
+     * @param location file location
+     */
+    public XmlStreamParsingException(String msg, Location location) {
+        super(msg); /* cannot use super(msg, location) because it messes with the message preventing localization */
+        this.location = location;
+    }
+
+    /**
+     * Constructs a new {@code XmlStreamParsingException}.
+     * @param msg error message
+     * @param location file location
+     * @param th Throwable cause
+     */
+    public XmlStreamParsingException(String msg, Location location, Throwable th) {
+        super(msg, th);
+        this.location = location;
+    }
+
+    @Override
+    public String getMessage() {
+        String msg = super.getMessage();
+        if (msg == null) {
+            msg = getClass().getName();
+        }
+        if (getLocation() == null)
+            return msg;
+        msg += ' ' + tr("(at line {0}, column {1})", getLocation().getLineNumber(), getLocation().getColumnNumber());
+        int offset = getLocation().getCharacterOffset();
+        if (offset > -1) {
+            msg += ". "+ tr("{0} bytes have been read", offset);
+        }
+        return msg;
+    }
+}
diff --git a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
index 09b86a7..adff962 100644
--- a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
+++ b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
@@ -53,10 +53,27 @@ public class ImageryReader implements Closeable {
         UNKNOWN,            // element is not recognized in the current context
     }
 
+    /**
+     * Constructs a {@code ImageryReader} from a given filename, URL or internal resource.
+     *
+     * @param source can be:<ul>
+     *  <li>relative or absolute file name</li>
+     *  <li>{@code file:///SOME/FILE} the same as above</li>
+     *  <li>{@code http://...} a URL. It will be cached on disk.</li>
+     *  <li>{@code resource://SOME/FILE} file from the classpath (usually in the current *.jar)</li>
+     *  <li>{@code josmdir://SOME/FILE} file inside josm user data directory (since r7058)</li>
+     *  <li>{@code josmplugindir://SOME/FILE} file inside josm plugin directory (since r7834)</li></ul>
+     */
     public ImageryReader(String source) {
         this.source = source;
     }
 
+    /**
+     * Parses imagery source.
+     * @return list of imagery info
+     * @throws SAXException if any SAX error occurs
+     * @throws IOException if any I/O error occurs
+     */
     public List<ImageryInfo> parse() throws SAXException, IOException {
         Parser parser = new Parser();
         try {
@@ -227,6 +244,7 @@ public class ImageryReader implements Closeable {
                     newState = State.CODE;
                 }
                 break;
+            default: // Do nothing
             }
             /**
              * Did not recognize the element, so the new state is UNKNOWN.
@@ -326,6 +344,7 @@ public class ImageryReader implements Closeable {
                             entry.setTileSize(tileSize.intValue());
                         }
                         break;
+                    default: // Do nothing
                     }
                 }
                 break;
@@ -432,6 +451,7 @@ public class ImageryReader implements Closeable {
                 case "epsg4326to3857Supported":
                     entry.setEpsg4326To3857Supported(Boolean.valueOf(accumulator.toString()));
                     break;
+                default: // Do nothing
                 }
                 break;
             case BOUNDS:
@@ -453,13 +473,12 @@ public class ImageryReader implements Closeable {
                 mirrorEntry.setServerProjections(projections);
                 projections = null;
                 break;
-            /* nothing to do for these or the unknown type:
             case NO_TILE:
             case NO_TILESUM:
             case METADATA:
             case UNKNOWN:
-                break;
-            */
+            default:
+                // nothing to do for these or the unknown type
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/io/imagery/WMSImagery.java b/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
index 5470141..7ecd654 100644
--- a/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
+++ b/src/org/openstreetmap/josm/io/imagery/WMSImagery.java
@@ -18,6 +18,7 @@ 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;
 import org.openstreetmap.josm.data.Bounds;
@@ -53,14 +54,26 @@ public class WMSImagery {
     private URL serviceUrl;
     private List<String> formats;
 
+    /**
+     * Returns the list of layers.
+     * @return the list of layers
+     */
     public List<LayerDetails> getLayers() {
         return layers;
     }
 
+    /**
+     * Returns the service URL.
+     * @return the service URL
+     */
     public URL getServiceUrl() {
         return serviceUrl;
     }
 
+    /**
+     * Returns the list of supported formats.
+     * @return the list of supported formats
+     */
     public List<String> getFormats() {
         return Collections.unmodifiableList(formats);
     }
@@ -141,8 +154,7 @@ public class WMSImagery {
             DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
             builderFactory.setValidating(false);
             builderFactory.setNamespaceAware(true);
-            DocumentBuilder builder = null;
-            builder = builderFactory.newDocumentBuilder();
+            DocumentBuilder builder = builderFactory.newDocumentBuilder();
             builder.setEntityResolver(new EntityResolver() {
                 @Override
                 public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
@@ -150,8 +162,7 @@ public class WMSImagery {
                     return new InputSource(new StringReader(""));
                 }
             });
-            Document document = null;
-            document = builder.parse(new InputSource(new StringReader(incomingData)));
+            Document document = builder.parse(new InputSource(new StringReader(incomingData)));
 
             // Some WMS service URLs specify a different base URL for their GetMap service
             Element child = getChild(document.getDocumentElement(), "Capability");
@@ -192,7 +203,7 @@ public class WMSImagery {
             Element capabilityElem = getChild(document.getDocumentElement(), "Capability");
             List<Element> children = getChildren(capabilityElem, "Layer");
             layers = parseLayers(children, new HashSet<String>());
-        } catch (Exception e) {
+        } catch (MalformedURLException | ParserConfigurationException | SAXException e) {
             throw new WMSGetCapabilitiesException(e, incomingData);
         }
     }
@@ -311,6 +322,7 @@ public class WMSImagery {
                 case Node.TEXT_NODE:
                     content.append(node.getNodeValue());
                     break;
+                default: // Do nothing
             }
         }
         return content.toString().trim();
@@ -371,6 +383,5 @@ public class WMSImagery {
             else
                 return this.name;
         }
-
     }
 }
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
index 6da75d6..868c646 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/AddTagsDialog.java
@@ -98,7 +98,7 @@ public class AddTagsDialog extends ExtendedDialog {
         }
 
         private String getToolTip() {
-            StringBuilder sb = new StringBuilder();
+            StringBuilder sb = new StringBuilder(64);
             sb.append("<html>")
               .append(tr("Old values of"))
               .append(" <b>")
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
index 1493c20..108577e 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpServer.java
@@ -35,14 +35,14 @@ public class RemoteControlHttpServer extends Thread {
         try {
             instance4 = new RemoteControlHttpServer(port, false);
             instance4.start();
-        } catch (Exception ex) {
+        } catch (IOException ex) {
             Main.warn(marktr("Cannot start IPv4 remotecontrol server on port {0}: {1}"),
                     Integer.toString(port), ex.getLocalizedMessage());
         }
         try {
             instance6 = new RemoteControlHttpServer(port, true);
             instance6.start();
-        } catch (Exception ex) {
+        } catch (IOException ex) {
             /* only show error when we also have no IPv4 */
             if (instance4 == null) {
                 Main.warn(marktr("Cannot start IPv6 remotecontrol server on port {0}: {1}"),
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
index ede96ea..868637c 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/RemoteControlHttpsServer.java
@@ -332,14 +332,14 @@ public class RemoteControlHttpsServer extends Thread {
             try {
                 instance4 = new RemoteControlHttpsServer(port, false);
                 instance4.start();
-            } catch (Exception ex) {
+            } catch (IOException | GeneralSecurityException ex) {
                 Main.warn(marktr("Cannot start IPv4 remotecontrol https server on port {0}: {1}"),
                         Integer.toString(port), ex.getLocalizedMessage());
             }
             try {
                 instance6 = new RemoteControlHttpsServer(port, true);
                 instance6.start();
-            } catch (Exception ex) {
+            } catch (IOException | GeneralSecurityException ex) {
                 /* only show error when we also have no IPv4 */
                 if (instance4 == null) {
                     Main.warn(marktr("Cannot start IPv6 remotecontrol https server on port {0}: {1}"),
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java b/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
index d09c2c7..85dd37c 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
@@ -219,7 +219,7 @@ public class RequestProcessor extends Thread {
                 sendBadRequest(out, help);
             } else {
                 // create handler object
-                RequestHandler handler = handlerClass.newInstance();
+                RequestHandler handler = handlerClass.getConstructor().newInstance();
                 try {
                     handler.setCommand(command);
                     handler.setUrl(url);
@@ -242,7 +242,7 @@ public class RequestProcessor extends Thread {
 
         } catch (IOException ioe) {
             Main.debug(Main.getErrorMessage(ioe));
-        } catch (Exception e) {
+        } catch (ReflectiveOperationException e) {
             Main.error(e);
             try {
                 sendError(out);
@@ -390,17 +390,17 @@ public class RequestProcessor extends Thread {
 
     public static String getHandlerInfoAsJSON(String cmd) {
         try (StringWriter w = new StringWriter()) {
-            PrintWriter r = new PrintWriter(w);
             RequestHandler handler = null;
             try {
                 Class<?> c = handlers.get(cmd);
                 if (c == null) return null;
-                handler = handlers.get(cmd).newInstance();
-            } catch (InstantiationException | IllegalAccessException ex) {
+                handler = handlers.get(cmd).getConstructor().newInstance();
+            } catch (ReflectiveOperationException ex) {
                 Main.error(ex);
                 return null;
             }
 
+            PrintWriter r = new PrintWriter(w);
             printJsonInfo(cmd, r, handler);
             return w.toString();
         } catch (IOException e) {
@@ -458,14 +458,12 @@ public class RequestProcessor extends Thread {
     /**
      * Reports HTML message with the description of all available commands
      * @return HTML message with the description of all available commands
-     * @throws IllegalAccessException if one handler class or its nullary constructor is not accessible.
-     * @throws InstantiationException if one handler class represents an abstract class, an interface, an array class,
-     * a primitive type, or void; or if the class has no nullary constructor; or if the instantiation fails for some other reason.
+     * @throws ReflectiveOperationException if a reflective operation fails for one handler class
      */
-    public static String getUsageAsHtml() throws IllegalAccessException, InstantiationException {
+    public static String getUsageAsHtml() throws ReflectiveOperationException {
         StringBuilder usage = new StringBuilder(1024);
         for (Entry<String, Class<? extends RequestHandler>> handler : handlers.entrySet()) {
-            RequestHandler sample = handler.getValue().newInstance();
+            RequestHandler sample = handler.getValue().getConstructor().newInstance();
             String[] mandatory = sample.getMandatoryParams();
             String[] optional = sample.getOptionalParams();
             String[] examples = sample.getUsageExamples(handler.getKey().substring(1));
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
index 0710b3a..e303bca 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/ImportHandler.java
@@ -46,7 +46,7 @@ public class ImportHandler extends RequestHandler.RawURLParseRequestHandler {
                     task.loadUrl(isLoadInNewLayer(), url.toExternalForm(), null);
                 }
             }
-        } catch (Exception ex) {
+        } catch (RuntimeException ex) {
             Main.warn("RemoteControl: Error parsing import remote control request:");
             Main.error(ex);
             throw new RequestHandlerErrorException(ex);
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
index 592e265..5fbeb91 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
@@ -144,7 +144,7 @@ public class LoadAndZoomHandler extends RequestHandler {
                     }
                 }
             }
-        } catch (Exception ex) {
+        } catch (RuntimeException ex) {
             Main.warn("RemoteControl: Error parsing load_and_zoom remote control request:");
             Main.error(ex);
             throw new RequestHandlerErrorException(ex);
diff --git a/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java b/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
index 5313ea4..97ea539 100644
--- a/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
+++ b/src/org/openstreetmap/josm/io/remotecontrol/handler/VersionHandler.java
@@ -22,7 +22,7 @@ public class VersionHandler extends RequestHandler {
         content = RequestProcessor.PROTOCOLVERSION;
         contentType = "application/json";
         if (args.containsKey("jsonp")) {
-            content = args.get("jsonp") + " && " + args.get("jsonp") + "(" + content + ')';
+            content = args.get("jsonp") + " && " + args.get("jsonp") + '(' + content + ')';
         }
     }
 
diff --git a/src/org/openstreetmap/josm/io/session/GeoImageSessionImporter.java b/src/org/openstreetmap/josm/io/session/GeoImageSessionImporter.java
index 017b447..26b6e46 100644
--- a/src/org/openstreetmap/josm/io/session/GeoImageSessionImporter.java
+++ b/src/org/openstreetmap/josm/io/session/GeoImageSessionImporter.java
@@ -48,55 +48,7 @@ public class GeoImageSessionImporter implements SessionLayerImporter {
                     for (int j = 0; j < attrNodes.getLength(); ++j) {
                         Node attrNode = attrNodes.item(j);
                         if (attrNode.getNodeType() == Node.ELEMENT_NODE) {
-                            Element attrElem = (Element) attrNode;
-                            try {
-                                switch(attrElem.getTagName()) {
-                                case "file":
-                                    entry.setFile(new File(attrElem.getTextContent()));
-                                    break;
-                                case "position":
-                                    double lat = Double.parseDouble(attrElem.getAttribute("lat"));
-                                    double lon = Double.parseDouble(attrElem.getAttribute("lon"));
-                                    entry.setPos(new LatLon(lat, lon));
-                                    break;
-                                case "speed":
-                                    entry.setSpeed(Double.valueOf(attrElem.getTextContent()));
-                                    break;
-                                case "elevation":
-                                    entry.setElevation(Double.valueOf(attrElem.getTextContent()));
-                                    break;
-                                case "gps-time":
-                                    entry.setGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
-                                    break;
-                                case "exif-orientation":
-                                    entry.setExifOrientation(Integer.valueOf(attrElem.getTextContent()));
-                                    break;
-                                case "exif-time":
-                                    entry.setExifTime(new Date(Long.parseLong(attrElem.getTextContent())));
-                                    break;
-                                case "exif-gps-time":
-                                    entry.setExifGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
-                                    break;
-                                case "exif-coordinates":
-                                    entry.setExifCoor(new LatLon(
-                                            Double.parseDouble(attrElem.getAttribute("lat")),
-                                            Double.parseDouble(attrElem.getAttribute("lon"))));
-                                    break;
-                                case "exif-image-direction":
-                                    entry.setExifImgDir(Double.parseDouble(attrElem.getTextContent()));
-                                    break;
-                                case "is-new-gps-data":
-                                    if (Boolean.parseBoolean(attrElem.getTextContent())) {
-                                        entry.flagNewGpsData();
-                                    }
-                                }
-                                // TODO: handle thumbnail loading
-                            } catch (NumberFormatException e) {
-                                // do nothing
-                                if (Main.isTraceEnabled()) {
-                                    Main.trace(e.getMessage());
-                                }
-                            }
+                            handleElement(entry, (Element) attrNode);
                         }
                     }
                     entries.add(entry);
@@ -117,4 +69,56 @@ public class GeoImageSessionImporter implements SessionLayerImporter {
 
         return new GeoImageLayer(entries, gpxLayer, useThumbs);
     }
+
+    private static void handleElement(ImageEntry entry, Element attrElem) {
+        try {
+            switch(attrElem.getTagName()) {
+            case "file":
+                entry.setFile(new File(attrElem.getTextContent()));
+                break;
+            case "position":
+                double lat = Double.parseDouble(attrElem.getAttribute("lat"));
+                double lon = Double.parseDouble(attrElem.getAttribute("lon"));
+                entry.setPos(new LatLon(lat, lon));
+                break;
+            case "speed":
+                entry.setSpeed(Double.valueOf(attrElem.getTextContent()));
+                break;
+            case "elevation":
+                entry.setElevation(Double.valueOf(attrElem.getTextContent()));
+                break;
+            case "gps-time":
+                entry.setGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
+                break;
+            case "exif-orientation":
+                entry.setExifOrientation(Integer.valueOf(attrElem.getTextContent()));
+                break;
+            case "exif-time":
+                entry.setExifTime(new Date(Long.parseLong(attrElem.getTextContent())));
+                break;
+            case "exif-gps-time":
+                entry.setExifGpsTime(new Date(Long.parseLong(attrElem.getTextContent())));
+                break;
+            case "exif-coordinates":
+                entry.setExifCoor(new LatLon(
+                        Double.parseDouble(attrElem.getAttribute("lat")),
+                        Double.parseDouble(attrElem.getAttribute("lon"))));
+                break;
+            case "exif-image-direction":
+                entry.setExifImgDir(Double.parseDouble(attrElem.getTextContent()));
+                break;
+            case "is-new-gps-data":
+                if (Boolean.parseBoolean(attrElem.getTextContent())) {
+                    entry.flagNewGpsData();
+                }
+                break;
+            default: // Do nothing
+            }
+            // TODO: handle thumbnail loading
+        } catch (NumberFormatException e) {
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/io/session/SessionReader.java b/src/org/openstreetmap/josm/io/session/SessionReader.java
index 6f3a460..423c8d9 100644
--- a/src/org/openstreetmap/josm/io/session/SessionReader.java
+++ b/src/org/openstreetmap/josm/io/session/SessionReader.java
@@ -98,8 +98,8 @@ public class SessionReader {
             return null;
         SessionLayerImporter importer = null;
         try {
-            importer = importerClass.newInstance();
-        } catch (InstantiationException | IllegalAccessException e) {
+            importer = importerClass.getConstructor().newInstance();
+        } catch (ReflectiveOperationException e) {
             throw new RuntimeException(e);
         }
         return importer;
diff --git a/src/org/openstreetmap/josm/io/session/SessionWriter.java b/src/org/openstreetmap/josm/io/session/SessionWriter.java
index e3869b1..158747a 100644
--- a/src/org/openstreetmap/josm/io/session/SessionWriter.java
+++ b/src/org/openstreetmap/josm/io/session/SessionWriter.java
@@ -8,7 +8,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
-import java.lang.reflect.Constructor;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -96,9 +95,8 @@ public class SessionWriter {
         if (exporterClass == null)
             return null;
         try {
-            Constructor<? extends SessionLayerExporter> constructor = exporterClass.getConstructor(layerClass);
-            return constructor.newInstance(layer);
-        } catch (Exception e) {
+            return exporterClass.getConstructor(layerClass).newInstance(layer);
+        } catch (ReflectiveOperationException e) {
             throw new RuntimeException(e);
         }
     }
diff --git a/src/org/openstreetmap/josm/plugins/PluginHandler.java b/src/org/openstreetmap/josm/plugins/PluginHandler.java
index 909d72f..a65c8cc 100644
--- a/src/org/openstreetmap/josm/plugins/PluginHandler.java
+++ b/src/org/openstreetmap/josm/plugins/PluginHandler.java
@@ -14,6 +14,7 @@ import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.io.File;
 import java.io.FilenameFilter;
+import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.security.AccessController;
@@ -78,7 +79,7 @@ public final class PluginHandler {
     /**
      * Deprecated plugins that are removed on start
      */
-    protected static final Collection<DeprecatedPlugin> DEPRECATED_PLUGINS;
+    static final Collection<DeprecatedPlugin> DEPRECATED_PLUGINS;
     static {
         String inCore = tr("integrated into main program");
 
@@ -218,13 +219,13 @@ public final class PluginHandler {
     /**
      * List of unmaintained plugins. Not really up-to-date as the vast majority of plugins are not maintained after a few months, sadly...
      */
-    static final String[] UNMAINTAINED_PLUGINS = new String[] {
+    static final List<String> UNMAINTAINED_PLUGINS = Collections.unmodifiableList(Arrays.asList(
         "gpsbabelgui",
         "Intersect_way",
         "ContourOverlappingMerge", // See #11202, #11518, https://github.com/bularcasergiu/ContourOverlappingMerge/issues/1
         "LaneConnector",           // See #11468, #11518, https://github.com/TrifanAdrian/LanecConnectorPlugin/issues/1
         "Remove.redundant.points"  // See #11468, #11518, https://github.com/bularcasergiu/RemoveRedundantPoints (not even created an issue...)
-    };
+    ));
 
     /**
      * Default time-based update interval, in days (pluginmanager.time-based-update.interval)
@@ -449,6 +450,7 @@ public final class PluginHandler {
             case 1:
                 Main.pref.put(togglePreferenceKey, "never");
                 break;
+            default: // Do nothing
             }
         } else {
             Main.pref.put(togglePreferenceKey, "ask");
@@ -722,7 +724,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 (Exception e) {
+        }  catch (RuntimeException e) {
             pluginLoadingExceptions.put(plugin.name, e);
             Main.error(e);
         }
@@ -916,7 +918,7 @@ public final class PluginHandler {
     }
 
     private static void alertFailedPluginUpdate(Component parent, Collection<PluginInformation> plugins) {
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(128);
         sb.append("<html>")
           .append(trn(
                 "Updating the following plugin has failed:",
@@ -1192,7 +1194,7 @@ public final class PluginHandler {
             try {
                 // Check the plugin is a valid and accessible JAR file before installing it (fix #7754)
                 new JarFile(updatedPlugin).close();
-            } catch (Exception e) {
+            } catch (IOException e) {
                 if (dowarn) {
                     Main.warn(tr("Failed to install plugin ''{0}'' from temporary download file ''{1}''. {2}",
                             plugin.toString(), updatedPlugin.toString(), e.getLocalizedMessage()));
@@ -1220,13 +1222,13 @@ public final class PluginHandler {
         if (jar != null && jar.exists() && jar.canRead()) {
             try {
                 new JarFile(jar).close();
-            } catch (Exception e) {
+            } catch (IOException e) {
                 Main.warn(e);
                 return false;
             }
             return true;
         } else if (jar != null) {
-            Main.warn("Invalid jar file ''"+jar+"'' (exists: "+jar.exists()+", canRead: "+jar.canRead()+")");
+            Main.warn("Invalid jar file ''"+jar+"'' (exists: "+jar.exists()+", canRead: "+jar.canRead()+')');
         }
         return false;
     }
@@ -1293,7 +1295,7 @@ public final class PluginHandler {
                 )
         };
 
-        final StringBuilder msg = new StringBuilder();
+        final StringBuilder msg = new StringBuilder(256);
         msg.append("<html>")
            .append(tr("An unexpected exception occurred that may have come from the ''{0}'' plugin.", plugin.getPluginInformation().name))
            .append("<br>");
@@ -1483,17 +1485,22 @@ public final class PluginHandler {
      * @since 8938
      */
     public static Set<String> getDeprecatedAndUnmaintainedPlugins() {
-        Set<String> result = new HashSet<>(DEPRECATED_PLUGINS.size() + UNMAINTAINED_PLUGINS.length);
+        Set<String> result = new HashSet<>(DEPRECATED_PLUGINS.size() + UNMAINTAINED_PLUGINS.size());
         for (DeprecatedPlugin dp : DEPRECATED_PLUGINS) {
             result.add(dp.name);
         }
-        result.addAll(Arrays.asList(UNMAINTAINED_PLUGINS));
+        result.addAll(UNMAINTAINED_PLUGINS);
         return result;
     }
 
     private static class UpdatePluginsMessagePanel extends JPanel {
-        private JMultilineLabel lblMessage;
-        private JCheckBox cbDontShowAgain;
+        private final JMultilineLabel lblMessage = new JMultilineLabel("");
+        private final JCheckBox cbDontShowAgain = new JCheckBox(
+                tr("Do not ask again and remember my decision (go to Preferences->Plugins to change it later)"));
+
+        UpdatePluginsMessagePanel() {
+            build();
+        }
 
         protected final void build() {
             setLayout(new GridBagLayout());
@@ -1503,21 +1510,16 @@ public final class PluginHandler {
             gc.weightx = 1.0;
             gc.weighty = 1.0;
             gc.insets = new Insets(5, 5, 5, 5);
-            add(lblMessage = new JMultilineLabel(""), gc);
+            add(lblMessage, gc);
             lblMessage.setFont(lblMessage.getFont().deriveFont(Font.PLAIN));
 
             gc.gridy = 1;
             gc.fill = GridBagConstraints.HORIZONTAL;
             gc.weighty = 0.0;
-            add(cbDontShowAgain = new JCheckBox(
-                    tr("Do not ask again and remember my decision (go to Preferences->Plugins to change it later)")), gc);
+            add(cbDontShowAgain, gc);
             cbDontShowAgain.setFont(cbDontShowAgain.getFont().deriveFont(Font.PLAIN));
         }
 
-        UpdatePluginsMessagePanel() {
-            build();
-        }
-
         public void setMessage(String message) {
             lblMessage.setText(message);
         }
diff --git a/src/org/openstreetmap/josm/plugins/PluginInformation.java b/src/org/openstreetmap/josm/plugins/PluginInformation.java
index feb4669..1ae133c 100644
--- a/src/org/openstreetmap/josm/plugins/PluginInformation.java
+++ b/src/org/openstreetmap/josm/plugins/PluginInformation.java
@@ -11,7 +11,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -205,13 +204,9 @@ public class PluginInformation {
         if (s == null) {
             s = attr.getValue("Plugin-Link");
         }
-        if (s != null) {
-            try {
-                new URL(s);
-            } catch (MalformedURLException e) {
-                Main.info(tr("Invalid URL ''{0}'' in plugin {1}", s, name));
-                s = null;
-            }
+        if (s != null && !Utils.isValidUrl(s)) {
+            Main.info(tr("Invalid URL ''{0}'' in plugin {1}", s, name));
+            s = null;
         }
         link = s;
         requires = attr.getValue("Plugin-Requires");
@@ -272,7 +267,7 @@ public class PluginInformation {
                             }
                         }
                     }
-                } catch (Exception e) {
+                } catch (NumberFormatException e) {
                     Main.error(e);
                 }
             }
diff --git a/src/org/openstreetmap/josm/plugins/PluginProxy.java b/src/org/openstreetmap/josm/plugins/PluginProxy.java
index e3884e7..07be142 100644
--- a/src/org/openstreetmap/josm/plugins/PluginProxy.java
+++ b/src/org/openstreetmap/josm/plugins/PluginProxy.java
@@ -1,6 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 
 import org.openstreetmap.josm.Main;
@@ -44,7 +45,7 @@ public class PluginProxy extends Plugin {
             plugin.getClass().getMethod("mapFrameInitialized", MapFrame.class, MapFrame.class).invoke(plugin, oldFrame, newFrame);
         } catch (NoSuchMethodException e) {
             Main.debug("Plugin "+plugin+" does not define mapFrameInitialized");
-        } catch (Exception e) {
+        } catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
             handlePluginException(e);
         }
     }
@@ -56,7 +57,7 @@ public class PluginProxy extends Plugin {
         } catch (NoSuchMethodException e) {
             Main.debug("Plugin "+plugin+" does not define getPreferenceSetting");
             return null;
-        } catch (Exception e) {
+        } catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
             handlePluginException(e);
         }
         return null;
@@ -68,7 +69,7 @@ public class PluginProxy extends Plugin {
             plugin.getClass().getMethod("addDownloadSelection", List.class).invoke(plugin, list);
         } catch (NoSuchMethodException e) {
             Main.debug("Plugin "+plugin+" does not define addDownloadSelection");
-        } catch (Exception e) {
+        } catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
             handlePluginException(e);
         }
     }
diff --git a/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java b/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java
index b1f416c..ab1d8f7 100644
--- a/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java
+++ b/src/org/openstreetmap/josm/plugins/ReadLocalPluginInformationTask.java
@@ -57,7 +57,9 @@ public class ReadLocalPluginInformationTask extends PleaseWaitRunnable {
     }
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing
+    }
 
     protected void processJarFile(File f, String pluginName) throws PluginException {
         PluginInformation info = new PluginInformation(
diff --git a/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java b/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
index 7717fbd..4050205 100644
--- a/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
+++ b/src/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTask.java
@@ -96,7 +96,9 @@ public class ReadRemotePluginInformationTask extends PleaseWaitRunnable {
     }
 
     @Override
-    protected void finish() {}
+    protected void finish() {
+        // Do nothing
+    }
 
     /**
      * Creates the file name for the cached plugin list and the icon cache file.
diff --git a/src/org/openstreetmap/josm/tools/AudioPlayer.java b/src/org/openstreetmap/josm/tools/AudioPlayer.java
index b149c73..24029fe 100644
--- a/src/org/openstreetmap/josm/tools/AudioPlayer.java
+++ b/src/org/openstreetmap/josm/tools/AudioPlayer.java
@@ -206,7 +206,7 @@ public final class AudioPlayer extends Thread {
         try {
             audioPlayer = new AudioPlayer();
             return audioPlayer;
-        } catch (Exception ex) {
+        } catch (RuntimeException ex) {
             Main.error(ex);
             return null;
         }
@@ -248,7 +248,7 @@ public final class AudioPlayer extends Thread {
         playingUrl = null;
         AudioInputStream audioInputStream = null;
         SourceDataLine audioOutputLine = null;
-        AudioFormat audioFormat = null;
+        AudioFormat audioFormat;
         byte[] abData = new byte[(int) chunk];
 
         for (;;) {
@@ -265,7 +265,7 @@ public final class AudioPlayer extends Thread {
                     case PLAYING:
                         command.possiblyInterrupt();
                         for (;;) {
-                            int nBytesRead = 0;
+                            int nBytesRead;
                             nBytesRead = audioInputStream.read(abData, 0, abData.length);
                             position += nBytesRead / bytesPerSecond;
                             command.possiblyInterrupt();
@@ -285,6 +285,7 @@ public final class AudioPlayer extends Thread {
                         state = State.NOTPLAYING;
                         command.possiblyInterrupt();
                         break;
+                    default: // Do nothing
                 }
             } catch (InterruptedException e) {
                 interrupted(); // just in case we get an interrupt
@@ -354,6 +355,7 @@ public final class AudioPlayer extends Thread {
                         case PAUSE:
                             stateChange = State.PAUSED;
                             break;
+                        default: // Do nothing
                     }
                     command.ok(stateChange);
                 } catch (LineUnavailableException | IOException | UnsupportedAudioFileException |
@@ -361,8 +363,9 @@ public final class AudioPlayer extends Thread {
                     Main.error(startPlayingException);
                     command.failed(startPlayingException); // sets state
                 }
-            } catch (Exception e) {
+            } catch (IOException e) {
                 state = State.NOTPLAYING;
+                Main.error(e);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/tools/Diff.java b/src/org/openstreetmap/josm/tools/Diff.java
index 0f007b8..ff3f500 100644
--- a/src/org/openstreetmap/josm/tools/Diff.java
+++ b/src/org/openstreetmap/josm/tools/Diff.java
@@ -103,15 +103,6 @@ public class Diff {
      sibling file. */
     private int equivMax = 1;
 
-    /** When set to true, the comparison uses a heuristic to speed it up.
-    With this heuristic, for files with a constant small density
-    of changes, the algorithm is linear in the file size.  */
-    public boolean heuristic;
-
-    /** When set to true, the algorithm returns a guarranteed minimal
-      set of changes.  This makes things slower, sometimes much slower. */
-    public boolean noDiscards;
-
     private int[] xvec, yvec; /* Vectors being compared. */
     private int[] fdiag;      /* Vector, indexed by diagonal, containing
                    the X coordinate of the point furthest
@@ -245,76 +236,6 @@ public class Diff {
                     return d;
                 }
             }
-
-            /* Heuristic: check occasionally for a diagonal that has made
-       lots of progress compared with the edit distance.
-       If we have any such, find the one that has made the most
-       progress and return it as if it had succeeded.
-
-       With this heuristic, for files with a constant small density
-       of changes, the algorithm is linear in the file size.  */
-
-            if (c > 200 && bigSnake && heuristic) {
-                int best = 0;
-                int bestpos = -1;
-
-                for (d = fmax; d >= fmin; d -= 2) {
-                    int dd = d - fmid;
-                    int x = fd[fdiagoff + d];
-                    int y = x - d;
-                    int v = (x - xoff) * 2 - dd;
-                    if (v > 12 * (c + (dd < 0 ? -dd : dd))) {
-                        if (v > best
-                                && xoff + SNAKE_LIMIT <= x && x < xlim
-                                && yoff + SNAKE_LIMIT <= y && y < ylim) {
-                            /* We have a good enough best diagonal.
-                               now insist that it end with a significant snake.  */
-                            int k;
-
-                            for (k = 1; xvec[x - k] == yvec[y - k]; k++) {
-                                if (k == SNAKE_LIMIT) {
-                                    best = v;
-                                    bestpos = d;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-                if (best > 0) {
-                    cost = 2 * c - 1;
-                    return bestpos;
-                }
-
-                best = 0;
-                for (d = bmax; d >= bmin; d -= 2) {
-                    int dd = d - bmid;
-                    int x = bd[bdiagoff + d];
-                    int y = x - d;
-                    int v = (xlim - x) * 2 + dd;
-                    if (v > 12 * (c + (dd < 0 ? -dd : dd))) {
-                        if (v > best
-                                && xoff < x && x <= xlim - SNAKE_LIMIT
-                                && yoff < y && y <= ylim - SNAKE_LIMIT) {
-                            /* We have a good enough best diagonal.
-                               now insist that it end with a significant snake.  */
-                            int k;
-
-                            for (k = 0; xvec[x + k] == yvec[y + k]; k++) {
-                                if (k == SNAKE_LIMIT) {
-                                    best = v;
-                                    bestpos = d;
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-                if (best > 0) {
-                    cost = 2 * c - 1;
-                    return bestpos;
-                }
-            }
         }
     }
 
@@ -385,14 +306,10 @@ public class Diff {
         filevec[1].discard_confusing_lines(filevec[0]);
     }
 
-    private boolean inhibit;
-
     /**
      * Adjust inserts/deletes of blank lines to join changes as much as possible.
      */
     private void shift_boundaries() {
-        if (inhibit)
-            return;
         filevec[0].shift_boundaries(filevec[1]);
         filevec[1].shift_boundaries(filevec[0]);
     }
@@ -596,7 +513,7 @@ public class Diff {
         @Override
         public String toString() {
             String s = String.format("%d -%d +%d %d", line0, deleted, inserted, line1);
-            return (link != null) ? s = s + '\n' + link : s;
+            return (link != null) ? s + '\n' + link : s;
         }
     }
 
@@ -808,7 +725,7 @@ public class Diff {
             final int end = bufferedLines;
             int j = 0;
             for (int i = 0; i < end; ++i) {
-                if (noDiscards || discards[i] == 0) {
+                if (discards[i] == 0) {
                     undiscarded[j] = equivs[i];
                     realindexes[j++] = i;
                 } else {
@@ -831,7 +748,8 @@ public class Diff {
             for (int i = 0; i < data.length; ++i) {
                 Integer ir = h.get(data[i]);
                 if (ir == null) {
-                    h.put(data[i], equivs[i] = equivMax++);
+                    equivs[i] = equivMax++;
+                    h.put(data[i], equivs[i]);
                 } else {
                     equivs[i] = ir.intValue();
                 }
diff --git a/src/org/openstreetmap/josm/tools/ExifReader.java b/src/org/openstreetmap/josm/tools/ExifReader.java
index 216343d..9924d85 100644
--- a/src/org/openstreetmap/josm/tools/ExifReader.java
+++ b/src/org/openstreetmap/josm/tools/ExifReader.java
@@ -77,7 +77,7 @@ public final class ExifReader {
                 }
                 return date;
             }
-        } catch (Exception e) {
+        } catch (UncheckedParseException | JpegProcessingException | IOException e) {
             Main.error(e);
         }
         return null;
diff --git a/src/org/openstreetmap/josm/tools/HttpClient.java b/src/org/openstreetmap/josm/tools/HttpClient.java
index cd70c04..ecbff4b 100644
--- a/src/org/openstreetmap/josm/tools/HttpClient.java
+++ b/src/org/openstreetmap/josm/tools/HttpClient.java
@@ -121,10 +121,10 @@ public final class HttpClient {
                 connection.connect();
                 final boolean hasReason = reasonForRequest != null && !reasonForRequest.isEmpty();
                 Main.info("{0} {1}{2} -> {3}{4}",
-                        requestMethod, url, hasReason ? " (" + reasonForRequest + ")" : "",
+                        requestMethod, url, hasReason ? (" (" + reasonForRequest + ')') : "",
                         connection.getResponseCode(),
                         connection.getContentLengthLong() > 0
-                                ? " (" + Utils.getSizeString(connection.getContentLengthLong(), Locale.getDefault()) + ")"
+                                ? (" (" + Utils.getSizeString(connection.getContentLengthLong(), Locale.getDefault()) + ')')
                                 : ""
                 );
                 if (Main.isDebugEnabled()) {
diff --git a/src/org/openstreetmap/josm/tools/ImageProvider.java b/src/org/openstreetmap/josm/tools/ImageProvider.java
index 7f1de8c..a95a1cb 100644
--- a/src/org/openstreetmap/josm/tools/ImageProvider.java
+++ b/src/org/openstreetmap/josm/tools/ImageProvider.java
@@ -57,6 +57,7 @@ import javax.swing.ImageIcon;
 import javax.xml.bind.DatatypeConverter;
 
 import org.openstreetmap.josm.Main;
+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.gui.mappaint.MapPaintStyles;
@@ -81,8 +82,8 @@ import org.xml.sax.helpers.DefaultHandler;
 import org.xml.sax.helpers.XMLReaderFactory;
 
 import com.kitfox.svg.SVGDiagram;
+import com.kitfox.svg.SVGException;
 import com.kitfox.svg.SVGUniverse;
-import org.openstreetmap.josm.data.osm.DataSet;
 
 /**
  * Helper class to support the application with images.
@@ -926,7 +927,7 @@ public class ImageProvider {
                 }
             } else {
                 final String fnMD5 = Utils.md5Hex(fn);
-                url = b + fnMD5.substring(0, 1) + '/' + fnMD5.substring(0, 2) + "/" + fn;
+                url = b + fnMD5.substring(0, 1) + '/' + fnMD5.substring(0, 2) + '/' + fn;
             }
             result = getIfAvailableHttp(url, type);
             if (result != null) {
@@ -985,7 +986,7 @@ public class ImageProvider {
                     }
                 }
             }
-        } catch (Exception e) {
+        } catch (IOException e) {
             Main.warn(tr("Failed to handle zip file ''{0}''. Exception was: {1}", archive.getName(), e.toString()));
         }
         return null;
@@ -1152,7 +1153,7 @@ public class ImageProvider {
             cf.close();
         } catch (SAXReturnException r) {
             return r.getResult();
-        } catch (Exception e) {
+        } catch (IOException | SAXException e) {
             Main.warn("Parsing " + base + fn + " failed:\n" + e);
             return null;
         }
@@ -1228,7 +1229,8 @@ public class ImageProvider {
         synchronized (ROTATE_CACHE) {
             Map<Long, ImageResource> cacheByAngle = ROTATE_CACHE.get(img);
             if (cacheByAngle == null) {
-                ROTATE_CACHE.put(img, cacheByAngle = new HashMap<>());
+                cacheByAngle = new HashMap<>();
+                ROTATE_CACHE.put(img, cacheByAngle);
             }
 
             imageResource = cacheByAngle.get(originalAngle);
@@ -1256,7 +1258,8 @@ public class ImageProvider {
                     h = (int) (ih * Math.sin(radian) + iw * Math.sin(DEGREE_90 - radian));
                 }
                 Image image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
-                cacheByAngle.put(originalAngle, imageResource = new ImageResource(image));
+                imageResource = new ImageResource(image);
+                cacheByAngle.put(originalAngle, imageResource);
                 Graphics g = image.getGraphics();
                 Graphics2D g2d = (Graphics2D) g.create();
 
@@ -1424,7 +1427,7 @@ public class ImageProvider {
             synchronized (getSvgUniverse()) {
                 svg.render(g);
             }
-        } catch (Exception ex) {
+        } catch (SVGException ex) {
             Main.error("Unable to load svg: {0}", ex.getMessage());
             return null;
         }
diff --git a/src/org/openstreetmap/josm/tools/OpenBrowser.java b/src/org/openstreetmap/josm/tools/OpenBrowser.java
index ca284b5..9253749 100644
--- a/src/org/openstreetmap/josm/tools/OpenBrowser.java
+++ b/src/org/openstreetmap/josm/tools/OpenBrowser.java
@@ -6,6 +6,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Desktop;
 import java.io.IOException;
 import java.net.URI;
+import java.net.URISyntaxException;
 
 import org.openstreetmap.josm.Main;
 
@@ -61,7 +62,7 @@ public final class OpenBrowser {
                         displayUrlFallback(uri);
                     }
                 }
-            } catch (Exception e) {
+            } catch (IOException e) {
                 Main.warn(e);
                 return e.getMessage();
             }
@@ -87,7 +88,7 @@ public final class OpenBrowser {
     public static String displayUrl(String url) {
         try {
             return displayUrl(new URI(url));
-        } catch (Exception e) {
+        } catch (URISyntaxException e) {
             return e.getMessage();
         }
     }
diff --git a/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java b/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java
index 6e2991a..126206c 100644
--- a/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java
+++ b/src/org/openstreetmap/josm/tools/OverpassTurboQueryWizard.java
@@ -51,7 +51,7 @@ public final class OverpassTurboQueryWizard {
                     "  });" +
                     "}");
         } catch (ScriptException | IOException ex) {
-            throw new RuntimeException("Failed to initialize OverpassTurboQueryWizard", ex);
+            throw new IllegalStateException("Failed to initialize OverpassTurboQueryWizard", ex);
         }
     }
 
diff --git a/src/org/openstreetmap/josm/tools/Pair.java b/src/org/openstreetmap/josm/tools/Pair.java
index ae1776c..fcc394e 100644
--- a/src/org/openstreetmap/josm/tools/Pair.java
+++ b/src/org/openstreetmap/josm/tools/Pair.java
@@ -41,7 +41,7 @@ public final class Pair<A, B> {
         if (other == null || getClass() != other.getClass()) return false;
         Pair<?, ?> pair = (Pair<?, ?>) other;
         return Objects.equals(a, pair.a) &&
-                Objects.equals(b, pair.b);
+               Objects.equals(b, pair.b);
     }
 
     /**
@@ -61,7 +61,7 @@ public final class Pair<A, B> {
 
     @Override
     public String toString() {
-        return "<"+a+','+b+'>';
+        return '<'+a.toString()+','+b.toString()+'>';
     }
 
     /**
diff --git a/src/org/openstreetmap/josm/tools/PlatformHookOsx.java b/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
index 24cc6b0..dc5df01 100644
--- a/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
+++ b/src/org/openstreetmap/josm/tools/PlatformHookOsx.java
@@ -3,12 +3,14 @@ package org.openstreetmap.josm.tools;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Desktop;
 import java.awt.Image;
 import java.awt.Window;
 import java.awt.event.KeyEvent;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Arrays;
@@ -41,26 +43,32 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
     @Override
     public void startupHook() {
         // Here we register callbacks for the menu entries in the system menu and file opening through double-click
+        // http://openjdk.java.net/jeps/272
+        // https://bugs.openjdk.java.net/browse/JDK-8048731
+        // http://cr.openjdk.java.net/~azvegint/jdk/9/8143227/10/jdk/
+        // This method must be cleaned up after we switch to Java 9
         try {
             Class<?> eawtApplication = Class.forName("com.apple.eawt.Application");
-            Class<?> eawtQuitHandler = Class.forName("com.apple.eawt.QuitHandler");
-            Class<?> eawtAboutHandler = Class.forName("com.apple.eawt.AboutHandler");
-            Class<?> eawtOpenFilesHandler = Class.forName("com.apple.eawt.OpenFilesHandler");
-            Class<?> eawtPreferencesHandler = Class.forName("com.apple.eawt.PreferencesHandler");
-            Object appli = eawtApplication.getConstructor((Class[]) null).newInstance((Object[]) null);
+            Class<?> quitHandler = findHandlerClass("QuitHandler");
+            Class<?> aboutHandler = findHandlerClass("AboutHandler");
+            Class<?> openFilesHandler = findHandlerClass("OpenFilesHandler");
+            Class<?> preferencesHandler = findHandlerClass("PreferencesHandler");
             Object proxy = Proxy.newProxyInstance(PlatformHookOsx.class.getClassLoader(), new Class<?>[] {
-                eawtQuitHandler, eawtAboutHandler, eawtOpenFilesHandler, eawtPreferencesHandler}, ivhandler);
-            eawtApplication.getDeclaredMethod("setQuitHandler", eawtQuitHandler).invoke(appli, proxy);
-            eawtApplication.getDeclaredMethod("setAboutHandler", eawtAboutHandler).invoke(appli, proxy);
-            eawtApplication.getDeclaredMethod("setOpenFileHandler", eawtOpenFilesHandler).invoke(appli, proxy);
-            eawtApplication.getDeclaredMethod("setPreferencesHandler", eawtPreferencesHandler).invoke(appli, proxy);
-            // this method has been deprecated, but without replacement ATM
-            eawtApplication.getDeclaredMethod("setEnabledPreferencesMenu", boolean.class).invoke(appli, Boolean.TRUE);
-            // setup the dock icon. It is automatically set with application bundle and Web start but we need
-            // to do it manually if run with `java -jar``
-            eawtApplication.getDeclaredMethod("setDockIconImage", Image.class).invoke(appli, ImageProvider.get("logo").getImage());
-            // enable full screen
-            enableOSXFullscreen((Window) Main.parent);
+                quitHandler, aboutHandler, openFilesHandler, preferencesHandler}, ivhandler);
+            try {
+                Object appli = eawtApplication.getConstructor((Class[]) null).newInstance((Object[]) null);
+                setHandlers(eawtApplication, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, appli);
+                // this method has been deprecated, but without replacement ATM
+                eawtApplication.getDeclaredMethod("setEnabledPreferencesMenu", boolean.class).invoke(appli, Boolean.TRUE);
+                // setup the dock icon. It is automatically set with application bundle and Web start but we need
+                // to do it manually if run with `java -jar``
+                eawtApplication.getDeclaredMethod("setDockIconImage", Image.class).invoke(appli, ImageProvider.get("logo").getImage());
+                // enable full screen
+                enableOSXFullscreen((Window) Main.parent);
+            } catch (IllegalAccessException e) {
+                // with Java 9, module java.desktop does not export com.apple.eawt, use new Desktop API instead
+                setHandlers(Desktop.class, quitHandler, aboutHandler, openFilesHandler, preferencesHandler, proxy, Desktop.getDesktop());
+            }
         } catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
             // We'll just ignore this for now. The user will still be able to close JOSM by closing all its windows.
             Main.warn("Failed to register with OSX: " + ex);
@@ -72,6 +80,23 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         }
     }
 
+    protected void setHandlers(Class<?> appClass, Class<?> quitHandler, Class<?> aboutHandler,
+            Class<?> openFilesHandler, Class<?> preferencesHandler, Object proxy, Object appInstance)
+                    throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
+        appClass.getDeclaredMethod("setQuitHandler", quitHandler).invoke(appInstance, proxy);
+        appClass.getDeclaredMethod("setAboutHandler", aboutHandler).invoke(appInstance, proxy);
+        appClass.getDeclaredMethod("setOpenFileHandler", openFilesHandler).invoke(appInstance, proxy);
+        appClass.getDeclaredMethod("setPreferencesHandler", preferencesHandler).invoke(appInstance, proxy);
+    }
+
+    protected Class<?> findHandlerClass(String className) throws ClassNotFoundException {
+        try {
+            return Class.forName("com.apple.eawt."+className);
+        } catch (ClassNotFoundException e) {
+            return Class.forName("java.awt.desktop."+className);
+        }
+    }
+
     /**
      * Enables fullscreen support for the given window.
      * @param window The window for which full screen will be available
@@ -124,7 +149,12 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         case "handleQuitRequestWith":
             boolean closed = Main.exitJosm(false, 0);
             if (args[1] != null) {
-                args[1].getClass().getDeclaredMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
+                try {
+                    args[1].getClass().getDeclaredMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
+                } catch (IllegalAccessException e) {
+                    // with Java 9, module java.desktop does not export com.apple.eawt, use new Desktop API instead
+                    Class.forName("java.awt.desktop.QuitResponse").getMethod(closed ? "performQuit" : "cancelQuit").invoke(args[1]);
+                }
             }
             break;
         case "handleAbout":
@@ -292,7 +322,7 @@ public class PlatformHookOsx extends PlatformHookUnixoid implements InvocationHa
         if (lafid.contains("Mac") || lafid.contains("Aqua")) {
             canHtml = false;
         }
-        StringBuilder result = new StringBuilder();
+        StringBuilder result = new StringBuilder(48);
         if (canHtml) {
             result.append("<html>");
         }
diff --git a/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java b/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
index 03db803..026e0c6 100644
--- a/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
+++ b/src/org/openstreetmap/josm/tools/PlatformHookUnixoid.java
@@ -107,6 +107,7 @@ public class PlatformHookUnixoid implements PlatformHook {
 
     @Override
     public void afterPrefStartupHook() {
+        // Do nothing
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/tools/Predicates.java b/src/org/openstreetmap/josm/tools/Predicates.java
index 2c2b528..5d072c3 100644
--- a/src/org/openstreetmap/josm/tools/Predicates.java
+++ b/src/org/openstreetmap/josm/tools/Predicates.java
@@ -79,9 +79,11 @@ public final class Predicates {
      * Creates a new predicate that checks if elements are exactly of that class.
      * @param <T> The predicate type.
      * @param clazz The class the elements must have.
-     * @return A predicate.
+     * @return The new predicate.
+     * @throws IllegalArgumentException if clazz is null
      */
     public static <T> Predicate<T> isOfClass(final Class<? extends T> clazz) {
+        CheckParameterUtil.ensureParameterNotNull(clazz, "clazz");
         return new Predicate<T>() {
             @Override
             public boolean evaluate(T obj) {
@@ -91,6 +93,24 @@ public final class Predicates {
     }
 
     /**
+     * Creates a new predicate that checks if the object is of a given class.
+     * @param <T> The predicate type.
+     * @param clazz The class objects need to be of.
+     * @return The new predicate.
+     * @throws IllegalArgumentException if clazz is null
+     * @since 10286
+     */
+    public static <T> Predicate<T> isInstanceOf(final Class<? extends T> clazz) {
+        CheckParameterUtil.ensureParameterNotNull(clazz, "clazz");
+        return new Predicate<T>() {
+            @Override
+            public boolean evaluate(T o) {
+                return clazz.isInstance(o);
+            }
+        };
+    }
+
+    /**
      * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}.
      * @param pattern the pattern
      * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}
@@ -189,4 +209,5 @@ public final class Predicates {
             }
         };
     }
+
 }
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index 1e8f2ff..7a85389 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
+import java.lang.reflect.AccessibleObject;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLDecoder;
@@ -33,8 +34,10 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
+import java.security.AccessController;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.security.PrivilegedAction;
 import java.text.Bidi;
 import java.text.MessageFormat;
 import java.util.AbstractCollection;
@@ -78,21 +81,24 @@ public final class Utils {
     /** Pattern matching white spaces */
     public static final Pattern WHITE_SPACES_PATTERN = Pattern.compile("\\s+");
 
-    private Utils() {
-        // Hide default constructor for utils classes
-    }
-
     private static final int MILLIS_OF_SECOND = 1000;
     private static final int MILLIS_OF_MINUTE = 60000;
     private static final int MILLIS_OF_HOUR = 3600000;
     private static final int MILLIS_OF_DAY = 86400000;
 
+    /**
+     * A list of all characters allowed in URLs
+     */
     public static final String URL_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=%";
 
     private static final char[] DEFAULT_STRIP = {'\u200B', '\uFEFF'};
 
     private static final String[] SIZE_UNITS = {"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
 
+    private Utils() {
+        // Hide default constructor for utils classes
+    }
+
     /**
      * Tests whether {@code predicate} applies to at least one element from {@code collection}.
      * @param <T> type of items
@@ -102,8 +108,9 @@ public final class Utils {
      */
     public static <T> boolean exists(Iterable<? extends T> collection, Predicate<? super T> predicate) {
         for (T item : collection) {
-            if (predicate.evaluate(item))
+            if (predicate.evaluate(item)) {
                 return true;
+            }
         }
         return false;
     }
@@ -119,31 +126,52 @@ public final class Utils {
         return !exists(collection, Predicates.not(predicate));
     }
 
-    public static <T> boolean exists(Iterable<T> collection, Class<? extends T> klass) {
-        for (Object item : collection) {
-            if (klass.isInstance(item))
-                return true;
-        }
-        return false;
+    /**
+     * Checks if an item that is an instance of clazz exists in the collection
+     * @param <T> The collection type.
+     * @param collection The collection
+     * @param clazz The class to search for.
+     * @return <code>true</code> if that item exists in the collection.
+     */
+    public static <T> boolean exists(Iterable<T> collection, Class<? extends T> clazz) {
+        return exists(collection, Predicates.<T>isInstanceOf(clazz));
     }
 
+    /**
+     * Finds the first item in the iterable for which the predicate matches.
+     * @param <T> The iterable type.
+     * @param collection The iterable to search in.
+     * @param predicate The predicate to match
+     * @return the item or <code>null</code> if there was not match.
+     */
     public static <T> T find(Iterable<? extends T> collection, Predicate<? super T> predicate) {
         for (T item : collection) {
-            if (predicate.evaluate(item))
+            if (predicate.evaluate(item)) {
                 return item;
+            }
         }
         return null;
     }
 
+    /**
+     * Finds the first item in the iterable which is of the given type.
+     * @param <T> The iterable type.
+     * @param collection The iterable to search in.
+     * @param clazz The class to search for.
+     * @return the item or <code>null</code> if there was not match.
+     */
     @SuppressWarnings("unchecked")
-    public static <T> T find(Iterable<? super T> collection, Class<? extends T> klass) {
-        for (Object item : collection) {
-            if (klass.isInstance(item))
-                return (T) item;
-        }
-        return null;
+    public static <T> T find(Iterable<? extends Object> collection, Class<? extends T> clazz) {
+        return (T) find(collection, Predicates.<Object>isInstanceOf(clazz));
     }
 
+    /**
+     * Creates a new {@link FilteredCollection}.
+     * @param <T> The collection type.
+     * @param collection The collection to filter.
+     * @param predicate The predicate to filter for.
+     * @return The new {@link FilteredCollection}
+     */
     @SuppressWarnings("unused")
     public static <T> Collection<T> filter(Collection<? extends T> collection, Predicate<? super T> predicate) {
         // Diamond operator does not work with Java 9 here
@@ -172,18 +200,20 @@ public final class Utils {
      * @param <S> Super type of items
      * @param <T> type of items
      * @param collection the collection
-     * @param klass the (sub)class
+     * @param clazz the (sub)class
      * @return a read-only filtered collection
      */
-    public static <S, T extends S> SubclassFilteredCollection<S, T> filteredCollection(Collection<S> collection, final Class<T> klass) {
-        return new SubclassFilteredCollection<>(collection, new Predicate<S>() {
-            @Override
-            public boolean evaluate(S o) {
-                return klass.isInstance(o);
-            }
-        });
+    public static <S, T extends S> SubclassFilteredCollection<S, T> filteredCollection(Collection<S> collection, final Class<T> clazz) {
+        return new SubclassFilteredCollection<>(collection, Predicates.<S>isInstanceOf(clazz));
     }
 
+    /**
+     * Find the index of the first item that matches the predicate.
+     * @param <T> The iterable type
+     * @param collection The iterable to iterate over.
+     * @param predicate The predicate to search for.
+     * @return The index of the first item or -1 if none was found.
+     */
     public static <T> int indexOf(Iterable<? extends T> collection, Predicate<? super T> predicate) {
         int i = 0;
         for (T item : collection) {
@@ -1293,6 +1323,21 @@ public final class Utils {
     }
 
     /**
+     * Determines if the given URL is valid.
+     * @param url The URL to test
+     * @return {@code true} if the url is valid
+     * @since 10294
+     */
+    public static boolean isValidUrl(String url) {
+        try {
+            new URL(url);
+            return true;
+        } catch (MalformedURLException | NullPointerException e) {
+            return false;
+        }
+    }
+
+    /**
      * Creates a new {@link ThreadFactory} which creates threads with names according to {@code nameFormat}.
      * @param nameFormat a {@link String#format(String, Object...)} compatible name format; its first argument is a unique thread index
      * @param threadPriority the priority of the created threads, see {@link Thread#setPriority(int)}
@@ -1536,4 +1581,23 @@ public final class Utils {
         return gvs;
     }
 
+    /**
+     * Sets {@code AccessibleObject}(s) accessible.
+     * @param objects objects
+     * @see AccessibleObject#setAccessible
+     * @since 10223
+     */
+    public static void setObjectsAccessible(final AccessibleObject ... objects) {
+        if (objects != null && objects.length > 0) {
+            AccessController.doPrivileged(new PrivilegedAction<Object>() {
+                @Override
+                public Object run() {
+                    for (AccessibleObject o : objects) {
+                        o.setAccessible(true);
+                    }
+                    return null;
+                }
+            });
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/tools/WindowGeometry.java b/src/org/openstreetmap/josm/tools/WindowGeometry.java
index 0dd8515..8483e99 100644
--- a/src/org/openstreetmap/josm/tools/WindowGeometry.java
+++ b/src/org/openstreetmap/josm/tools/WindowGeometry.java
@@ -23,10 +23,76 @@ import org.openstreetmap.josm.gui.util.GuiHelper;
 /**
  * This is a helper class for persisting the geometry of a JOSM window to the preference store
  * and for restoring it from the preference store.
- *
+ * @since 2008
  */
 public class WindowGeometry {
 
+    /** the top left point */
+    private Point topLeft;
+    /** the size */
+    private Dimension extent;
+
+    /**
+     * Creates a window geometry from a position and dimension
+     *
+     * @param topLeft the top left point
+     * @param extent the extent
+     */
+    public WindowGeometry(Point topLeft, Dimension extent) {
+        this.topLeft = topLeft;
+        this.extent = extent;
+    }
+
+    /**
+     * Creates a window geometry from a rectangle
+     *
+     * @param rect the position
+     */
+    public WindowGeometry(Rectangle rect) {
+        this(rect.getLocation(), rect.getSize());
+    }
+
+    /**
+     * Creates a window geometry from the position and the size of a window.
+     *
+     * @param window the window
+     */
+    public WindowGeometry(Window window)  {
+        this(window.getLocationOnScreen(), window.getSize());
+    }
+
+    /**
+     * Creates a window geometry from the values kept in the preference store under the
+     * key <code>preferenceKey</code>
+     *
+     * @param preferenceKey the preference key
+     * @throws WindowGeometryException if no such key exist or if the preference value has
+     * an illegal format
+     */
+    public WindowGeometry(String preferenceKey) throws WindowGeometryException {
+        initFromPreferences(preferenceKey);
+    }
+
+    /**
+     * Creates a window geometry from the values kept in the preference store under the
+     * key <code>preferenceKey</code>. Falls back to the <code>defaultGeometry</code> if
+     * something goes wrong.
+     *
+     * @param preferenceKey the preference key
+     * @param defaultGeometry the default geometry
+     *
+     */
+    public WindowGeometry(String preferenceKey, WindowGeometry defaultGeometry) {
+        try {
+            initFromPreferences(preferenceKey);
+        } catch (WindowGeometryException e) {
+            if (Main.isDebugEnabled()) {
+                Main.debug(e.getMessage());
+            }
+            initFromWindowGeometry(defaultGeometry);
+        }
+    }
+
     /**
      * Replies a window geometry object for a window with a specific size which is
      * centered on screen, where main window is
@@ -84,49 +150,15 @@ public class WindowGeometry {
      * Exception thrown by the WindowGeometry class if something goes wrong
      */
     public static class WindowGeometryException extends Exception {
-        public WindowGeometryException(String message, Throwable cause) {
+        WindowGeometryException(String message, Throwable cause) {
             super(message, cause);
         }
 
-        public WindowGeometryException(String message) {
+        WindowGeometryException(String message) {
             super(message);
         }
     }
 
-    /** the top left point */
-    private Point topLeft;
-    /** the size */
-    private Dimension extent;
-
-    /**
-     * Creates a window geometry from a position and dimension
-     *
-     * @param topLeft the top left point
-     * @param extent the extent
-     */
-    public WindowGeometry(Point topLeft, Dimension extent) {
-        this.topLeft = topLeft;
-        this.extent = extent;
-    }
-
-    /**
-     * Creates a window geometry from a rectangle
-     *
-     * @param rect the position
-     */
-    public WindowGeometry(Rectangle rect) {
-        this(rect.getLocation(), rect.getSize());
-    }
-
-    /**
-     * Creates a window geometry from the position and the size of a window.
-     *
-     * @param window the window
-     */
-    public WindowGeometry(Window window)  {
-        this(window.getLocationOnScreen(), window.getSize());
-    }
-
     /**
      * Fixes a window geometry to shift to the correct screen.
      *
@@ -161,7 +193,7 @@ public class WindowGeometry {
                     tr("Preference with key ''{0}'' does not provide an int value for ''{1}''. Got {2}. " +
                        "Cannot restore window geometry from preferences.",
                             preferenceKey, field, v), e);
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             throw new WindowGeometryException(
                     tr("Failed to parse field ''{1}'' in preference with key ''{0}''. Exception was: {2}. " +
                        "Cannot restore window geometry from preferences.",
@@ -194,7 +226,8 @@ public class WindowGeometry {
             if (m.matches()) {
                 int w = Integer.parseInt(m.group(1));
                 int h = Integer.parseInt(m.group(2));
-                int x = screenDimension.x, y = screenDimension.y;
+                int x = screenDimension.x;
+                int y = screenDimension.y;
                 if (m.group(3) != null) {
                     x = Integer.parseInt(m.group(5));
                     y = Integer.parseInt(m.group(7));
@@ -223,41 +256,12 @@ public class WindowGeometry {
     }
 
     /**
-     * Creates a window geometry from the values kept in the preference store under the
-     * key <code>preferenceKey</code>
-     *
-     * @param preferenceKey the preference key
-     * @throws WindowGeometryException if no such key exist or if the preference value has
-     * an illegal format
-     */
-    public WindowGeometry(String preferenceKey) throws WindowGeometryException {
-        initFromPreferences(preferenceKey);
-    }
-
-    /**
-     * Creates a window geometry from the values kept in the preference store under the
-     * key <code>preferenceKey</code>. Falls back to the <code>defaultGeometry</code> if
-     * something goes wrong.
-     *
-     * @param preferenceKey the preference key
-     * @param defaultGeometry the default geometry
-     *
-     */
-    public WindowGeometry(String preferenceKey, WindowGeometry defaultGeometry) {
-        try {
-            initFromPreferences(preferenceKey);
-        } catch (WindowGeometryException e) {
-            initFromWindowGeometry(defaultGeometry);
-        }
-    }
-
-    /**
      * Remembers a window geometry under a specific preference key
      *
      * @param preferenceKey the preference key
      */
     public void remember(String preferenceKey) {
-        StringBuilder value = new StringBuilder();
+        StringBuilder value = new StringBuilder(32);
         value.append("x=").append(topLeft.x).append(",y=").append(topLeft.y)
              .append(",width=").append(extent.width).append(",height=").append(extent.height);
         Main.pref.put(preferenceKey, value.toString());
@@ -368,9 +372,11 @@ public class WindowGeometry {
     public static Rectangle getVirtualScreenBounds() {
         Rectangle virtualBounds = new Rectangle();
         GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
-        for (GraphicsDevice gd : ge.getScreenDevices()) {
-            if (gd.getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
-                virtualBounds = virtualBounds.union(gd.getDefaultConfiguration().getBounds());
+        if (!GraphicsEnvironment.isHeadless()) {
+            for (GraphicsDevice gd : ge.getScreenDevices()) {
+                if (gd.getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
+                    virtualBounds = virtualBounds.union(gd.getDefaultConfiguration().getBounds());
+                }
             }
         }
         return virtualBounds;
@@ -423,34 +429,35 @@ public class WindowGeometry {
      * @return bounds of the screen
      */
     private static Rectangle getScreenInfo(Rectangle g) {
-        GraphicsDevice[] gs = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
-        int intersect = 0;
         Rectangle bounds = null;
-        for (GraphicsDevice gd : gs) {
-            if (gd.getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
-                Rectangle b = gd.getDefaultConfiguration().getBounds();
-                if (b.height > 0 && b.width / b.height >= 3) /* multiscreen with wrong definition */ {
-                    b.width /= 2;
-                    Rectangle is = b.intersection(g);
-                    int s = is.width * is.height;
-                    if (bounds == null || intersect < s) {
-                        intersect = s;
-                        bounds = b;
-                    }
-                    b = new Rectangle(b);
-                    b.x += b.width;
-                    is = b.intersection(g);
-                    s = is.width * is.height;
-                    if (intersect < s) {
-                        intersect = s;
-                        bounds = b;
-                    }
-                } else {
-                    Rectangle is = b.intersection(g);
-                    int s = is.width * is.height;
-                    if (bounds == null || intersect < s) {
-                        intersect = s;
-                        bounds = b;
+        if (!GraphicsEnvironment.isHeadless()) {
+            int intersect = 0;
+            for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
+                if (gd.getType() == GraphicsDevice.TYPE_RASTER_SCREEN) {
+                    Rectangle b = gd.getDefaultConfiguration().getBounds();
+                    if (b.height > 0 && b.width / b.height >= 3) /* multiscreen with wrong definition */ {
+                        b.width /= 2;
+                        Rectangle is = b.intersection(g);
+                        int s = is.width * is.height;
+                        if (bounds == null || intersect < s) {
+                            intersect = s;
+                            bounds = b;
+                        }
+                        b = new Rectangle(b);
+                        b.x += b.width;
+                        is = b.intersection(g);
+                        s = is.width * is.height;
+                        if (intersect < s) {
+                            intersect = s;
+                            bounds = b;
+                        }
+                    } else {
+                        Rectangle is = b.intersection(g);
+                        int s = is.width * is.height;
+                        if (bounds == null || intersect < s) {
+                            intersect = s;
+                            bounds = b;
+                        }
                     }
                 }
             }
@@ -467,6 +474,35 @@ public class WindowGeometry {
     }
 
     @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((extent == null) ? 0 : extent.hashCode());
+        result = prime * result + ((topLeft == null) ? 0 : topLeft.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null || getClass() != obj.getClass())
+            return false;
+        WindowGeometry other = (WindowGeometry) obj;
+        if (extent == null) {
+            if (other.extent != null)
+                return false;
+        } else if (!extent.equals(other.extent))
+            return false;
+        if (topLeft == null) {
+            if (other.topLeft != null)
+                return false;
+        } else if (!topLeft.equals(other.topLeft))
+            return false;
+        return true;
+    }
+
+    @Override
     public String toString() {
         return "WindowGeometry{topLeft="+topLeft+",extent="+extent+'}';
     }
diff --git a/src/org/openstreetmap/josm/tools/XmlObjectParser.java b/src/org/openstreetmap/josm/tools/XmlObjectParser.java
index cbbf9da..9c3b8eb 100644
--- a/src/org/openstreetmap/josm/tools/XmlObjectParser.java
+++ b/src/org/openstreetmap/josm/tools/XmlObjectParser.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.HashMap;
@@ -82,8 +83,8 @@ public class XmlObjectParser implements Iterable<Object> {
             if (mapping.containsKey(qname)) {
                 Class<?> klass = mapping.get(qname).klass;
                 try {
-                    current.push(klass.newInstance());
-                } catch (Exception e) {
+                    current.push(klass.getConstructor().newInstance());
+                } catch (ReflectiveOperationException e) {
                     throwException(e);
                 }
                 for (int i = 0; i < a.getLength(); ++i) {
@@ -155,7 +156,7 @@ public class XmlObjectParser implements Iterable<Object> {
                         m.invoke(c, new Object[]{getValueForClass(m.getParameterTypes()[0], value)});
                     }
                 }
-            } catch (Exception e) {
+            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                 Main.error(e); // SAXException does not dump inner exceptions.
                 throwException(e);
             }
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReport.java b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
new file mode 100644
index 0000000..16758bf
--- /dev/null
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReport.java
@@ -0,0 +1,77 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools.bugreport;
+
+/**
+ * This class contains utility methods to create and handle a bug report.
+ * <p>
+ * It allows you to configure the format and request to send the bug report.
+ * <p>
+ * It also contains the main entry point for all components to use the bug report system: Call {@link #intercept(Throwable)} to start handling an
+ * exception.
+ * <h1> Handling Exceptions </h1>
+ * In your code, you should add try...catch blocks for any runtime exceptions that might happen. It is fine to catch throwable there.
+ * <p>
+ * You should then add some debug information there. This can be the OSM ids that caused the error, information on the data you were working on
+ * or other local variables. Make sure that no excpetions may occur while computing the values. It is best to send plain local variables to
+ * put(...). Then simply throw the throwable you got from the bug report. The global exception handler will do the rest.
+ * <pre>
+ * int id = ...;
+ * String tag = "...";
+ * try {
+ *   ... your code ...
+ * } catch (Throwable t) {
+ *   throw BugReport.intercept(t).put("id", id).put("tag", tag);
+ * }
+ * </pre>
+ *
+ * Instead of re-throwing, you can call {@link ReportedException#warn()}. This will display a warning to the user and allow it to either report
+ * the execption or ignore it.
+ *
+ * @author Michael Zangl
+ * @since 10285
+ */
+public 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) {
+        // TODO: Use this class to create the bug report.
+    }
+
+    /**
+     * This should be called whenever you want to add more information to a given exception.
+     * @param t The throwable that was thrown.
+     * @return A {@link ReportedException} to which you can add additional information.
+     */
+    public static ReportedException intercept(Throwable t) {
+        ReportedException e;
+        if (t instanceof ReportedException) {
+            e = (ReportedException) t;
+        } else {
+            e = new ReportedException(t);
+        }
+        e.startSection(getCallingMethod(2));
+        return e;
+    }
+
+    /**
+     * Find the method that called us.
+     *
+     * @param offset
+     *            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) {
+        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
+        String className = BugReport.class.getName();
+        for (int i = 0; i < stackTrace.length - offset; i++) {
+            StackTraceElement element = stackTrace[i];
+            if (className.equals(element.getClassName()) && "getCallingMethod".equals(element.getMethodName())) {
+                StackTraceElement toReturn = stackTrace[i + offset];
+                return toReturn.getClassName().replaceFirst(".*\\.", "") + '#' + toReturn.getMethodName();
+            }
+        }
+        return "?";
+    }
+}
diff --git a/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java b/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
index a90e9c0..054eca0 100644
--- a/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
+++ b/src/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandler.java
@@ -143,7 +143,7 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
                 try {
                     JPanel p = buildPanel(e);
                     JOptionPane.showMessageDialog(Main.parent, p, tr("You have encountered a bug in JOSM"), JOptionPane.ERROR_MESSAGE);
-                } catch (Exception ex) {
+                } catch (RuntimeException ex) {
                     Main.error(ex);
                 }
             }
@@ -165,7 +165,7 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
      * Handles the given exception
      * @param e the exception
      */
-    public static void handleException(final Throwable e) {
+    public static synchronized void handleException(final Throwable e) {
         if (handlingInProgress || suppressExceptionDialogs)
             return;                  // we do not handle secondary exceptions, this gets too messy
         if (bugReporterThread != null && bugReporterThread.isAlive())
@@ -197,7 +197,14 @@ public final class BugReportExceptionHandler implements Thread.UncaughtException
 
     static JPanel buildPanel(final Throwable e) {
         StringWriter stack = new StringWriter();
-        e.printStackTrace(new PrintWriter(stack));
+        PrintWriter writer = new PrintWriter(stack);
+        if (e instanceof ReportedException) {
+            // Temporary!
+            ((ReportedException) e).printReportDataTo(writer);
+            ((ReportedException) e).printReportStackTo(writer);
+        } else {
+            e.printStackTrace(writer);
+        }
 
         String text = ShowStatusReportAction.getReportHeader() + stack.getBuffer().toString();
         text = text.replaceAll("\r", "");
diff --git a/src/org/openstreetmap/josm/tools/bugreport/ReportedException.java b/src/org/openstreetmap/josm/tools/bugreport/ReportedException.java
new file mode 100644
index 0000000..41bf1ba
--- /dev/null
+++ b/src/org/openstreetmap/josm/tools/bugreport/ReportedException.java
@@ -0,0 +1,284 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools.bugreport;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * This is a special exception that cannot be directly thrown.
+ * <p>
+ * It is used to capture more information about an exception that was already thrown.
+ *
+ * @author Michael Zangl
+ * @see BugReport
+ * @since 10285
+ */
+public class ReportedException extends RuntimeException {
+    private static final int MAX_COLLECTION_ENTRIES = 30;
+    /**
+     *
+     */
+    private static final long serialVersionUID = 737333873766201033L;
+    /**
+     * We capture all stack traces on exception creation. This allows us to trace synchonization problems better. We cannot be really sure what
+     * happened but we at least see which threads
+     */
+    private final transient Map<Thread, StackTraceElement[]> allStackTraces;
+    private final transient LinkedList<Section> sections = new LinkedList<>();
+    private final transient Thread caughtOnThread;
+    private final Throwable exception;
+    private String methodWarningFrom;
+
+    ReportedException(Throwable exception) {
+        this(exception, Thread.currentThread());
+    }
+
+    ReportedException(Throwable exception, Thread caughtOnThread) {
+        super(exception);
+        this.exception = exception;
+
+        allStackTraces = Thread.getAllStackTraces();
+        this.caughtOnThread = caughtOnThread;
+    }
+
+    /**
+     * Displays a warning for this exception. The program can then continue normally. Does not block.
+     */
+    public void warn() {
+        methodWarningFrom = BugReport.getCallingMethod(2);
+        // TODO: Open the dialog.
+    }
+
+    /**
+     * Starts a new debug data section. This normally does not need to be called manually.
+     *
+     * @param sectionName
+     *            The section name.
+     */
+    public void startSection(String sectionName) {
+        sections.add(new Section(sectionName));
+    }
+
+    /**
+     * Prints the captured data of this report to a {@link PrintWriter}.
+     *
+     * @param out
+     *            The writer to print to.
+     */
+    public void printReportDataTo(PrintWriter out) {
+        out.println("=== REPORTED CRASH DATA ===");
+        for (Section s : sections) {
+            s.printSection(out);
+            out.println();
+        }
+
+        if (methodWarningFrom != null) {
+            out.println("Warning issued by: " + methodWarningFrom);
+            out.println();
+        }
+    }
+
+    /**
+     * Prints the stack trace of this report to a {@link PrintWriter}.
+     *
+     * @param out
+     *            The writer to print to.
+     */
+    public void printReportStackTo(PrintWriter out) {
+        out.println("=== STACK TRACE ===");
+        out.println(niceThreadName(caughtOnThread));
+        getCause().printStackTrace(out);
+        out.println();
+    }
+
+    /**
+     * Prints the stack traces for other threads of this report to a {@link PrintWriter}.
+     *
+     * @param out
+     *            The writer to print to.
+     */
+    public void printReportThreadsTo(PrintWriter out) {
+        out.println("=== RUNNING THREADS ===");
+        for (Entry<Thread, StackTraceElement[]> thread : allStackTraces.entrySet()) {
+            out.println(niceThreadName(thread.getKey()));
+            if (caughtOnThread.equals(thread.getKey())) {
+                out.println("Stacktrace see above.");
+            } else {
+                for (StackTraceElement e : thread.getValue()) {
+                    out.println(e);
+                }
+            }
+            out.println();
+        }
+    }
+
+    private static String niceThreadName(Thread thread) {
+        String name = "Thread: " + thread.getName() + " (" + thread.getId() + ')';
+        ThreadGroup threadGroup = thread.getThreadGroup();
+        if (threadGroup != null) {
+            name += " of " + threadGroup.getName();
+        }
+        return name;
+    }
+
+    /**
+     * Checks if this exception is considered the same as an other exception. This is the case if both have the same cause and message.
+     *
+     * @param e
+     *            The exception to check against.
+     * @return <code>true</code> if they are considered the same.
+     */
+    public boolean isSame(ReportedException e) {
+        if (!getMessage().equals(e.getMessage())) {
+            return false;
+        }
+
+        Set<Throwable> dejaVu = Collections.newSetFromMap(new IdentityHashMap<Throwable, Boolean>());
+        return hasSameStackTrace(dejaVu, this.exception, e.exception);
+    }
+
+    private static boolean hasSameStackTrace(Set<Throwable> dejaVu, Throwable e1, Throwable e2) {
+        if (dejaVu.contains(e1)) {
+            // cycle. If it was the same until here, we assume both have that cycle.
+            return true;
+        }
+        dejaVu.add(e1);
+
+        StackTraceElement[] t1 = e1.getStackTrace();
+        StackTraceElement[] t2 = e2.getStackTrace();
+
+        if (!Arrays.equals(t1, t2)) {
+            return false;
+        }
+
+        Throwable c1 = e1.getCause();
+        Throwable c2 = e2.getCause();
+        if ((c1 == null) != (c2 == null)) {
+            return false;
+        } else if (c1 != null) {
+            return hasSameStackTrace(dejaVu, c1, c2);
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Adds some debug values to this exception.
+     *
+     * @param key
+     *            The key to add this for. Does not need to be unique but it would be nice.
+     * @param value
+     *            The value.
+     * @return This exception for easy chaining.
+     */
+    public ReportedException put(String key, Object value) {
+        String string;
+        try {
+            if (value == null) {
+                string = "null";
+            } else if (value instanceof Collection) {
+                string = makeCollectionNice((Collection<?>) value);
+            } else if (value.getClass().isArray()) {
+                string = makeCollectionNice(Arrays.asList(value));
+            } else {
+                string = value.toString();
+            }
+        } catch (RuntimeException t) {
+            Main.warn(t);
+            string = "<Error calling toString()>";
+        }
+        sections.getLast().put(key, string);
+        return this;
+    }
+
+    private static String makeCollectionNice(Collection<?> value) {
+        int lines = 0;
+        StringBuilder str = new StringBuilder();
+        for (Object e : value) {
+            str.append("\n    - ");
+            if (lines <= MAX_COLLECTION_ENTRIES) {
+                str.append(e);
+            } else {
+                str.append("\n    ... (");
+                str.append(value.size());
+                str.append(" entries)");
+                break;
+            }
+        }
+        return str.toString();
+    }
+
+    @Override
+    public String toString() {
+        return new StringBuilder(48)
+            .append("CrashReportedException [on thread ")
+            .append(caughtOnThread)
+            .append(']')
+            .toString();
+    }
+
+    private static class SectionEntry {
+        private final String key;
+        private final String value;
+
+        SectionEntry(String key, String value) {
+            this.key = key;
+            this.value = value;
+        }
+
+        /**
+         * Prints this entry to the output stream in a line.
+         * @param out The stream to print to.
+         */
+        public void print(PrintWriter out) {
+            out.print(" - ");
+            out.print(key);
+            out.print(": ");
+            out.println(value);
+        }
+    }
+
+    private static class Section {
+
+        private String sectionName;
+        private ArrayList<SectionEntry> entries = new ArrayList<>();
+
+        Section(String sectionName) {
+            this.sectionName = sectionName;
+        }
+
+        /**
+         * Add a key/value entry to this section.
+         * @param key The key. Need not be unique.
+         * @param value The value.
+         */
+        public void put(String key, String value) {
+            entries.add(new SectionEntry(key, value));
+        }
+
+        /**
+         * Prints this section to the output stream.
+         * @param out The stream to print to.
+         */
+        public void printSection(PrintWriter out) {
+            out.println(sectionName + ':');
+            if (entries.isEmpty()) {
+                out.println("No data collected.");
+            } else {
+                for (SectionEntry e : entries) {
+                    e.print(out);
+                }
+            }
+        }
+    }
+}
diff --git a/src/org/openstreetmap/josm/tools/date/DateUtils.java b/src/org/openstreetmap/josm/tools/date/DateUtils.java
index 9fe1fd3..b956925 100644
--- a/src/org/openstreetmap/josm/tools/date/DateUtils.java
+++ b/src/org/openstreetmap/josm/tools/date/DateUtils.java
@@ -135,7 +135,7 @@ public final class DateUtils {
 
         try {
             return XML_DATE.newXMLGregorianCalendar(str).toGregorianCalendar().getTimeInMillis();
-        } catch (Exception ex) {
+        } catch (IllegalArgumentException ex) {
             throw new UncheckedParseException("The date string (" + str + ") could not be parsed.", ex);
         }
     }
diff --git a/styles/standard/elemstyles.mapcss b/styles/standard/elemstyles.mapcss
index e8c9452..6beb051 100644
--- a/styles/standard/elemstyles.mapcss
+++ b/styles/standard/elemstyles.mapcss
@@ -4655,8 +4655,9 @@ node|z16-17[setting("hide_icons")][place=locality] {
     text: auto;
 }
 
+node|z-18,area|z-18 { font-size: 8; }
 node|z19,area|z19   { font-size: 9; }
-node|z20-,area|z20-   { font-size: 10; }
+node|z20-,area|z20- { font-size: 11; }
 
 /*******************/
 /* way text labels */
diff --git a/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java b/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
index 4401fb6..39fd1e6 100644
--- a/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
@@ -17,6 +17,7 @@ import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.ArrayList;
+import java.util.Locale;
 import java.util.logging.Logger;
 
 import org.junit.Before;
@@ -150,7 +151,7 @@ public class MultiFetchServerObjectReaderTest {
                 MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
 
         String p = System.getProperties().getProperty("useCachedDataset");
-        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
+        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase(Locale.ENGLISH))) {
             logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
             return;
         }
diff --git a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
index 9860573..eb293b5 100644
--- a/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
+++ b/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
@@ -17,6 +17,7 @@ import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.HashSet;
+import java.util.Locale;
 import java.util.Set;
 import java.util.logging.Logger;
 
@@ -168,7 +169,7 @@ public class OsmServerBackreferenceReaderTest {
                 MultiFetchServerObjectReaderTest.class.getName() + ".dataset");
 
         String p = System.getProperty("useCachedDataset");
-        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase())) {
+        if (p != null && Boolean.parseBoolean(p.trim().toLowerCase(Locale.ENGLISH))) {
             logger.info(MessageFormat.format("property ''{0}'' set, using cached dataset", "useCachedDataset"));
             return;
         }
@@ -515,23 +516,18 @@ public class OsmServerBackreferenceReaderTest {
         reader.setReadFull(true);
         DataSet referers = reader.parseOsm(NullProgressMonitor.INSTANCE);
 
-        Set<Long> referringRelationsIds = new HashSet<>();
         r = lookupRelation(referers, 6);
         assertNotNull(r);
         assertFalse(r.isIncomplete());
-        referringRelationsIds.add(r.getId());
         r = lookupRelation(referers, 7);
         assertNotNull(r);
         assertFalse(r.isIncomplete());
-        referringRelationsIds.add(r.getId());
         r = lookupRelation(referers, 8);
         assertNotNull(r);
         assertFalse(r.isIncomplete());
-        referringRelationsIds.add(r.getId());
         r = lookupRelation(referers, 9);
         assertNotNull(r);
         assertFalse(r.isIncomplete());
-        referringRelationsIds.add(r.getId());
 
         // all relations are fully loaded
         //
diff --git a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
index c007225..63e4e75 100644
--- a/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
+++ b/test/functional/org/openstreetmap/josm/io/UploadStrategySelectionPanelTest.java
@@ -19,7 +19,7 @@ import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 @Ignore
 public class UploadStrategySelectionPanelTest extends JFrame {
 
-    private UploadStrategySelectionPanel uploadStrategySelectionPanel;
+    protected UploadStrategySelectionPanel uploadStrategySelectionPanel;
 
     protected void build()  {
         getContentPane().setLayout(new BorderLayout());
@@ -36,7 +36,8 @@ public class UploadStrategySelectionPanelTest extends JFrame {
         pnl.add(tf = new JTextField(8));
         tf.addActionListener(
                 new ActionListener() {
-                    public void actionPerformed(ActionEvent arg0) {
+                    @Override
+                    public void actionPerformed(ActionEvent ae) {
                         int n = 0;
                         try {
                             n = Integer.parseInt(tf.getText());
diff --git a/test/performance/org/openstreetmap/josm/data/osm/KeyValuePerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/KeyValuePerformanceTest.java
index 2f5a6c9..23b8557 100644
--- a/test/performance/org/openstreetmap/josm/data/osm/KeyValuePerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/data/osm/KeyValuePerformanceTest.java
@@ -20,6 +20,8 @@ import org.openstreetmap.josm.PerformanceTestUtils;
 import org.openstreetmap.josm.PerformanceTestUtils.PerformanceTestTimer;
 import org.openstreetmap.josm.data.osm.OsmDataGenerator.KeyValueDataGenerator;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This test measures the performance of {@link OsmPrimitive#get(String)} and related.
  * @author Michael Zangl
@@ -37,6 +39,7 @@ public class KeyValuePerformanceTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15*60);
 
     /**
@@ -51,7 +54,8 @@ public class KeyValuePerformanceTest {
      * See if there is a big difference between Strings that are interned and those that are not.
      */
     @Test
-    public void meassureStringEqualsIntern() {
+    @SuppressFBWarnings(value = "DM_STRING_CTOR", justification = "test Strings that are interned and those that are not")
+    public void measureStringEqualsIntern() {
         String str1Interned = "string1";
         String str1InternedB = "string1";
         String str1 = new String(str1Interned);
@@ -195,6 +199,7 @@ public class KeyValuePerformanceTest {
      * Measure the speed of {@link OsmPrimitive#getKeys()}.get(key)
      */
     @Test
+    @SuppressFBWarnings(value = "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT")
     public void testKeyValueGetKeysGet() {
         for (double tagNodeRatio : TAG_NODE_RATIOS) {
             KeyValueDataGenerator generator = OsmDataGenerator.getKeyValue(tagNodeRatio);
diff --git a/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
index 36bd03c..b9c2160 100644
--- a/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/data/osm/RoundingPerformanceTest.java
@@ -7,6 +7,8 @@ import org.junit.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.LatLonTest;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Checks that rounding of coordinates is not too slow.
  */
@@ -21,6 +23,7 @@ public class RoundingPerformanceTest {
      * Checks that rounding of coordinates is not too slow.
      */
     @Test
+    @SuppressFBWarnings(value = "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT")
     public void test() {
         final int n = 1000000;
         long start = System.nanoTime();
diff --git a/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRendererPerformanceTestParent.java
similarity index 76%
copy from test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java
copy to test/performance/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRendererPerformanceTestParent.java
index 602b1aa..569c6a0 100644
--- a/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRendererPerformanceTestParent.java
@@ -11,7 +11,6 @@ import java.io.InputStream;
 
 import javax.imageio.ImageIO;
 
-import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.Timeout;
@@ -20,19 +19,26 @@ import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmReader;
 
-public class StyledMapRendererPerformanceTest {
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Abstract superclass of {@code StyledMapRendererPerformanceTest} and {@code WireframeMapRendererPerformanceTest}.
+ */
+public abstract class AbstractMapRendererPerformanceTestParent {
 
     private static final int IMG_WIDTH = 1400;
     private static final int IMG_HEIGHT = 1050;
 
-    private static Graphics2D g;
-    private static BufferedImage img;
-    private static NavigatableComponent nc;
+    @SuppressFBWarnings(value = "MS_PKGPROTECT")
+    protected static Graphics2D g;
+    @SuppressFBWarnings(value = "MS_PKGPROTECT")
+    protected static BufferedImage img;
+    @SuppressFBWarnings(value = "MS_PKGPROTECT")
+    protected static NavigatableComponent nc;
     private static DataSet dsRestriction;
     private static DataSet dsMultipolygon;
     private static DataSet dsCity;
@@ -41,10 +47,10 @@ public class StyledMapRendererPerformanceTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15*60);
 
-    @BeforeClass
-    public static void load() throws Exception {
+    protected static void load() throws Exception {
         JOSMFixture.createPerformanceTestFixture().init(true);
         img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
         g = (Graphics2D) img.getGraphics();
@@ -54,9 +60,6 @@ public class StyledMapRendererPerformanceTest {
         nc = Main.map.mapView;
         nc.setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
 
-        // TODO Test should have it's own copy of styles because change in style can influence performance
-        MapPaintStyles.readFromPreferences();
-
         try (
             InputStream fisR = new FileInputStream("data_nodist/restriction.osm");
             InputStream fisM = new FileInputStream("data_nodist/multipolygon.osm");
@@ -68,8 +71,10 @@ public class StyledMapRendererPerformanceTest {
         }
     }
 
-    private static void test(int iterations, DataSet ds, Bounds bounds) throws Exception {
-        Rendering visitor = new StyledMapRenderer(g, nc, false);
+    protected abstract Rendering buildRenderer();
+
+    protected final void test(int iterations, DataSet ds, Bounds bounds) throws Exception {
+        Rendering visitor = buildRenderer();
         nc.zoomTo(bounds);
         for (int i = 0; i < iterations; i++) {
             visitor.render(ds, true, bounds);
@@ -121,9 +126,12 @@ public class StyledMapRendererPerformanceTest {
         test(200, dsCity, new Bounds(53.56, 13.295, 53.57, 13.30));
     }
 
-    /** run this manually to verify that the rendering is set up properly */
+    /**
+     * run this manually to verify that the rendering is set up properly
+     * @throws IOException if any I/O error occurs
+     */
+    @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD")
     private void dumpRenderedImage() throws IOException {
-        File outputfile = new File("test-neubrandenburg.png");
-        ImageIO.write(img, "png", outputfile);
+        ImageIO.write(img, "png", new File("test-neubrandenburg.png"));
     }
 }
diff --git a/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java
index 602b1aa..018bfd0 100644
--- a/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRendererPerformanceTest.java
@@ -1,129 +1,39 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.osm.visitor.paint;
 
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 
 import javax.imageio.ImageIO;
 
 import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.Timeout;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.io.Compression;
-import org.openstreetmap.josm.io.OsmReader;
 
-public class StyledMapRendererPerformanceTest {
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
-    private static final int IMG_WIDTH = 1400;
-    private static final int IMG_HEIGHT = 1050;
-
-    private static Graphics2D g;
-    private static BufferedImage img;
-    private static NavigatableComponent nc;
-    private static DataSet dsRestriction;
-    private static DataSet dsMultipolygon;
-    private static DataSet dsCity;
-
-    /**
-     * Global timeout applied to all test methods.
-     */
-    @Rule
-    public Timeout globalTimeout = Timeout.seconds(15*60);
+/**
+ * Performance test of {@code StyledMapRenderer}.
+ */
+public class StyledMapRendererPerformanceTest extends AbstractMapRendererPerformanceTestParent {
 
     @BeforeClass
     public static void load() throws Exception {
-        JOSMFixture.createPerformanceTestFixture().init(true);
-        img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-        g = (Graphics2D) img.getGraphics();
-        g.setClip(0, 0, IMG_WIDTH, IMG_WIDTH);
-        g.setColor(Color.BLACK);
-        g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH);
-        nc = Main.map.mapView;
-        nc.setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT);
-
+        AbstractMapRendererPerformanceTestParent.load();
         // TODO Test should have it's own copy of styles because change in style can influence performance
         MapPaintStyles.readFromPreferences();
-
-        try (
-            InputStream fisR = new FileInputStream("data_nodist/restriction.osm");
-            InputStream fisM = new FileInputStream("data_nodist/multipolygon.osm");
-            InputStream fisC = Compression.getUncompressedFileInputStream(new File("data_nodist/neubrandenburg.osm.bz2"));
-        ) {
-            dsRestriction = OsmReader.parseDataSet(fisR, NullProgressMonitor.INSTANCE);
-            dsMultipolygon = OsmReader.parseDataSet(fisM, NullProgressMonitor.INSTANCE);
-            dsCity = OsmReader.parseDataSet(fisC, NullProgressMonitor.INSTANCE);
-        }
-    }
-
-    private static void test(int iterations, DataSet ds, Bounds bounds) throws Exception {
-        Rendering visitor = new StyledMapRenderer(g, nc, false);
-        nc.zoomTo(bounds);
-        for (int i = 0; i < iterations; i++) {
-            visitor.render(ds, true, bounds);
-        }
-    }
-
-    @Test
-    public void testRestriction() throws Exception {
-        test(700, dsRestriction, new Bounds(51.12, 14.147472381591795, 51.128, 14.162492752075195));
-    }
-
-    @Test
-    public void testRestrictionSmall() throws Exception {
-        test(1500, dsRestriction, new Bounds(51.125, 14.147, 51.128, 14.152));
-    }
-
-    @Test
-    public void testMultipolygon() throws Exception {
-        test(400, dsMultipolygon, new Bounds(60, -180, 85, -122));
-    }
-
-    @Test
-    public void testMultipolygonSmall() throws Exception {
-        test(850, dsMultipolygon, new Bounds(-90, -180, 90, 180));
-    }
-
-    @Test
-    public void testCity() throws Exception {
-        test(50, dsCity, new Bounds(53.51, 13.20, 53.59, 13.34));
-    }
-
-    @Test
-    public void testCitySmall() throws Exception {
-        test(70, dsCity, new Bounds(52, 11, 55, 14));
     }
 
-    @Test
-    public void testCityPart1() throws Exception {
-        test(250, dsCity, new Bounds(53.56, 13.25, 53.57, 13.26));
+    @Override
+    protected Rendering buildRenderer() {
+        return new StyledMapRenderer(g, nc, false);
     }
 
-    @Test
-    public void testCityPart2() throws Exception {
-        test(200, dsCity, new Bounds(53.55, 13.29, 53.57, 13.30));
-    }
-
-    @Test
-    public void testCitySmallPart2() throws Exception {
-        test(200, dsCity, new Bounds(53.56, 13.295, 53.57, 13.30));
-    }
-
-    /** run this manually to verify that the rendering is set up properly */
+    /**
+     * run this manually to verify that the rendering is set up properly
+     * @throws IOException if any I/O error occurs
+     */
+    @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD")
     private void dumpRenderedImage() throws IOException {
-        File outputfile = new File("test-neubrandenburg.png");
-        ImageIO.write(img, "png", outputfile);
+        ImageIO.write(img, "png", new File("test-neubrandenburg.png"));
     }
 }
diff --git a/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRendererPerformanceTest.java b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRendererPerformanceTest.java
new file mode 100644
index 0000000..75f74d3
--- /dev/null
+++ b/test/performance/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRendererPerformanceTest.java
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.visitor.paint;
+
+import org.junit.BeforeClass;
+
+/**
+ * Performance test of {@code WireframeMapRenderer}.
+ */
+public class WireframeMapRendererPerformanceTest extends AbstractMapRendererPerformanceTestParent {
+
+    @BeforeClass
+    public static void load() throws Exception {
+        AbstractMapRendererPerformanceTestParent.load();
+    }
+
+    @Override
+    protected Rendering buildRenderer() {
+        return new WireframeMapRenderer(g, nc, false);
+    }
+}
diff --git a/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java b/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
index 3e6f51f..8357e65 100644
--- a/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
@@ -11,6 +11,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.imageio.ImageIO;
@@ -40,6 +41,8 @@ import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.Compression;
 import org.openstreetmap.josm.io.OsmReader;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 public class MapRendererPerformanceTest {
 
     private static final boolean DUMP_IMAGE = false; // dump images to file for debugging purpose
@@ -64,7 +67,7 @@ public class MapRendererPerformanceTest {
     private enum Feature {
         ICON, SYMBOL, NODE_TEXT, LINE, LINE_TEXT, AREA;
         public String label() {
-            return name().toLowerCase();
+            return name().toLowerCase(Locale.ENGLISH);
         }
     }
 
@@ -74,6 +77,7 @@ public class MapRendererPerformanceTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15*60);
 
     @BeforeClass
@@ -170,6 +174,7 @@ public class MapRendererPerformanceTest {
         private final List<Long> drawTimes = new ArrayList<>();
         private final List<Long> totalTimes = new ArrayList<>();
 
+        @SuppressFBWarnings(value = "DM_GC")
         public void run() throws IOException {
             boolean checkScale = false;
             if (scale == 0) {
@@ -313,7 +318,7 @@ public class MapRendererPerformanceTest {
     }
 
     public static void dumpTimes(StyledMapRenderer.BenchmarkData bd) {
-        System.out.print(String.format("gen. %3d, sort %3d, draw %3d\n", bd.generateTime, bd.sortTime, bd.drawTime));
+        System.out.print(String.format("gen. %3d, sort %3d, draw %3d%n", bd.generateTime, bd.sortTime, bd.drawTime));
     }
 
     public static void dumpElementCount(StyledMapRenderer.BenchmarkData bd) {
diff --git a/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java b/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java
index 9c9f31c..9f7a24a 100644
--- a/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java
+++ b/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSourceFilterTest.java
@@ -12,6 +12,8 @@ import org.openstreetmap.josm.data.osm.OsmDataGenerator;
 import org.openstreetmap.josm.data.osm.OsmDataGenerator.KeyValueDataGenerator;
 import org.openstreetmap.josm.gui.mappaint.MultiCascade;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Tests how fast {@link MapCSSStyleSource} finds the right style candidates for one object.
  * @author Michael Zangl
@@ -20,7 +22,7 @@ public class MapCSSStyleSourceFilterTest {
 
     private static final int TEST_RULE_COUNT = 10000;
 
-    private class CssGenerator {
+    private static class CssGenerator {
         StringBuilder sb = new StringBuilder();
         private KeyValueDataGenerator generator;
 
@@ -82,6 +84,7 @@ public class MapCSSStyleSourceFilterTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15*60);
 
     /**
diff --git a/test/performance/org/openstreetmap/josm/io/OsmReaderPerformanceTest.java b/test/performance/org/openstreetmap/josm/io/OsmReaderPerformanceTest.java
index 384b1c8..8fe0558 100644
--- a/test/performance/org/openstreetmap/josm/io/OsmReaderPerformanceTest.java
+++ b/test/performance/org/openstreetmap/josm/io/OsmReaderPerformanceTest.java
@@ -19,6 +19,8 @@ import org.openstreetmap.josm.PerformanceTestUtils;
 import org.openstreetmap.josm.PerformanceTestUtils.PerformanceTestTimer;
 import org.openstreetmap.josm.data.osm.DataSet;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * This test tests how fast we are at reading an OSM file.
  * <p>
@@ -34,6 +36,7 @@ public class OsmReaderPerformanceTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15*60);
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/JOSMFixture.java b/test/unit/org/openstreetmap/josm/JOSMFixture.java
index d80f69f..ab38a03 100644
--- a/test/unit/org/openstreetmap/josm/JOSMFixture.java
+++ b/test/unit/org/openstreetmap/josm/JOSMFixture.java
@@ -6,7 +6,9 @@ import static org.junit.Assert.fail;
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.Paths;
+import java.security.GeneralSecurityException;
 import java.text.MessageFormat;
+import java.util.Locale;
 
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -96,7 +98,7 @@ public class JOSMFixture {
 
         try {
             CertificateAmendment.addMissingCertificates();
-        } catch (IOException ex) {
+        } catch (IOException | GeneralSecurityException ex) {
             throw new RuntimeException(ex);
         }
 
@@ -105,7 +107,7 @@ public class JOSMFixture {
 
         // make sure we don't upload to or test against production
         //
-        String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase().trim();
+        String url = OsmApi.getOsmApi().getBaseUrl().toLowerCase(Locale.ENGLISH).trim();
         if (url.startsWith("http://www.openstreetmap.org") || url.startsWith("http://api.openstreetmap.org")
             || url.startsWith("https://www.openstreetmap.org") || url.startsWith("https://api.openstreetmap.org")) {
             fail(MessageFormat.format("configured server url ''{0}'' seems to be a productive url, aborting.", url));
diff --git a/test/unit/org/openstreetmap/josm/MainTest.java b/test/unit/org/openstreetmap/josm/MainTest.java
index 52c42c7..3e6f015 100644
--- a/test/unit/org/openstreetmap/josm/MainTest.java
+++ b/test/unit/org/openstreetmap/josm/MainTest.java
@@ -6,10 +6,17 @@ 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;
 
 /**
  * Unit tests of {@link Main} class.
@@ -17,6 +24,14 @@ import org.openstreetmap.josm.Main.DownloadParamType;
 public class MainTest {
 
     /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
      * Unit test of {@link DownloadParamType#paramType} method.
      */
     @Test
@@ -30,9 +45,20 @@ public class MainTest {
     }
 
     /**
+     * Unit test of {@code Main#preConstructorInit}.
+     */
+    @Test
+    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);
+    }
+
+    /**
      * Unit tests on log messages.
      */
     @Test
+    @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     public void testLogs() {
 
         assertNull(Main.getErrorMessage(null));
diff --git a/test/unit/org/openstreetmap/josm/TestUtils.java b/test/unit/org/openstreetmap/josm/TestUtils.java
index be6fb35..453b503 100644
--- a/test/unit/org/openstreetmap/josm/TestUtils.java
+++ b/test/unit/org/openstreetmap/josm/TestUtils.java
@@ -46,6 +46,8 @@ import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressTaskId;
 import org.openstreetmap.josm.io.Compression;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Various utils, useful for unit tests.
  */
@@ -104,6 +106,7 @@ public final class TestUtils {
      * @param comparator The comparator to test
      * @param array The array sorted for test purpose
      */
+    @SuppressFBWarnings(value = "RV_NEGATING_RESULT_OF_COMPARETO")
     public static <T> void checkComparableContract(Comparator<T> comparator, T[] array) {
         System.out.println("Validating Comparable contract on array of "+array.length+" elements");
         // Check each compare possibility
diff --git a/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java b/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
index 95d1f4e..da3a1f8 100644
--- a/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/AddImageryLayerActionTest.java
@@ -52,7 +52,7 @@ public final class AddImageryLayerActionTest {
         assertEquals(1, tmsLayers.size());
 
         try {
-            new AddImageryLayerAction(new ImageryInfo("osm-wms.de", "http://129.206.228.72/cached/osm?",
+            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);
             assertEquals(1, wmsLayers.size());
diff --git a/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java b/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
index c73dafe..ee1d0be 100644
--- a/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/CreateCircleActionTest.java
@@ -29,6 +29,7 @@ import org.openstreetmap.josm.tools.GeoPropertyIndex;
 import org.openstreetmap.josm.tools.GeoPropertyIndex.GeoProperty;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.RightAndLefthandTraffic;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Unit tests for class {@link CreateCircleAction}.
@@ -58,9 +59,9 @@ public final class CreateCircleActionTest {
             Method method = ds.getClass()
                 .getDeclaredMethod("addSelected",
                                    new Class<?>[] {Collection.class, boolean.class});
-            method.setAccessible(true);
+            Utils.setObjectsAccessible(method);
             method.invoke(ds, Collections.singleton(p), false);
-        } catch (Exception e) {
+        } catch (ReflectiveOperationException e) {
             e.printStackTrace();
             fail("Can't add OsmPrimitive to dataset: " + e.getMessage());
         }
@@ -156,13 +157,11 @@ public final class CreateCircleActionTest {
         try {
             Field leftHandTrafficPolygons = RightAndLefthandTraffic.class
                 .getDeclaredField("leftHandTrafficPolygons");
-            leftHandTrafficPolygons.setAccessible(true);
-            leftHandTrafficPolygons.set(null, new ArrayList<Area>());
             Field rlCache = RightAndLefthandTraffic.class.getDeclaredField("rlCache");
-            rlCache.setAccessible(true);
-            ConstantTrafficHand trafficHand = new ConstantTrafficHand(true);
-            rlCache.set(null, new GeoPropertyIndex<Boolean>(trafficHand, 24));
-        } catch (Exception e) {
+            Utils.setObjectsAccessible(leftHandTrafficPolygons, rlCache);
+            leftHandTrafficPolygons.set(null, new ArrayList<Area>());
+            rlCache.set(null, new GeoPropertyIndex<>(new ConstantTrafficHand(true), 24));
+        } catch (ReflectiveOperationException e) {
             e.printStackTrace();
             fail("Impossible to mock left/right hand database: " + e.getMessage());
         }
diff --git a/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java b/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java
index 39e5ccc..efc7fa6 100644
--- a/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/ExtensionFileFilterTest.java
@@ -1,15 +1,41 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.actions;
 
-import nl.jqno.equalsverifier.EqualsVerifier;
+import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 /**
  * Unit tests for class {@link ExtensionFileFilter}.
  */
 public class ExtensionFileFilterTest {
 
+    private static void test(String extensions, String defaultExtension, String description, boolean addArchiveExtensionsToDescription,
+            String expectedExtensions, String expectedDescription) {
+        ExtensionFileFilter ext = ExtensionFileFilter.newFilterWithArchiveExtensions(
+                extensions, defaultExtension, description, addArchiveExtensionsToDescription);
+        assertEquals(expectedExtensions, ext.getExtensions());
+        assertEquals(defaultExtension, ext.getDefaultExtension());
+        assertEquals(expectedDescription, ext.getDescription());
+    }
+
+    /**
+     * Unit test of method {@link ExtensionFileFilter#newFilterWithArchiveExtensions}.
+     */
+    @Test
+    public void testNewFilterWithArchiveExtensions() {
+        test("ext1", "ext1", "description", true,
+                "ext1,ext1.gz,ext1.bz2", "description (*.ext1, *.ext1.gz, *.ext1.bz2)");
+        test("ext1", "ext1", "description", false,
+                "ext1,ext1.gz,ext1.bz2", "description (*.ext1)");
+        test("ext1,ext2", "ext1", "description", true,
+                "ext1,ext1.gz,ext1.bz2,ext2,ext2.gz,ext2.bz2", "description (*.ext1, *.ext1.gz, *.ext1.bz2, *.ext2, *.ext2.gz, *.ext2.bz2)");
+        test("ext1,ext2", "ext1", "description", false,
+                "ext1,ext1.gz,ext1.bz2,ext2,ext2.gz,ext2.bz2", "description (*.ext1, *.ext2)");
+    }
+
     /**
      * Unit test of methods {@link ExtensionFileFilter#equals} and {@link ExtensionFileFilter#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java
new file mode 100644
index 0000000..ad419bf
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/actions/SimplifyWayActionTest.java
@@ -0,0 +1,99 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Unit tests for class {@link SimplifyWayAction}.
+ */
+public final class SimplifyWayActionTest {
+
+    /** Class under test. */
+    private static SimplifyWayAction action;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+        action = Main.main.menu.simplifyWay;
+        action.setEnabled(true);
+    }
+
+    private static Way createWaySelected(DataSet ds, double latStart) {
+        Node n1 = new Node(new LatLon(latStart, 1.0));
+        ds.addPrimitive(n1);
+        Node n2 = new Node(new LatLon(latStart+1.0, 1.0));
+        ds.addPrimitive(n2);
+        Way w = new Way();
+        w.addNode(n1);
+        w.addNode(n2);
+        ds.addPrimitive(w);
+        ds.addSelected(w);
+        return w;
+    }
+
+    /**
+     * Test without any selection.
+     */
+    @Test
+    public void testSelectionEmpty() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertTrue(ds.getSelected().isEmpty());
+            action.actionPerformed(null);
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Test with a single way.
+     */
+    @Test
+    public void testSingleWay() {
+        DataSet ds = new DataSet();
+        createWaySelected(ds, 0.0);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertEquals(1, ds.getSelected().size());
+            action.actionPerformed(null);
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Test with more than 10 ways.
+     */
+    @Test
+    public void testMoreThanTenWays() {
+        DataSet ds = new DataSet();
+        for (int i = 0; i < 11; i++) {
+            createWaySelected(ds, i);
+        }
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertEquals(11, ds.getSelected().size());
+            action.actionPerformed(null);
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
index 1da9192..d9b0bc0 100644
--- a/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/SplitWayActionTest.java
@@ -38,8 +38,6 @@ public final class SplitWayActionTest {
     @BeforeClass
     public static void setUp() {
         JOSMFixture.createUnitTestFixture().init(true);
-
-        // Enable "Align in line" feature.
         action = Main.main.menu.splitWay;
         action.setEnabled(true);
     }
diff --git a/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java b/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java
new file mode 100644
index 0000000..8b17e9d
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/actions/UnGlueActionTest.java
@@ -0,0 +1,133 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Unit tests for class {@link UnGlueAction}.
+ */
+public final class UnGlueActionTest {
+
+    /** Class under test. */
+    private static UnGlueAction action;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+        action = Main.main.menu.unglueNodes;
+        action.setEnabled(true);
+    }
+
+    /**
+     * Test without any selection.
+     */
+    @Test
+    public void testSelectionEmpty() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertTrue(ds.getSelected().isEmpty());
+            assertTrue(ds.allPrimitives().isEmpty());
+            action.actionPerformed(null);
+            assertTrue(ds.allPrimitives().isEmpty());
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Test with a single node, that doesn't belong to a way.
+     */
+    @Test
+    public void testSingleNodeNotInWay() {
+        DataSet ds = new DataSet();
+        Node n = new Node(LatLon.ZERO);
+        ds.addPrimitive(n);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        ds.setSelected(n);
+        try {
+            Main.main.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);
+        }
+    }
+
+    /**
+     * Test with a single node, that belongs to a single way.
+     */
+    @Test
+    public void testSingleNodeInSingleWay() {
+        DataSet ds = new DataSet();
+        Node n1 = new Node(LatLon.ZERO);
+        ds.addPrimitive(n1);
+        Node n2 = new Node(new LatLon(1.0, 1.0));
+        ds.addPrimitive(n2);
+        Way w = new Way();
+        w.addNode(n1);
+        w.addNode(n2);
+        ds.addPrimitive(w);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        ds.setSelected(n1);
+        try {
+            Main.main.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);
+        }
+    }
+
+    /**
+     * Test with a single node, that belongs to two ways.
+     */
+    @Test
+    public void testSingleNodeInTwoWays() {
+        DataSet ds = new DataSet();
+        Node n1 = new Node(LatLon.ZERO);
+        ds.addPrimitive(n1);
+        Node n2 = new Node(new LatLon(1.0, 1.0));
+        ds.addPrimitive(n2);
+        Way w1 = new Way();
+        w1.addNode(n1);
+        w1.addNode(n2);
+        ds.addPrimitive(w1);
+        Node n3 = new Node(new LatLon(-1.0, -1.0));
+        ds.addPrimitive(n3);
+        Way w2 = new Way();
+        w2.addNode(n1);
+        w2.addNode(n3);
+        ds.addPrimitive(w2);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        ds.setSelected(n1);
+        try {
+            Main.main.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);
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java b/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
index 39a3797..3b7744f 100644
--- a/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/UnJoinNodeWayActionTest.java
@@ -23,7 +23,7 @@ public final class UnJoinNodeWayActionTest {
     /**
      * Prepare the class for the test. The notification system must be disabled.
      */
-    public class UnJoinNodeWayActionTestClass extends UnJoinNodeWayAction {
+    public static class UnJoinNodeWayActionTestClass extends UnJoinNodeWayAction {
 
         /**
          * Disable notification.
diff --git a/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java b/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java
index a05291a..04a6ef4 100644
--- a/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/downloadtasks/PostDownloadHandlerTest.java
@@ -46,7 +46,7 @@ public class PostDownloadHandlerTest {
 
             @Override
             public String[] getPatterns() {
-                return null;
+                return new String[0];
             }
 
             @Override
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
index 79da25b..7e588f2 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
@@ -25,6 +25,7 @@ import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
  * Unit tests for class {@link DrawAction}.
@@ -53,7 +54,7 @@ public class DrawActionTest {
         OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
 
         Field mapView = MapFrame.class.getDeclaredField("mapView");
-        mapView.setAccessible(true);
+        Utils.setObjectsAccessible(mapView);
         mapView.set(Main.map, new MapViewMock(dataSet, layer));
 
         Node n1 = new Node(new EastNorth(0, 0));
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java b/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
index 219f4c5..a05c332 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/MapViewMock.java
@@ -5,6 +5,7 @@ import java.awt.Cursor;
 import java.awt.event.MouseListener;
 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;
@@ -12,11 +13,11 @@ import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
 class MapViewMock extends MapView {
-    private final OsmDataLayer layer;
-    private final DataSet currentDataSet;
+    private final transient OsmDataLayer layer;
+    private final transient DataSet currentDataSet;
 
     MapViewMock(DataSet dataSet, OsmDataLayer layer) {
-        super(null, null);
+        super(Main.getLayerManager(), null, null);
         this.layer = layer;
         this.currentDataSet = dataSet;
     }
diff --git a/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java b/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
index c6bc0f0..f47c31e 100644
--- a/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/mapmode/SelectActionTest.java
@@ -23,6 +23,9 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.tools.Utils;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests for class {@link SelectAction}.
@@ -32,7 +35,7 @@ public class SelectActionTest {
     /**
      * Override some configuration variables without change in preferences.xml
      */
-    class PreferencesMock extends Preferences {
+    static class PreferencesMock extends Preferences {
         @Override
         public synchronized int getInteger(String key, int def) {
             if ("edit.initial-move-delay".equals(key)) {
@@ -50,9 +53,9 @@ public class SelectActionTest {
             super(mapFrame);
             try {
                 Field mv = SelectAction.class.getDeclaredField("mv");
-                mv.setAccessible(true);
+                Utils.setObjectsAccessible(mv);
                 mv.set(this, new MapViewMock(dataSet, layer));
-            } catch (Exception e) {
+            } catch (ReflectiveOperationException e) {
                 e.printStackTrace();
                 fail("Can't setup testing environnement");
             }
@@ -81,6 +84,7 @@ public class SelectActionTest {
      * see #10748
      */
     @Test
+    @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     public void test10748() {
         DataSet dataSet = new DataSet();
         OsmDataLayer layer = new OsmDataLayer(dataSet, OsmDataLayer.createNewName(), null);
@@ -136,11 +140,11 @@ public class SelectActionTest {
 
             // As result of test, we must find a 2 nodes way, from EN(0, 0) to EN(100, 0)
             assertTrue("Nodes are not merged", nodesMerged);
-            assertSame(String.format("Expect exactly one way, found %d\n", dataSet.getWays().size()),
+            assertSame(String.format("Expect exactly one way, found %d%n", dataSet.getWays().size()),
                        dataSet.getWays().size(), 1);
             Way rw = dataSet.getWays().iterator().next();
             assertFalse("Way shouldn't be deleted\n", rw.isDeleted());
-            assertSame(String.format("Way shouldn't have 2 nodes, %d found\n", w.getNodesCount()),
+            assertSame(String.format("Way shouldn't have 2 nodes, %d found%n", w.getNodesCount()),
                        rw.getNodesCount(), 2);
             Node r1 = rw.firstNode();
             Node r2 = rw.lastNode();
@@ -149,9 +153,9 @@ public class SelectActionTest {
                 r1 = r2;
                 r2 = tmp;
             }
-            assertSame(String.format("East should be 0, found %f\n", r1.getEastNorth().east()),
+            assertSame(String.format("East should be 0, found %f%n", r1.getEastNorth().east()),
                        Double.compare(r1.getEastNorth().east(), 0), 0);
-            assertSame(String.format("East should be 100, found %f\n", r2.getEastNorth().east()),
+            assertSame(String.format("East should be 100, found %f%n", r2.getEastNorth().east()),
                        Double.compare(r2.getEastNorth().east(), 100), 0);
         } finally {
             // Ensure we clean the place before leaving, even if test fails.
diff --git a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
index 2e80215..097d1e3 100644
--- a/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java
@@ -426,6 +426,10 @@ public class SearchCompilerTest {
         assertEquals("foo || (bar && baz)", c3.toString());
         final SearchCompiler.Match c4 = SearchCompiler.compile("foo1 OR (bar1 bar2 baz1 XOR baz2) OR foo2");
         assertEquals("foo1 || (bar1 && bar2 && (baz1 ^ baz2)) || foo2", c4.toString());
+        final SearchCompiler.Match c5 = SearchCompiler.compile("foo1 XOR (baz1 XOR (bar baz))");
+        assertEquals("foo1 ^ baz1 ^ (bar && baz)", c5.toString());
+        final SearchCompiler.Match c6 = SearchCompiler.compile("foo1 XOR ((baz1 baz2) XOR (bar OR baz))");
+        assertEquals("foo1 ^ (baz1 && baz2) ^ (bar || baz)", c6.toString());
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
new file mode 100644
index 0000000..1eea7b7
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/AutosaveTaskTest.java
@@ -0,0 +1,119 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+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 java.io.File;
+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.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.AutosaveTask.AutosaveLayerInfo;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Unit tests for class {@link AutosaveTask}.
+ */
+public class AutosaveTaskTest {
+
+    private static AutosaveTask task;
+
+    /**
+     * Setup test.
+     * @throws IOException if autosave directory cannot be created
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() throws IOException {
+        JOSMFixture.createUnitTestFixture().init();
+        task = new AutosaveTask();
+        Files.createDirectories(task.getAutosaveDir());
+    }
+
+    /**
+     * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - empty case
+     */
+    @Test
+    public void testGetUnsavedLayersFilesEmpty() {
+        assertTrue(task.getUnsavedLayersFiles().isEmpty());
+    }
+
+    /**
+     * Unit test to {@link AutosaveTask#getUnsavedLayersFiles} - non empty case
+     * @throws IOException in case of I/O error
+     */
+    @Test
+    public void testGetUnsavedLayersFilesNotEmpty() throws IOException {
+        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());
+        }
+    }
+
+    /**
+     * Unit test to {@link AutosaveTask#getNewLayerFile}
+     * @throws IOException in case of I/O error
+     */
+    @Test
+    public void testGetNewLayerFile() throws IOException {
+        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);
+                } 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());
+                    }
+                }
+            }
+        } finally {
+            for (File f : files) {
+                if (f != null) {
+                    Files.delete(task.getPidFile(f).toPath());
+                    Files.delete(f.toPath());
+                }
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/ProjectionBoundsTest.java b/test/unit/org/openstreetmap/josm/data/ProjectionBoundsTest.java
new file mode 100644
index 0000000..458bd4b
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/ProjectionBoundsTest.java
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+/**
+ * Unit tests for class {@link ProjectionBounds}.
+ */
+public class ProjectionBoundsTest {
+
+    /**
+     * Unit test of {@link ProjectionBounds#toString}
+     */
+    @Test
+    public void testToString() {
+        assertEquals("ProjectionBounds[1.0,2.0,3.0,4.0]", new ProjectionBounds(1, 2, 3, 4).toString());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/VersionTest.java b/test/unit/org/openstreetmap/josm/data/VersionTest.java
new file mode 100644
index 0000000..690f464
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/VersionTest.java
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests for class {@link Version}.
+ */
+public class VersionTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link Version#getAgentString}
+     */
+    @Test
+    public void testGetAgentString() {
+        String v = Version.getInstance().getAgentString(false);
+        assertTrue(v.startsWith("JOSM/1.5 ("));
+        assertTrue(v.endsWith(" en)"));
+        v = Version.getInstance().getAgentString(true);
+        assertTrue(v.startsWith("JOSM/1.5 ("));
+        assertTrue(v.contains(" en) "));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
index 84ea487..c8756cc 100644
--- a/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
+++ b/test/unit/org/openstreetmap/josm/data/cache/JCSCachedTileLoaderJobTest.java
@@ -6,12 +6,15 @@ import static org.junit.Assert.assertEquals;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.jcs.access.behavior.ICacheAccess;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Unit tests for class {@link JCSCachedTileLoaderJob}.
  */
@@ -45,7 +48,7 @@ public class JCSCachedTileLoaderJobTest {
 
         @Override
         protected CacheEntry createCacheEntry(byte[] content) {
-            return new CacheEntry("dummy".getBytes());
+            return new CacheEntry("dummy".getBytes(StandardCharsets.UTF_8));
         }
     }
 
@@ -57,7 +60,7 @@ public class JCSCachedTileLoaderJobTest {
         public synchronized void loadingFinished(CacheEntry data, CacheEntryAttributes attributes, LoadResult result) {
             this.attributes = attributes;
             this.ready = true;
-            this.notify();
+            this.notifyAll();
         }
     }
 
@@ -69,8 +72,13 @@ public class JCSCachedTileLoaderJobTest {
         JOSMFixture.createUnitTestFixture().init();
     }
 
+    /**
+     * Test status codes
+     * @throws InterruptedException in case of thread interruption
+     * @throws IOException in case of I/O error
+     */
     @Test
-    public void testStatusCodes() throws Exception {
+    public void testStatusCodes() throws IOException, InterruptedException  {
         doTestStatusCode(200);
         // can't test for 3xx, as httpstat.us redirects finally to 200 page
         doTestStatusCode(401);
@@ -83,8 +91,14 @@ public class JCSCachedTileLoaderJobTest {
         doTestStatusCode(502);
     }
 
+    /**
+     * Test unknown host
+     * @throws InterruptedException in case of thread interruption
+     * @throws IOException in case of I/O error
+     */
     @Test
-    public void testUnknownHost() throws Exception {
+    @SuppressFBWarnings(value = "WA_NOT_IN_LOOP")
+    public void testUnknownHost() throws IOException, InterruptedException {
         TestCachedTileLoaderJob job = new TestCachedTileLoaderJob("http://unkownhost.unkownhost/unkown");
         Listener listener = new Listener();
         job.submit(listener, true);
@@ -96,7 +110,8 @@ public class JCSCachedTileLoaderJobTest {
         assertEquals("java.net.UnknownHostException: unkownhost.unkownhost", listener.attributes.getErrorMessage());
     }
 
-    private void doTestStatusCode(int responseCode) throws Exception {
+    @SuppressFBWarnings(value = "WA_NOT_IN_LOOP")
+    private void doTestStatusCode(int responseCode) throws IOException, InterruptedException {
         TestCachedTileLoaderJob job = getStatusLoaderJob(responseCode);
         Listener listener = new Listener();
         job.submit(listener, true);
diff --git a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
index 4e3865c..c93d26f 100644
--- a/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
+++ b/test/unit/org/openstreetmap/josm/data/coor/LatLonTest.java
@@ -7,6 +7,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Unit tests for class {@link LatLon}.
  */
@@ -25,6 +27,7 @@ public class LatLonTest {
     /**
      * Lat/Lon sample values for unit tests
      */
+    @SuppressFBWarnings(value = "MS_PKGPROTECT")
     public static final double[] SAMPLE_VALUES = new double[]{
             -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,
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java b/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
index 3a92d5b..b943418 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/ImageryInfoTest.java
@@ -66,7 +66,7 @@ public class ImageryInfoTest {
         expect.put("ETag", "bar");
         assertEquals(info.noTileHeaders, expect);
         final Set<String> eTag = info.noTileHeaders.get("ETag");
-        assertEquals(eTag, new HashSet<String>(Arrays.asList("foo", "bar")));
+        assertEquals(eTag, new HashSet<>(Arrays.asList("foo", "bar")));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java b/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
index 83e46ce..8d521d7 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/TemplatedWMSTileSourceTest.java
@@ -15,7 +15,6 @@ import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.CustomProjection;
-import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
 
 /**
@@ -34,6 +33,9 @@ public class TemplatedWMSTileSourceTest {
         JOSMFixture.createUnitTestFixture().init();
     }
 
+    /**
+     * Test EPSG:3857
+     */
     @Test
     public void testEPSG3857() {
         Main.setProjection(Projections.getProjectionByCode("EPSG:3857"));
@@ -55,6 +57,9 @@ public class TemplatedWMSTileSourceTest {
         verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
     }
 
+    /**
+     * Test EPSG:4326
+     */
     @Test
     public void testEPSG4326() {
         Main.setProjection(Projections.getProjectionByCode("EPSG:4326"));
@@ -67,6 +72,9 @@ public class TemplatedWMSTileSourceTest {
         verifyTileSquarness(source, 2270, 1323, 12);
     }
 
+    /**
+     * Test EPSG:4326 - wide bounds
+     */
     @Test
     public void testEPSG4326_widebounds() {
         Main.setProjection(new CustomProjection("+proj=lonlat +datum=WGS84 +axis=neu +bounds=-180,53,180,54"));
@@ -76,6 +84,9 @@ public class TemplatedWMSTileSourceTest {
         verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
     }
 
+    /**
+     * Test EPSG:4326 - narrow bounds
+     */
     @Test
     public void testEPSG4326_narrowbounds() {
         Main.setProjection(new CustomProjection("+proj=lonlat +datum=WGS84 +axis=neu +bounds=18,-90,20,90"));
@@ -85,6 +96,9 @@ public class TemplatedWMSTileSourceTest {
         verifyLocation(source, new LatLon(53.501565692302854, 18.54455233898721));
     }
 
+    /**
+     * Test EPSG:2180
+     */
     @Test
     public void testEPSG2180() {
         Main.setProjection(Projections.getProjectionByCode("EPSG:2180"));
@@ -98,6 +112,9 @@ public class TemplatedWMSTileSourceTest {
         verifyTileSquarness(source, 2270, 1323, 12);
     }
 
+    /**
+     * Test EPSG:3006 with bounds
+     */
     @Test
     public void testEPSG3006_withbounds() {
         Main.setProjection(
@@ -110,6 +127,9 @@ public class TemplatedWMSTileSourceTest {
         verifyLocation(source, new LatLon(60, 18.1));
     }
 
+    /**
+     * Test EPSG:3006 without bounds
+     */
     @Test
     public void testEPSG3006_withoutbounds() {
         Main.setProjection(
@@ -187,7 +207,6 @@ public class TemplatedWMSTileSourceTest {
     }
 
     private void verifyTileSquarness(TemplatedWMSTileSource source, int x, int y, int z) {
-        Projection proj = Main.getProjection();
         /**
          * t1 | t2
          * -------
@@ -216,7 +235,6 @@ public class TemplatedWMSTileSourceTest {
     }
 
     private TemplatedWMSTileSource getSource() {
-        TemplatedWMSTileSource source = new TemplatedWMSTileSource(testImageryWMS);
-        return source;
+        return new TemplatedWMSTileSource(testImageryWMS);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java b/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
index c84b370..b99ad0f 100644
--- a/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
+++ b/test/unit/org/openstreetmap/josm/data/imagery/WMTSTileSourceTest.java
@@ -57,7 +57,7 @@ public class WMTSTileSourceTest {
     }
 
     @Test
-    public void testPseudoMercator() throws MalformedURLException, IOException {
+    public void testPseudoMercator() throws IOException {
         Main.setProjection(Projections.getProjectionByCode("EPSG:3857"));
         WMTSTileSource testSource = new WMTSTileSource(testImageryPSEUDO_MERCATOR);
         testSource.initProjection(Main.getProjection());
@@ -87,7 +87,7 @@ public class WMTSTileSourceTest {
     }
 
     @Test
-    public void testWALLONIE() throws MalformedURLException, IOException {
+    public void testWALLONIE() throws IOException {
         Main.setProjection(Projections.getProjectionByCode("EPSG:31370"));
         WMTSTileSource testSource = new WMTSTileSource(testImageryWALLONIE);
         testSource.initProjection(Main.getProjection());
@@ -107,7 +107,7 @@ public class WMTSTileSourceTest {
 
     @Test
     @Ignore("disable this test, needs further working") // XXX
-    public void testWALLONIENoMatrixDimension() throws MalformedURLException, IOException {
+    public void testWALLONIENoMatrixDimension() throws IOException {
         Main.setProjection(Projections.getProjectionByCode("EPSG:31370"));
         WMTSTileSource testSource = new WMTSTileSource(getImagery("test/data/wmts/WMTSCapabilities-Wallonie-nomatrixdimension.xml"));
         testSource.initProjection(Main.getProjection());
@@ -131,7 +131,7 @@ public class WMTSTileSourceTest {
     }
 
     @Test
-    public void testWIEN() throws MalformedURLException, IOException {
+    public void testWIEN() throws IOException {
         Main.setProjection(Projections.getProjectionByCode("EPSG:3857"));
         WMTSTileSource testSource = new WMTSTileSource(testImageryWIEN);
         testSource.initProjection(Main.getProjection());
diff --git a/test/unit/org/openstreetmap/josm/data/oauth/OAuthParametersTest.java b/test/unit/org/openstreetmap/josm/data/oauth/OAuthParametersTest.java
index 91ac2c9..15ed7ad 100644
--- a/test/unit/org/openstreetmap/josm/data/oauth/OAuthParametersTest.java
+++ b/test/unit/org/openstreetmap/josm/data/oauth/OAuthParametersTest.java
@@ -4,21 +4,34 @@ package org.openstreetmap.josm.data.oauth;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
-import nl.jqno.equalsverifier.EqualsVerifier;
 
+import org.junit.BeforeClass;
 import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.io.OsmApi;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 /**
  * Unit tests for class {@link OAuthParameters}.
  */
 public class OAuthParametersTest {
 
     /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
      * Unit test of method {@link OAuthParameters#createDefault}.
      */
     @Test
+    @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
     public void testCreateDefault() {
         OAuthParameters def = OAuthParameters.createDefault();
         assertNotNull(def);
@@ -33,6 +46,14 @@ public class OAuthParametersTest {
     }
 
     /**
+     * Unit test of method {@link OAuthParameters#createFromPreferences}.
+     */
+    @Test
+    public void testCreateFromPreferences() {
+        assertNotNull(OAuthParameters.createFromPreferences(Main.pref));
+    }
+
+    /**
      * Unit test of methods {@link OAuthParameters#equals} and {@link OAuthParameters#hashCode}.
      */
     @Test
diff --git a/test/unit/org/openstreetmap/josm/data/oauth/OAuthTokenTest.java b/test/unit/org/openstreetmap/josm/data/oauth/OAuthTokenTest.java
index 052f306..ece1af5 100644
--- a/test/unit/org/openstreetmap/josm/data/oauth/OAuthTokenTest.java
+++ b/test/unit/org/openstreetmap/josm/data/oauth/OAuthTokenTest.java
@@ -3,11 +3,12 @@ package org.openstreetmap.josm.data.oauth;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import nl.jqno.equalsverifier.EqualsVerifier;
-import oauth.signpost.OAuthConsumer;
 
 import org.junit.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+import oauth.signpost.OAuthConsumer;
+
 /**
  * Unit tests for class {@link OAuthToken}.
  */
@@ -24,6 +25,7 @@ public class OAuthTokenTest {
         assertNotNull(defTok);
         assertEquals(defCon.getToken(), defTok.getKey());
         assertEquals(defCon.getTokenSecret(), defTok.getSecret());
+        assertEquals(defTok, new OAuthToken(defTok));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/oauth/SignpostAdaptersTest.java b/test/unit/org/openstreetmap/josm/data/oauth/SignpostAdaptersTest.java
new file mode 100644
index 0000000..dac52a5
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/oauth/SignpostAdaptersTest.java
@@ -0,0 +1,99 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.oauth;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.oauth.SignpostAdapters.HttpRequest;
+import org.openstreetmap.josm.data.oauth.SignpostAdapters.HttpResponse;
+import org.openstreetmap.josm.data.oauth.SignpostAdapters.OAuthConsumer;
+import org.openstreetmap.josm.tools.HttpClient;
+
+/**
+ * Unit tests for class {@link SignpostAdapters}.
+ */
+public class SignpostAdaptersTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    private static HttpClient newClient() throws MalformedURLException {
+        return HttpClient.create(new URL("https://www.openstreetmap.org"));
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.OAuthConsumer#wrap}.
+     * @throws MalformedURLException never
+     */
+    @Test
+    public void testOAuthConsumerWrap() throws MalformedURLException {
+        assertNotNull(new OAuthConsumer("", "").wrap(newClient()));
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpRequest#getMessagePayload}.
+     * @throws IOException never
+     */
+    @Test
+    public void testHttpRequestGetMessagePayload() throws IOException {
+        assertNull(new HttpRequest(newClient()).getMessagePayload());
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpRequest#setRequestUrl}.
+     * @throws IOException never
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testHttpRequestSetRequestUrl() throws IOException {
+        new HttpRequest(newClient()).setRequestUrl(null);
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpRequest#getAllHeaders}.
+     * @throws IOException never
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testHttpRequestGetAllHeaders() throws IOException {
+        new HttpRequest(newClient()).getAllHeaders();
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpRequest#unwrap}.
+     * @throws IOException never
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testHttpRequestUnwrap() throws IOException {
+        new HttpRequest(newClient()).unwrap();
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpResponse#getReasonPhrase()}.
+     * @throws Exception never
+     */
+    @Test
+    public void testHttpResponseGetReasonPhrase() throws Exception {
+        assertEquals("OK", new HttpResponse(new HttpRequest(newClient()).request.connect()).getReasonPhrase());
+    }
+
+    /**
+     * Unit test of method {@link SignpostAdapters.HttpResponse#unwrap}.
+     * @throws IOException never
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testHttpResponseUnwrap() throws IOException {
+        new HttpResponse(new HttpRequest(newClient()).request.connect()).unwrap();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy b/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
index 4c64f64..835e821 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
+++ b/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
@@ -8,13 +8,13 @@ import org.junit.Test
 class ChangesetCacheTest {
 
     @Test
-    public void test_Constructor() {
+    public void testConstructor() {
         ChangesetCache cache = ChangesetCache.getInstance()
         assert cache != null
     }
 
     @Test
-    public void test_addAndRemoveListeners() {
+    public void testAddAndRemoveListeners() {
         ChangesetCache cache = ChangesetCache.getInstance()
         cache.clear()
 
@@ -37,7 +37,7 @@ class ChangesetCacheTest {
     }
 
     @Test
-    public void update_get_remove_cycle() {
+    public void updateGetRemoveCycle() {
         ChangesetCache cache = ChangesetCache.getInstance()
         cache.clear()
 
@@ -96,7 +96,7 @@ class ChangesetCacheTest {
     }
 
     @Test
-    public void fireingEvents_AddAChangeset() {
+    public void fireingEventsAddAChangeset() {
         ChangesetCache cache = ChangesetCache.getInstance()
         cache.clear()
         cache. at listeners.clear()
@@ -117,7 +117,7 @@ class ChangesetCacheTest {
     }
 
     @Test
-    public void fireingEvents_UpdateChangeset() {
+    public void fireingEventsUpdateChangeset() {
         ChangesetCache cache = ChangesetCache.getInstance()
         cache.clear()
         cache. at listeners.clear()
@@ -140,7 +140,7 @@ class ChangesetCacheTest {
     }
 
     @Test
-    public void fireingEvents_RemoveChangeset() {
+    public void fireingEventsRemoveChangeset() {
         ChangesetCache cache = ChangesetCache.getInstance()
         cache.clear()
         cache. at listeners.clear()
diff --git a/test/unit/org/openstreetmap/josm/data/osm/FilterTest.java b/test/unit/org/openstreetmap/josm/data/osm/FilterTest.java
index 33b7568..ba76e0b 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/FilterTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/FilterTest.java
@@ -160,6 +160,7 @@ public class FilterTest {
                 filters.addAll(Arrays.asList(new Filter[] {f1, f2}));
                 break;
             }
+            default: throw new AssertionError();
             }
 
             FilterMatcher filterMatcher = new FilterMatcher();
diff --git a/test/unit/org/openstreetmap/josm/data/osm/MultipolygonBuilderTest.java b/test/unit/org/openstreetmap/josm/data/osm/MultipolygonBuilderTest.java
index 4fad70e..f37be6b 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/MultipolygonBuilderTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/MultipolygonBuilderTest.java
@@ -13,6 +13,8 @@ import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.io.OsmReader;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Unit tests of the {@code MultipolygonBuilder} class.
  */
@@ -22,6 +24,7 @@ public class MultipolygonBuilderTest {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(15);
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java b/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
index a35f846..b2db840 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandlingTest.java
@@ -10,6 +10,8 @@ import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.data.coor.LatLon;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Some unit test cases for basic tag management on {@link OsmPrimitive}. Uses
  * {@link Node} for the tests, {@link OsmPrimitive} is abstract.
@@ -71,6 +73,7 @@ public class OsmPrimitiveKeyHandlingTest {
      * Removes tags from a node with two tags and test the state of the node.
      */
     @Test
+    @SuppressFBWarnings(value = "DM_STRING_CTOR", justification = "test that equals is used and not ==")
     public void remove() {
         Node n = new Node();
         n.put("key.1", "value.1");
diff --git a/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java b/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
index e8e1e6c..c3f56a3 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/RelationTest.java
@@ -33,7 +33,7 @@ public class RelationTest {
     }
 
     @Test
-    public void testBBox() {
+    public void testBbox() {
         DataSet ds = new DataSet();
 
         Node n1 = new Node(new LatLon(10, 10));
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 568b974..187a5dd 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
@@ -12,6 +12,7 @@ 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.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -408,4 +409,12 @@ public class MergeSourceBuildingVisitorTest {
         assertEquals(1, r2.getMembersCount());
         assertTrue(r2.getMembers().contains(new RelationMember("relation-1", r1)));
     }
+
+    /**
+     * Unit test of {@code AbstractVisitor#visit(org.openstreetmap.josm.data.osm.Changeset)}.
+     */
+    @Test
+    public void testVisitChangeset() {
+        new MergeSourceBuildingVisitor(new DataSet()).visit(new Changeset());
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java b/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java
index d1bf2d9..9a29814 100644
--- a/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java
+++ b/test/unit/org/openstreetmap/josm/data/projection/ProjectionRefTest.java
@@ -221,14 +221,13 @@ public class ProjectionRefTest {
         try {
             Process process = pb.start();
             OutputStream stdin = process.getOutputStream();
-            final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
             InputStream stdout = process.getInputStream();
-            final BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
-            String input = String.format("%.9f %.9f\n", ll.lon(), ll.lat());
-            writer.write(input);
-            writer.close();
-            output = reader.readLine();
-            reader.close();
+            try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin, StandardCharsets.UTF_8))) {
+                writer.write(String.format("%.9f %.9f%n", ll.lon(), ll.lat()));
+            }
+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8))) {
+                output = reader.readLine();
+            }
         } catch (IOException e) {
             System.err.println("Error: Running external command failed: " + e + "\nCommand was: "+Utils.join(" ", args));
             return null;
diff --git a/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTestIT.java b/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTestIT.java
index 4e1a4a2..04cad07 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTestIT.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/DomainValidatorTestIT.java
@@ -22,15 +22,17 @@ import static org.junit.Assert.fail;
 import java.io.BufferedReader;
 import java.io.Closeable;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.net.HttpURLConnection;
 import java.net.IDN;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
@@ -45,6 +47,8 @@ import java.util.regex.Pattern;
 
 import org.junit.Test;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Integration tests for the DomainValidator.
  *
@@ -79,78 +83,77 @@ public class DomainValidatorTestIT {
         // if the txt file contains entries not found in the html file, try again in a day or two
         download(htmlFile, "http://www.iana.org/domains/root/db", timestamp);
 
-        BufferedReader br = new BufferedReader(new FileReader(txtFile));
-        String line;
-        final String header;
-        line = br.readLine(); // header
-        if (line != null && line.startsWith("# Version ")) {
-            header = line.substring(2);
-        } else {
-            br.close();
-            throw new IOException("File does not have expected Version header");
-        }
-        final boolean generateUnicodeTlds = false; // Change this to generate Unicode TLDs as well
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(txtFile), StandardCharsets.UTF_8))) {
+            String line;
+            final String header;
+            line = br.readLine(); // header
+            if (line != null && line.startsWith("# Version ")) {
+                header = line.substring(2);
+            } else {
+                throw new IOException("File does not have expected Version header");
+            }
+            final boolean generateUnicodeTlds = false; // Change this to generate Unicode TLDs as well
 
-        // Parse html page to get entries
-        Map<String, String[]> htmlInfo = getHtmlInfo(htmlFile);
-        Map<String, String> missingTLD = new TreeMap<>(); // stores entry and comments as String[]
-        Map<String, String> missingCC = new TreeMap<>();
-        while ((line = br.readLine()) != null) {
-            if (!line.startsWith("#")) {
-                final String unicodeTld; // only different from asciiTld if that was punycode
-                final String asciiTld = line.toLowerCase(Locale.ENGLISH);
-                if (line.startsWith("XN--")) {
-                    unicodeTld = IDN.toUnicode(line);
-                } else {
-                    unicodeTld = asciiTld;
-                }
-                if (!dv.isValidTld(asciiTld)) {
-                    String[] info = htmlInfo.get(asciiTld);
-                    if (info != null) {
-                        String type = info[0];
-                        String comment = info[1];
-                        if ("country-code".equals(type)) { // Which list to use?
-                            missingCC.put(asciiTld, unicodeTld + " " + comment);
-                            if (generateUnicodeTlds) {
-                                missingCC.put(unicodeTld, asciiTld + " " + comment);
+            // Parse html page to get entries
+            Map<String, String[]> htmlInfo = getHtmlInfo(htmlFile);
+            Map<String, String> missingTLD = new TreeMap<>(); // stores entry and comments as String[]
+            Map<String, String> missingCC = new TreeMap<>();
+            while ((line = br.readLine()) != null) {
+                if (!line.startsWith("#")) {
+                    final String unicodeTld; // only different from asciiTld if that was punycode
+                    final String asciiTld = line.toLowerCase(Locale.ENGLISH);
+                    if (line.startsWith("XN--")) {
+                        unicodeTld = IDN.toUnicode(line);
+                    } else {
+                        unicodeTld = asciiTld;
+                    }
+                    if (!dv.isValidTld(asciiTld)) {
+                        String[] info = htmlInfo.get(asciiTld);
+                        if (info != null) {
+                            String type = info[0];
+                            String comment = info[1];
+                            if ("country-code".equals(type)) { // Which list to use?
+                                missingCC.put(asciiTld, unicodeTld + " " + comment);
+                                if (generateUnicodeTlds) {
+                                    missingCC.put(unicodeTld, asciiTld + " " + comment);
+                                }
+                            } else {
+                                missingTLD.put(asciiTld, unicodeTld + " " + comment);
+                                if (generateUnicodeTlds) {
+                                    missingTLD.put(unicodeTld, asciiTld + " " + comment);
+                                }
                             }
                         } else {
-                            missingTLD.put(asciiTld, unicodeTld + " " + comment);
-                            if (generateUnicodeTlds) {
-                                missingTLD.put(unicodeTld, asciiTld + " " + comment);
-                            }
+                            System.err.println("Expected to find HTML info for "+ asciiTld);
                         }
-                    } else {
-                        System.err.println("Expected to find HTML info for "+ asciiTld);
                     }
-                }
-                ianaTlds.add(asciiTld);
-                // Don't merge these conditions; generateUnicodeTlds is final so needs to be separate to avoid a warning
-                if (generateUnicodeTlds) {
-                    if (!unicodeTld.equals(asciiTld)) {
-                        ianaTlds.add(unicodeTld);
+                    ianaTlds.add(asciiTld);
+                    // Don't merge these conditions; generateUnicodeTlds is final so needs to be separate to avoid a warning
+                    if (generateUnicodeTlds) {
+                        if (!unicodeTld.equals(asciiTld)) {
+                            ianaTlds.add(unicodeTld);
+                        }
                     }
                 }
             }
-        }
-        br.close();
-        // List html entries not in TLD text list
-        for (String key : (new TreeMap<>(htmlInfo)).keySet()) {
-            if (!ianaTlds.contains(key)) {
-                if (isNotInRootZone(key)) {
-                    System.out.println("INFO: HTML entry not yet in root zone: "+key);
-                } else {
-                    System.err.println("WARN: Expected to find text entry for html: "+key);
+            // List html entries not in TLD text list
+            for (String key : (new TreeMap<>(htmlInfo)).keySet()) {
+                if (!ianaTlds.contains(key)) {
+                    if (isNotInRootZone(key)) {
+                        System.out.println("INFO: HTML entry not yet in root zone: "+key);
+                    } else {
+                        System.err.println("WARN: Expected to find text entry for html: "+key);
+                    }
                 }
             }
-        }
-        if (!missingTLD.isEmpty()) {
-            printMap(header, missingTLD, "TLD");
-            fail("missing TLD");
-        }
-        if (!missingCC.isEmpty()) {
-            printMap(header, missingCC, "CC");
-            fail("missing CC");
+            if (!missingTLD.isEmpty()) {
+                printMap(header, missingTLD, "TLD");
+                fail("missing TLD");
+            }
+            if (!missingCC.isEmpty()) {
+                printMap(header, missingCC, "CC");
+                fail("missing CC");
+            }
         }
         // Check if internal tables contain any additional entries
         assertTrue(isInIanaList("INFRASTRUCTURE_TLDS", ianaTlds));
@@ -172,6 +175,7 @@ public class DomainValidatorTestIT {
         System.out.println("\nDone");
     }
 
+    @SuppressFBWarnings(value = "PERFORMANCE")
     private static Map<String, String[]> getHtmlInfo(final File f) throws IOException {
         final Map<String, String[]> info = new HashMap<>();
 
@@ -183,49 +187,49 @@ public class DomainValidatorTestIT {
 //        <td>Ålands landskapsregering</td>
         final Pattern comment = Pattern.compile("\\s+<td>([^<]+)</td>");
 
-        final BufferedReader br = new BufferedReader(new FileReader(f));
-        String line;
-        while ((line = br.readLine()) != null) {
-            Matcher m = domain.matcher(line);
-            if (m.lookingAt()) {
-                String dom = m.group(1);
-                String typ = "??";
-                String com = "??";
-                line = br.readLine();
-                while (line != null && line.matches("^\\s*$")) { // extra blank lines introduced
-                    line = br.readLine();
-                }
-                Matcher t = type.matcher(line);
-                if (t.lookingAt()) {
-                    typ = t.group(1);
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8))) {
+            String line;
+            while ((line = br.readLine()) != null) {
+                Matcher m = domain.matcher(line);
+                if (m.lookingAt()) {
+                    String dom = m.group(1);
+                    String typ = "??";
+                    String com = "??";
                     line = br.readLine();
-                    if (line != null && line.matches("\\s+<!--.*")) {
-                        while (line != null && !line.matches(".*-->.*")) {
-                            line = br.readLine();
-                        }
+                    while (line != null && line.matches("^\\s*$")) { // extra blank lines introduced
                         line = br.readLine();
                     }
-                    // Should have comment; is it wrapped?
-                    while (line != null && !line.matches(".*</td>.*")) {
-                        line += " " +br.readLine();
-                    }
-                    Matcher n = comment.matcher(line);
-                    if (n.lookingAt()) {
-                        com = n.group(1);
-                    }
-                    // Don't save unused entries
-                    if (com.contains("Not assigned") || com.contains("Retired") || typ.equals("test")) {
-//                        System.out.println("Ignored: " + typ + " " + dom + " " +com);
+                    Matcher t = type.matcher(line);
+                    if (t.lookingAt()) {
+                        typ = t.group(1);
+                        line = br.readLine();
+                        if (line != null && line.matches("\\s+<!--.*")) {
+                            while (line != null && !line.matches(".*-->.*")) {
+                                line = br.readLine();
+                            }
+                            line = br.readLine();
+                        }
+                        // Should have comment; is it wrapped?
+                        while (line != null && !line.matches(".*</td>.*")) {
+                            line += " " +br.readLine();
+                        }
+                        Matcher n = comment.matcher(line);
+                        if (n.lookingAt()) {
+                            com = n.group(1);
+                        }
+                        // Don't save unused entries
+                        if (com.contains("Not assigned") || com.contains("Retired") || typ.equals("test")) {
+    //                        System.out.println("Ignored: " + typ + " " + dom + " " +com);
+                        } else {
+                            info.put(dom.toLowerCase(Locale.ENGLISH), new String[]{typ, com});
+    //                        System.out.println("Storing: " + typ + " " + dom + " " +com);
+                        }
                     } else {
-                        info.put(dom.toLowerCase(Locale.ENGLISH), new String[]{typ, com});
-//                        System.out.println("Storing: " + typ + " " + dom + " " +com);
+                        System.err.println("Unexpected type: " + line);
                     }
-                } else {
-                    System.err.println("Unexpected type: " + line);
                 }
             }
         }
-        br.close();
         return info;
     }
 
@@ -259,15 +263,13 @@ public class DomainValidatorTestIT {
         } else {
             System.out.println("Downloading " + tldurl);
             byte[] buff = new byte[1024];
-            InputStream is = hc.getInputStream();
-
-            FileOutputStream fos = new FileOutputStream(f);
-            int len;
-            while ((len = is.read(buff)) != -1) {
-                fos.write(buff, 0, len);
+            try (InputStream is = hc.getInputStream();
+                 FileOutputStream fos = new FileOutputStream(f)) {
+                int len;
+                while ((len = is.read(buff)) != -1) {
+                    fos.write(buff, 0, len);
+                }
             }
-            fos.close();
-            is.close();
             System.out.println("Done");
         }
         return f.lastModified();
@@ -287,7 +289,7 @@ public class DomainValidatorTestIT {
         try {
             File rootCheck = new File(System.getProperty("java.io.tmpdir"), "tld_" + domain + ".html");
             download(rootCheck, tldurl, 0L);
-            in = new BufferedReader(new FileReader(rootCheck));
+            in = new BufferedReader(new InputStreamReader(new FileInputStream(rootCheck), StandardCharsets.UTF_8));
             String inputLine;
             while ((inputLine = in.readLine()) != null) {
                 if (inputLine.contains("This domain is not present in the root zone at this time.")) {
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 d151d01..3f13f39 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/EmailValidatorTest.java
@@ -36,12 +36,12 @@ public class EmailValidatorTest {
      * The key used to retrieve the set of validation
      * rules from the xml file.
      */
-    protected static String FORM_KEY = "emailForm";
+    protected static final String FORM_KEY = "emailForm";
 
     /**
      * The key used to retrieve the validator action.
      */
-    protected static String ACTION = "email";
+    protected static final String ACTION = "email";
 
     private EmailValidator validator;
 
@@ -59,6 +59,7 @@ public class EmailValidatorTest {
     @Test
     public void testEmail()  {
         assertTrue(validator.isValid("jsmith at apache.org"));
+        assertFalse(validator.isValid(null));
     }
 
     /**
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 c0f3b29..552766f 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/routines/UrlValidatorTest.java
@@ -30,8 +30,8 @@ import org.junit.Test;
  */
 public class UrlValidatorTest {
 
-   private final boolean printStatus = false;
-   private final boolean printIndex = false; //print index that indicates current scheme,host,port,path, query test were using.
+   private static final boolean printStatus = false;
+   private static final boolean printIndex = false; //print index that indicates current scheme,host,port,path, query test were using.
 
    /**
     * Setup
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/MultipolygonTestTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/MultipolygonTestTest.java
index 7fc9d2a..efafab1 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/MultipolygonTestTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/MultipolygonTestTest.java
@@ -64,10 +64,6 @@ public class MultipolygonTestTest {
         MULTIPOLYGON_TEST.initialize();
         MULTIPOLYGON_TEST.startTest(null);
 
-        List<Node> nodes = new ArrayList<>();
-        nodes.add(new Node(new LatLon(0, 1)));
-        nodes.add(new Node(new LatLon(0, 2)));
-
         // Erroneous tag
         Way w = createUnclosedWay("amenity=parking");
         MULTIPOLYGON_TEST.visit(w);
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/NameMismatchTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/NameMismatchTest.java
index ee120f5..6d1f16d 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/NameMismatchTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/NameMismatchTest.java
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.data.validation.tests;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 
 import java.util.List;
 
@@ -37,7 +36,7 @@ public class NameMismatchTest {
     @Test
     public void test0() {
         final List<TestError> errors = test("node name:de=Europa");
-        assertSame(1, errors.size());
+        assertEquals(1, errors.size());
         assertEquals("A name is missing, even though name:* exists.", errors.get(0).getMessage());
     }
 
@@ -47,7 +46,7 @@ public class NameMismatchTest {
     @Test
     public void test1() {
         final List<TestError> errors = test("node name=Europe name:de=Europa");
-        assertSame(1, errors.size());
+        assertEquals(1, errors.size());
         assertEquals("Missing name:*=Europe. Add tag with correct language key.", errors.get(0).getDescription());
     }
 
@@ -57,7 +56,7 @@ public class NameMismatchTest {
     @Test
     public void test2() {
         final List<TestError> errors = test("node name=Europe name:de=Europa name:en=Europe");
-        assertSame(0, errors.size());
+        assertEquals(0, errors.size());
     }
 
     /**
@@ -67,13 +66,13 @@ public class NameMismatchTest {
     public void test3() {
         List<TestError> errors;
         errors = test("node \"name\"=\"Italia - Italien - Italy\"");
-        assertSame(0, errors.size());
+        assertEquals(0, errors.size());
         errors = test("node name=\"Italia - Italien - Italy\" name:it=Italia");
-        assertSame(2, errors.size());
+        assertEquals(2, errors.size());
         errors = test("node name=\"Italia - Italien - Italy\" name:it=Italia name:de=Italien");
-        assertSame(1, errors.size());
+        assertEquals(1, errors.size());
         assertEquals("Missing name:*=Italy. Add tag with correct language key.", errors.get(0).getDescription());
         errors = test("node name=\"Italia - Italien - Italy\" name:it=Italia name:de=Italien name:en=Italy");
-        assertSame(0, errors.size());
+        assertEquals(0, errors.size());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
index 14275db..1393c36 100644
--- a/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/DefaultNameFormatterTest.java
@@ -2,7 +2,6 @@
 package org.openstreetmap.josm.gui;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -26,6 +25,8 @@ import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmReader;
 import org.xml.sax.SAXException;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Unit tests of {@link DefaultNameFormatter} class.
  */
@@ -46,6 +47,7 @@ public class DefaultNameFormatterTest {
      * @throws SAXException if any XML error occurs
      */
     @Test
+    @SuppressFBWarnings(value = "ITA_INEFFICIENT_TO_ARRAY")
     public void testTicket9632() throws IllegalDataException, IOException, SAXException {
         String source = "http://josm.openstreetmap.de/josmfile?page=Presets/BicycleJunction&preset";
         TaggingPresets.addTaggingPresets(TaggingPresetReader.readAll(source, true));
@@ -67,13 +69,13 @@ public class DefaultNameFormatterTest {
             // route(lcn Sal  Salier-Radweg(412 members)
             System.out.println("p3: "+DefaultNameFormatter.getInstance().format(p3)+" - "+p3);
 
-            assertSame(comparator.compare(p1, p2), -1); // p1 < p2
-            assertSame(comparator.compare(p2, p1),  1); // p2 > p1
+            assertEquals(comparator.compare(p1, p2), -1); // p1 < p2
+            assertEquals(comparator.compare(p2, p1),  1); // p2 > p1
 
-            assertSame(comparator.compare(p1, p3), -1); // p1 < p3
-            assertSame(comparator.compare(p3, p1),  1); // p3 > p1
-            assertSame(comparator.compare(p2, p3),  1); // p2 > p3
-            assertSame(comparator.compare(p3, p2), -1); // p3 < p2
+            assertEquals(comparator.compare(p1, p3), -1); // p1 < p3
+            assertEquals(comparator.compare(p3, p1),  1); // p3 > p1
+            assertEquals(comparator.compare(p2, p3),  1); // p2 > p3
+            assertEquals(comparator.compare(p3, p2), -1); // p3 < p2
 
             Relation[] relations = new ArrayList<>(ds.getRelations()).toArray(new Relation[0]);
 
diff --git a/test/unit/org/openstreetmap/josm/gui/TableCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/TableCellRendererTest.java
index f1cb017..4a20a9b 100644
--- a/test/unit/org/openstreetmap/josm/gui/TableCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/TableCellRendererTest.java
@@ -15,6 +15,7 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.tools.Utils;
 import org.reflections.Reflections;
 
 /**
@@ -98,7 +99,7 @@ public class TableCellRendererTest {
         } catch (SecurityException ex) {
             throw new RuntimeException(ex);
         }
-        c.setAccessible(true);
+        Utils.setObjectsAccessible(c);
         T o;
         try {
             if (needOuterClass) {
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
index 3a3fb60..bb19568 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
@@ -5,8 +5,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Observable;
-import java.util.Observer;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -23,11 +23,11 @@ import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
 
 public class PropertiesMergeModelTest {
 
-    private abstract static class TestObserver implements Observer {
+    private abstract static class TestChangeListener implements ChangeListener {
         public int numInvocations;
 
         @Override
-        public void update(Observable o, Object arg) {
+        public void stateChanged(ChangeEvent e) {
             numInvocations++;
             doTest();
         }
@@ -112,9 +112,9 @@ public class PropertiesMergeModelTest {
 
         // decide KEEP_MINE  and ensure notification via Observable
         //
-        TestObserver observerTest;
-        model.addObserver(
-                observerTest = new TestObserver() {
+        TestChangeListener observerTest;
+        model.addChangeListener(
+                observerTest = new TestChangeListener() {
                     @Override
                     public void doTest() {
                         assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
@@ -127,9 +127,9 @@ public class PropertiesMergeModelTest {
 
         // decide KEEP_THEIR and  ensure notification via Observable
         //
-        model.deleteObserver(observerTest);
-        model.addObserver(
-                observerTest = new TestObserver() {
+        model.removeChangeListener(observerTest);
+        model.addChangeListener(
+                observerTest = new TestChangeListener() {
                     @Override
                     public void doTest() {
                         assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
@@ -139,6 +139,6 @@ public class PropertiesMergeModelTest {
         model.decideCoordsConflict(MergeDecisionType.KEEP_THEIR);
         assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
         observerTest.assertNumInvocations(1);
-        model.deleteObserver(observerTest);
+        model.removeChangeListener(observerTest);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java
new file mode 100644
index 0000000..7cdfcf3
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialogTest.java
@@ -0,0 +1,131 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.ArrayList;
+
+import javax.swing.JPanel;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+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.User;
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Unit tests of {@link InspectPrimitiveDialog} class.
+ */
+public class InspectPrimitiveDialogTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Unit test of {@link InspectPrimitiveDialog#genericMonospacePanel}.
+     */
+    @Test
+    public void testGenericMonospacePanel() {
+        assertNotNull(InspectPrimitiveDialog.genericMonospacePanel(new JPanel(), ""));
+    }
+
+    /**
+     * Unit test of {@link InspectPrimitiveDialog#buildDataText}.
+     */
+    @Test
+    public void testBuildDataText() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertEquals("", InspectPrimitiveDialog.buildDataText(layer, new ArrayList<>(ds.allPrimitives())));
+        Node n = new Node(LatLon.ZERO);
+        n.setOsmId(1, 1);
+        ds.addPrimitive(n);
+        assertEquals(
+                "Node: 1\n" +
+                "  Data Set: "+Integer.toHexString(ds.hashCode())+"\n" +
+                "  Edited at: <new object>\n" +
+                "  Edited by: <new object>\n" +
+                "  Version: 1\n" +
+                "  In changeset: 0\n" +
+                "  Coordinates: 0.0, 0.0\n" +
+                "  Coordinates (projected): 0.0, -7.081154551613622E-10\n" +
+                "\n", InspectPrimitiveDialog.buildDataText(layer, new ArrayList<>(ds.allPrimitives())));
+    }
+
+    /**
+     * Unit test of {@link InspectPrimitiveDialog#buildListOfEditorsText}.
+     */
+    @Test
+    public void testBuildListOfEditorsText() {
+        DataSet ds = new DataSet();
+        assertEquals("0 users last edited the selection:\n\n", InspectPrimitiveDialog.buildListOfEditorsText(ds.allPrimitives()));
+        ds.addPrimitive(new Node(LatLon.ZERO));
+        assertEquals("0 users last edited the selection:\n\n", InspectPrimitiveDialog.buildListOfEditorsText(ds.allPrimitives()));
+        Node n = new Node(LatLon.ZERO);
+        n.setUser(User.getAnonymous());
+        ds.addPrimitive(n);
+        n = new Node(LatLon.ZERO);
+        n.setUser(User.getAnonymous());
+        ds.addPrimitive(n);
+        assertEquals(
+                "1 user last edited the selection:\n" +
+                "\n" +
+                "     2  <anonymous>\n",
+                InspectPrimitiveDialog.buildListOfEditorsText(ds.allPrimitives()));
+    }
+
+    /**
+     * Unit test of {@link InspectPrimitiveDialog#buildMapPaintText}.
+     */
+    @Test
+    public void testBuildMapPaintText() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+
+        // CHECKSTYLE.OFF: LineLength
+        String baseText =
+                "Styles Cache for \"node ‎(0.0, 0.0)\":\n" +
+                "\n" +
+                "> applying mapcss style \"JOSM default (MapCSS)\"\n" +
+                "\n" +
+                "Range:|s119.4328566955879-Infinity\n" +
+                " default: \n" +
+                "Cascade{ font-size:8.0; major-z-index:4.95; symbol-fill-color:#ff0000; symbol-shape:Keyword{square}; symbol-size:6.0; symbol-stroke-color:#ff0000; }\n" +
+                "\n" +
+                "> skipping \"Potlatch 2\" (not active)\n" +
+                "\n" +
+                "List of generated Styles:\n" +
+                " * NodeElemStyle{z_idx=[4.95/0.0/0.0]  symbol=[symbol=SQUARE size=6 stroke=java.awt.BasicStroke strokeColor=java.awt.Color[r=255,g=0,b=0] fillColor=java.awt.Color[r=255,g=0,b=0]]}\n" +
+                "\n" +
+                "\n";
+        // CHECKSTYLE.ON: LineLength
+
+        try {
+            Main.main.addLayer(layer);
+            assertEquals("", InspectPrimitiveDialog.buildMapPaintText());
+            Node n = new Node(LatLon.ZERO);
+            n.setUser(User.getAnonymous());
+            ds.addPrimitive(n);
+            ds.addSelected(n);
+            assertEquals(baseText, InspectPrimitiveDialog.buildMapPaintText().replaceAll("@(\\p{XDigit})+", ""));
+            n = new Node(LatLon.ZERO);
+            n.setUser(User.getAnonymous());
+            ds.addPrimitive(n);
+            ds.addSelected(n);
+            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);
+        }
+    }
+}
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 5ed2933..f0eea8f 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/LayerVisibilityActionTest.java
@@ -47,11 +47,13 @@ public class LayerVisibilityActionTest {
             // now check values
             action.updateValues();
             assertEquals(1.0, action.opacitySlider.getRealValue(), 1e-15);
+            assertEquals("OpacitySlider [getRealValue()=1.0]", action.opacitySlider.toString());
 
             action.opacitySlider.setRealValue(.5);
             action.updateValues();
 
             assertEquals(0.5, action.opacitySlider.getRealValue(), 1e-15);
+            assertEquals("OpacitySlider [getRealValue()=0.5]", action.opacitySlider.toString());
 
             action.setVisibleFlag(false);
             action.updateValues();
diff --git a/test/unit/org/openstreetmap/josm/gui/history/HistoryBrowserModelTest.java b/test/unit/org/openstreetmap/josm/gui/history/HistoryBrowserModelTest.java
index 1794f36..a466b2b 100644
--- a/test/unit/org/openstreetmap/josm/gui/history/HistoryBrowserModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/history/HistoryBrowserModelTest.java
@@ -5,17 +5,20 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 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.Test;
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.history.History;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryNode;
 import org.openstreetmap.josm.gui.history.HistoryBrowserModel.TagTableModel;
+import org.openstreetmap.josm.gui.history.HistoryBrowserModel.VersionTableModel;
 
 /**
  * Unit tests of {@link HistoryBrowserModel} class.
@@ -88,4 +91,86 @@ public class HistoryBrowserModelTest {
         assertNotNull(t2);
         assertNotEquals(t1, t2);
     }
+
+    /**
+     * Unit test of {@link HistoryBrowserModel#setCurrentPointInTime} and {@link HistoryBrowserModel#setReferencePointInTime} - null history.
+     */
+    @Test
+    public void testSetPointsInTimeNullHistory() {
+        HistoryBrowserModel model = new HistoryBrowserModel();
+        VersionTableModel tableModel = model.getVersionTableModel();
+        tableModel.setValueAt(false, 0, 0); // code coverage
+        tableModel.setValueAt(true, 0, 1);  // reference point
+        tableModel.setValueAt(true, 1, 2);  // current point
+        tableModel.setValueAt(true, 3, 3);  // code coverage
+    }
+
+    /**
+     * Unit test of {@link HistoryBrowserModel#setCurrentPointInTime} and {@link HistoryBrowserModel#setReferencePointInTime} - node history.
+     */
+    @Test
+    public void testSetPointsInTimeNodeHistory() {
+        SimplePrimitiveId id = new SimplePrimitiveId(2, OsmPrimitiveType.NODE);
+        new HistoryLoadTask().add(id).run();
+        History history = HistoryDataSet.getInstance().getHistory(id);
+        assertTrue(history.getNumVersions() >= 4);
+        HistoryBrowserModel model = new HistoryBrowserModel(history);
+        VersionTableModel tableModel = model.getVersionTableModel();
+        tableModel.setValueAt(false, 0, 0); // code coverage
+        tableModel.setValueAt(true, 0, 1);  // reference point
+        tableModel.setValueAt(true, 3, 2);  // current point
+        tableModel.setValueAt(true, 3, 3);  // code coverage
+        // nodes only for ways
+        assertEquals(0, model.getNodeListTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(0, model.getNodeListTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+        // members only for relations
+        assertEquals(0, model.getRelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(0, model.getRelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+    }
+
+    /**
+     * Unit test of {@link HistoryBrowserModel#setCurrentPointInTime} and {@link HistoryBrowserModel#setReferencePointInTime} - way history.
+     */
+    @Test
+    public void testSetPointsInTimeWayHistory() {
+        SimplePrimitiveId id = new SimplePrimitiveId(2, OsmPrimitiveType.WAY);
+        new HistoryLoadTask().add(id).run();
+        History history = HistoryDataSet.getInstance().getHistory(id);
+        assertTrue(history.getNumVersions() >= 2);
+        HistoryBrowserModel model = new HistoryBrowserModel(history);
+        VersionTableModel tableModel = model.getVersionTableModel();
+        tableModel.setValueAt(false, 0, 0); // code coverage
+        tableModel.setValueAt(true, 0, 1);  // reference point
+        tableModel.setValueAt(true, 3, 2);  // current point
+        tableModel.setValueAt(true, 3, 3);  // code coverage
+        // nodes only for ways
+        assertEquals(2, model.getNodeListTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(2, model.getNodeListTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+        // members only for relations
+        assertEquals(0, model.getRelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(0, model.getRelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+    }
+
+    /**
+     * Unit test of {@link HistoryBrowserModel#setCurrentPointInTime} and {@link HistoryBrowserModel#setReferencePointInTime} - relation history.
+     */
+    @Test
+    public void testSetPointsInTimeRelationHistory() {
+        SimplePrimitiveId id = new SimplePrimitiveId(2, OsmPrimitiveType.RELATION);
+        new HistoryLoadTask().add(id).run();
+        History history = HistoryDataSet.getInstance().getHistory(id);
+        assertTrue(history.getNumVersions() >= 2);
+        HistoryBrowserModel model = new HistoryBrowserModel(history);
+        VersionTableModel tableModel = model.getVersionTableModel();
+        tableModel.setValueAt(false, 0, 0); // code coverage
+        tableModel.setValueAt(true, 0, 1);  // reference point
+        tableModel.setValueAt(true, 3, 2);  // current point
+        tableModel.setValueAt(true, 3, 3);  // code coverage
+        // nodes only for ways
+        assertEquals(0, model.getNodeListTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(0, model.getNodeListTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+        // members only for relations
+        assertEquals(1, model.getRelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME).getRowCount());
+        assertEquals(1, model.getRelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME).getRowCount());
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java
new file mode 100644
index 0000000..9194941
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link ImageryLayer} class.
+ */
+public class ImageryLayerTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Unit test of {@link ImageryLayer.ColorfulImageProcessor#toString}
+     *          and {@link ImageryLayer.GammaImageProcessor#toString()}.
+     *          and {@link ImageryLayer.SharpenImageProcessor#toString()}.
+     */
+    @Test
+    public void testToString() {
+        ImageryLayer layer = TMSLayerTest.createTmsLayer();
+        assertEquals("ColorfulImageProcessor [colorfulness=1.0]", layer.collorfulnessImageProcessor.toString());
+        assertEquals("GammaImageProcessor [gamma=1.0]", layer.gammaImageProcessor.toString());
+        assertEquals("SharpenImageProcessor [sharpenLevel=1.0]", layer.sharpenImageProcessor.toString());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
new file mode 100644
index 0000000..36205de
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/layer/LayerManagerTest.java
@@ -0,0 +1,431 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.awt.Graphics2D;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.MapView;
+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.util.GuiHelper;
+import org.openstreetmap.josm.tools.Predicates;
+
+/**
+ * Test the {@link LayerManager} class.
+ * @author Michael Zangl
+ *
+ */
+public class LayerManagerTest {
+
+    protected static class AbstractTestLayer extends Layer {
+        protected AbstractTestLayer() {
+            super("Test Layer");
+        }
+
+        @Override
+        public void paint(Graphics2D g, MapView mv, Bounds bbox) {
+        }
+
+        @Override
+        public void visitBoundingBox(BoundingXYVisitor v) {
+        }
+
+        @Override
+        public void mergeFrom(Layer from) {
+        }
+
+        @Override
+        public boolean isMergable(Layer other) {
+            return false;
+        }
+
+        @Override
+        public String getToolTipText() {
+            return null;
+        }
+
+        @Override
+        public Action[] getMenuEntries() {
+            return null;
+        }
+
+        @Override
+        public Object getInfoComponent() {
+            return null;
+        }
+
+        @Override
+        public Icon getIcon() {
+            return null;
+        }
+
+        @Override
+        public LayerPositionStrategy getDefaultLayerPosition() {
+            return LayerPositionStrategy.afterLast(Predicates.<Layer>alwaysTrue());
+        }
+    }
+
+    protected static class AbstractTestLayer2 extends AbstractTestLayer {}
+
+    /**
+     * Intercepts the events for easier testing.
+     * @author Michael Zangl
+     *
+     */
+    protected class CapturingLayerChangeListener implements LayerChangeListener {
+        private LayerAddEvent layerAdded;
+        private LayerRemoveEvent layerRemoved;
+        private LayerOrderChangeEvent layerOrderChanged;
+
+        @Override
+        public void layerAdded(LayerAddEvent e) {
+            GuiHelper.assertCallFromEdt();
+            assertNull(layerAdded);
+            assertSame(layerManager, e.getSource());
+            layerAdded = e;
+        }
+
+        @Override
+        public void layerRemoving(LayerRemoveEvent e) {
+            GuiHelper.assertCallFromEdt();
+            assertNull(layerRemoved);
+            assertSame(layerManager, e.getSource());
+            layerRemoved = e;
+        }
+
+        @Override
+        public void layerOrderChanged(LayerOrderChangeEvent e) {
+            GuiHelper.assertCallFromEdt();
+            assertNull(layerOrderChanged);
+            assertSame(layerManager, e.getSource());
+            layerOrderChanged = e;
+        }
+
+    }
+
+    protected LayerManager layerManager;
+
+    /**
+     * Set up test layer manager.
+     */
+    @Before
+    public void setUp()   {
+        layerManager = new LayerManager();
+    }
+
+    /**
+     * {@link LayerManager#addLayer(Layer)}
+     */
+    @Test
+    public void testAddLayer() {
+        Layer layer1 = new AbstractTestLayer() {
+            @Override
+            public LayerPositionStrategy getDefaultLayerPosition() {
+                return LayerPositionStrategy.IN_FRONT;
+            }
+
+            @Override
+            public boolean isBackgroundLayer() {
+                return true;
+            }
+        };
+        Layer layer2 = new AbstractTestLayer() {
+            @Override
+            public LayerPositionStrategy getDefaultLayerPosition() {
+                return LayerPositionStrategy.IN_FRONT;
+            }
+        };
+        Layer layer3 = new AbstractTestLayer() {
+            @Override
+            public LayerPositionStrategy getDefaultLayerPosition() {
+                return LayerPositionStrategy.BEFORE_FIRST_BACKGROUND_LAYER;
+            }
+        };
+
+        layerManager.addLayer(layer1);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1));
+        layerManager.addLayer(layer2);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer2, layer1));
+        layerManager.addLayer(layer3);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer2, layer3, layer1));
+
+        // event
+        AbstractTestLayer layer4 = new AbstractTestLayer();
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        layerManager.addLayer(layer4);
+
+        assertSame(layer4, l.layerAdded.getAddedLayer());
+        assertNull(l.layerRemoved);
+        assertNull(l.layerOrderChanged);
+    }
+
+    /**
+     * {@link LayerManager#addLayer(Layer)}: duplicate layers
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddLayerFails() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer1);
+    }
+
+    /**
+     * {@link LayerManager#addLayer(Layer)}: illegal default layer position
+     */
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testAddLayerIllegalPosition() {
+        AbstractTestLayer layer1 = new AbstractTestLayer() {
+            @Override
+            public LayerPositionStrategy getDefaultLayerPosition() {
+                return new LayerPositionStrategy() {
+                    @Override
+                    public int getPosition(LayerManager manager) {
+                        return 42;
+                    }
+                };
+            }
+        };
+        layerManager.addLayer(layer1);
+    }
+
+    /**
+     * {@link LayerManager#removeLayer(Layer)}
+     */
+    @Test
+    public void testRemoveLayer() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
+
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        layerManager.removeLayer(layer2);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1));
+
+        assertNull(l.layerAdded);
+        assertSame(layer2, l.layerRemoved.getRemovedLayer());
+        assertNull(l.layerOrderChanged);
+    }
+
+    /**
+     * {@link LayerManager#moveLayer(Layer, int)}
+     */
+    @Test
+    public void testMoveLayer() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
+
+        layerManager.moveLayer(layer2, 0);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer2, layer1));
+
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        layerManager.moveLayer(layer2, 1);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
+
+        assertNull(l.layerAdded);
+        assertNull(l.layerRemoved);
+        assertNotNull(l.layerOrderChanged);
+
+        // This should not change anything and not fire any event
+        layerManager.moveLayer(layer2, 1);
+        assertEquals(layerManager.getLayers(), Arrays.asList(layer1, layer2));
+    }
+
+    /**
+     * {@link LayerManager#moveLayer(Layer, int)} fails for wrong index
+     */
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testMoveLayerFailsRange() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        layerManager.moveLayer(layer2, 2);
+    }
+
+    /**
+     * {@link LayerManager#moveLayer(Layer, int)} fails for wrong layer
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testMoveLayerFailsNotInList() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.moveLayer(layer2, 0);
+    }
+
+    /**
+     * {@link LayerManager#getLayers()} unmodifiable
+     */
+    @Test(expected = UnsupportedOperationException.class)
+    public void testGetLayers() {
+        // list should be immutable
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        layerManager.getLayers().remove(0);
+    }
+
+    /**
+     * {@link LayerManager#getLayersOfType(Class)}
+     */
+    @Test
+    public void testGetLayersOfType() {
+        AbstractTestLayer2 layer1 = new AbstractTestLayer2();
+        AbstractTestLayer2 layer2 = new AbstractTestLayer2();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.addLayer(layer2);
+
+        assertEquals(layerManager.getLayersOfType(AbstractTestLayer2.class), Arrays.asList(layer1, layer2));
+    }
+
+    /**
+     * {@link LayerManager#containsLayer(Layer)}
+     */
+    @Test
+    public void testContainsLayer() {
+        AbstractTestLayer layer = new AbstractTestLayer();
+        layerManager.addLayer(layer);
+        layerManager.addLayer(new AbstractTestLayer());
+
+        assertTrue(layerManager.containsLayer(layer));
+        assertFalse(layerManager.containsLayer(new AbstractTestLayer()));
+    }
+
+    /**
+     * {@link LayerManager#addLayerChangeListener(LayerChangeListener)}
+     */
+    @Test
+    public void testAddLayerChangeListener() {
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        assertNull(l.layerAdded);
+        assertNull(l.layerRemoved);
+        assertNull(l.layerOrderChanged);
+    }
+
+    /**
+     * {@link LayerManager#addLayerChangeListener(LayerChangeListener)} twice
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddLayerChangeListenerDupplicates() {
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        layerManager.addLayerChangeListener(l);
+    }
+
+    /**
+     * {@link LayerManager#addLayerChangeListener(LayerChangeListener, boolean)} fires fake add events
+     */
+    @Test
+    public void testAddLayerChangeListenerFire() {
+        final ArrayList<Layer> fired = new ArrayList<>();
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        layerManager.addLayerChangeListener(new LayerChangeListener() {
+            @Override
+            public void layerRemoving(LayerRemoveEvent e) {
+                fail();
+            }
+
+            @Override
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+                fail();
+            }
+
+            @Override
+            public void layerAdded(LayerAddEvent e) {
+                fired.add(e.getAddedLayer());
+            }
+        }, true);
+
+        assertEquals(Arrays.asList(layer1, layer2), fired);
+    }
+
+    /**
+     * {@link LayerManager#removeLayerChangeListener(LayerChangeListener)}
+     */
+    @Test
+    public void testRemoveLayerChangeListener() {
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.addLayerChangeListener(l);
+        layerManager.addLayer(new AbstractTestLayer());
+        layerManager.removeLayerChangeListener(l);
+        layerManager.addLayer(new AbstractTestLayer());
+        // threw exception when fired twice.
+        assertNotNull(l.layerAdded);
+        assertNull(l.layerRemoved);
+        assertNull(l.layerOrderChanged);
+    }
+
+    /**
+     * {@link LayerManager#removeLayerChangeListener(LayerChangeListener)} listener not in list
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveLayerChangeListenerNotAdded() {
+        CapturingLayerChangeListener l = new CapturingLayerChangeListener();
+        layerManager.removeLayerChangeListener(l);
+    }
+
+    /**
+     * {@link LayerManager#removeLayerChangeListener(LayerChangeListener, boolean)} fires fake remove events
+     */
+    @Test
+    public void testRemoveLayerChangeListenerFire() {
+        final ArrayList<Layer> fired = new ArrayList<>();
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManager.addLayer(layer1);
+        layerManager.addLayer(layer2);
+        LayerChangeListener listener = new LayerChangeListener() {
+            @Override
+            public void layerRemoving(LayerRemoveEvent e) {
+                fired.add(e.getRemovedLayer());
+            }
+
+            @Override
+            public void layerOrderChanged(LayerOrderChangeEvent e) {
+                fail();
+            }
+
+            @Override
+            public void layerAdded(LayerAddEvent e) {
+                fail();
+            }
+        };
+        layerManager.addLayerChangeListener(listener, false);
+        layerManager.removeLayerChangeListener(listener, true);
+
+        assertEquals(Arrays.asList(layer1, layer2), fired);
+    }
+
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
new file mode 100644
index 0000000..297423d
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/layer/MainLayerManagerTest.java
@@ -0,0 +1,260 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+
+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.data.osm.DataSet;
+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.Predicates;
+
+/**
+ * Tests {@link MainLayerManager}.
+ * @author Michael Zangl
+ */
+public class MainLayerManagerTest extends LayerManagerTest {
+
+    private MainLayerManager layerManagerWithActive;
+
+    private class CapturingActiveLayerChangeListener implements ActiveLayerChangeListener {
+        private ActiveLayerChangeEvent lastEvent;
+
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            assertSame(layerManager, e.getSource());
+            lastEvent = e;
+        }
+    }
+
+    private final class CapturingThreadCheckingActiveLayerChangeListener extends CapturingActiveLayerChangeListener {
+        @Override
+        public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
+            GuiHelper.assertCallFromEdt();
+            super.activeOrEditLayerChanged(e);
+        }
+    }
+
+    protected class AbstractTestOsmLayer extends OsmDataLayer {
+        public AbstractTestOsmLayer() {
+            super(new DataSet(), "OSM layer", null);
+        }
+
+        @Override
+        public LayerPositionStrategy getDefaultLayerPosition() {
+            return LayerPositionStrategy.afterLast(Predicates.<Layer>alwaysTrue());
+        }
+    }
+
+    @BeforeClass
+    public static void setUpClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Override
+    @Before
+    public void setUp() {
+        layerManager = layerManagerWithActive = new MainLayerManager();
+    }
+
+    @Test
+    public void testAddLayerSetsActiveLayer() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        AbstractTestLayer layer3 = new AbstractTestLayer();
+        assertNull(layerManagerWithActive.getActiveLayer());
+        assertNull(layerManagerWithActive.getEditLayer());
+        layerManagerWithActive.addLayer(layer1);
+        assertSame(layer1, layerManagerWithActive.getActiveLayer());
+        assertNull(layerManagerWithActive.getEditLayer());
+        layerManagerWithActive.addLayer(layer2);
+        assertSame(layer2, layerManagerWithActive.getActiveLayer());
+        assertSame(layer2, layerManagerWithActive.getEditLayer());
+        layerManagerWithActive.addLayer(layer3);
+        assertSame(layer2, layerManagerWithActive.getActiveLayer());
+        assertSame(layer2, layerManagerWithActive.getEditLayer());
+    }
+
+    @Test
+    public void testRemoveLayerUnsetsActiveLayer() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        AbstractTestLayer layer3 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+        layerManagerWithActive.addLayer(layer3);
+        layerManagerWithActive.addLayer(layer4);
+        assertSame(layer4, layerManagerWithActive.getActiveLayer());
+        assertSame(layer4, layerManagerWithActive.getEditLayer());
+        layerManagerWithActive.removeLayer(layer4);
+        //prefer osm layers
+        assertSame(layer2, layerManagerWithActive.getActiveLayer());
+        assertSame(layer2, layerManagerWithActive.getEditLayer());
+        layerManagerWithActive.removeLayer(layer2);
+        assertSame(layer1, layerManagerWithActive.getActiveLayer());
+        assertNull(layerManagerWithActive.getEditLayer());
+
+        layerManagerWithActive.removeLayer(layer1);
+        layerManagerWithActive.removeLayer(layer3);
+        assertNull(layerManagerWithActive.getActiveLayer());
+        assertNull(layerManagerWithActive.getEditLayer());
+    }
+
+    @Test
+    public void testAddActiveLayerChangeListener() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+
+        CapturingActiveLayerChangeListener listener = new CapturingThreadCheckingActiveLayerChangeListener();
+        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        assertNull(listener.lastEvent);
+
+        CapturingActiveLayerChangeListener listener2 = new CapturingActiveLayerChangeListener();
+        layerManagerWithActive.addActiveLayerChangeListener(listener2, true);
+        assertSame(listener2.lastEvent.getPreviousActiveLayer(), null);
+        assertSame(listener2.lastEvent.getPreviousEditLayer(), null);
+
+        layerManagerWithActive.setActiveLayer(layer1);
+        assertSame(listener2.lastEvent.getPreviousActiveLayer(), layer2);
+        assertSame(listener2.lastEvent.getPreviousEditLayer(), layer2);
+
+        layerManagerWithActive.setActiveLayer(layer2);
+        assertSame(listener2.lastEvent.getPreviousActiveLayer(), layer1);
+        assertSame(listener2.lastEvent.getPreviousEditLayer(), layer2);
+    }
+
+    /**
+     * Test if {@link MainLayerManager#addActiveLayerChangeListener(ActiveLayerChangeListener)} prevents listener from beeing added twice.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testAddActiveLayerChangeListenerTwice() {
+        CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
+        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+    }
+
+    /**
+     * Test if {@link MainLayerManager#removeActiveLayerChangeListener(ActiveLayerChangeListener)} works.
+     */
+    @Test
+    public void testRemoveActiveLayerChangeListener() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+
+        CapturingActiveLayerChangeListener listener = new CapturingActiveLayerChangeListener();
+        layerManagerWithActive.addActiveLayerChangeListener(listener, false);
+        layerManagerWithActive.removeActiveLayerChangeListener(listener);
+
+        layerManagerWithActive.setActiveLayer(layer2);
+        assertNull(listener.lastEvent);
+    }
+
+    /**
+     * Test if {@link MainLayerManager#removeActiveLayerChangeListener(ActiveLayerChangeListener)} checks if listener is in list.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemoveActiveLayerChangeListenerNotInList() {
+        layerManagerWithActive.removeActiveLayerChangeListener(new CapturingActiveLayerChangeListener());
+    }
+
+    /**
+     * Tests {@link MainLayerManager#setActiveLayer(Layer)} and {@link MainLayerManager#getActiveLayer()}.
+     * <p>
+     * Edit and active layer getters are also tested in {@link #testAddLayerSetsActiveLayer()}
+     */
+    @Test
+    public void testSetGetActiveLayer() {
+        AbstractTestLayer layer1 = new AbstractTestLayer();
+        AbstractTestLayer layer2 = new AbstractTestLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+
+        layerManagerWithActive.setActiveLayer(layer1);
+        assertSame(layer1, layerManagerWithActive.getActiveLayer());
+
+        layerManagerWithActive.setActiveLayer(layer2);
+        assertSame(layer2, layerManagerWithActive.getActiveLayer());
+    }
+
+    /**
+     * Tests {@link MainLayerManager#getEditDataSet()}
+     */
+    @Test
+    public void testGetEditDataSet() {
+        assertNull(layerManagerWithActive.getEditDataSet());
+        AbstractTestLayer layer0 = new AbstractTestLayer();
+        layerManagerWithActive.addLayer(layer0);
+        assertNull(layerManagerWithActive.getEditDataSet());
+
+        AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+
+        layerManagerWithActive.setActiveLayer(layer1);
+        assertSame(layer1.data, layerManagerWithActive.getEditDataSet());
+
+        layerManagerWithActive.setActiveLayer(layer2);
+        assertSame(layer2.data, layerManagerWithActive.getEditDataSet());
+    }
+
+    /**
+     * Tests {@link MainLayerManager#getVisibleLayersInZOrder()}
+     */
+    @Test
+    public void testGetVisibleLayersInZOrder() {
+        AbstractTestOsmLayer layer1 = new AbstractTestOsmLayer();
+        AbstractTestOsmLayer layer2 = new AbstractTestOsmLayer();
+        AbstractTestLayer layer3 = new AbstractTestLayer();
+        layer3.setVisible(false);
+        AbstractTestOsmLayer layer4 = new AbstractTestOsmLayer();
+        AbstractTestLayer layer5 = new AbstractTestLayer();
+        AbstractTestOsmLayer layer6 = new AbstractTestOsmLayer();
+        AbstractTestOsmLayer layer7 = new AbstractTestOsmLayer();
+        layerManagerWithActive.addLayer(layer1);
+        layerManagerWithActive.addLayer(layer2);
+        layerManagerWithActive.addLayer(layer3);
+        layerManagerWithActive.addLayer(layer4);
+        layerManagerWithActive.addLayer(layer5);
+        layerManagerWithActive.addLayer(layer6);
+        layerManagerWithActive.addLayer(layer7);
+
+        layerManagerWithActive.setActiveLayer(layer1);
+        assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+        layerManagerWithActive.setActiveLayer(layer4);
+        assertEquals(Arrays.asList(layer7, layer6, layer5, layer2, layer1, layer4),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+
+        // should not be moved ouside edit layer block
+        layerManagerWithActive.setActiveLayer(layer6);
+        assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+        layerManagerWithActive.setActiveLayer(layer7);
+        assertEquals(Arrays.asList(layer6, layer7, layer5, layer4, layer2, layer1),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+
+        // ignored
+        layerManagerWithActive.setActiveLayer(layer3);
+        assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+        layerManagerWithActive.setActiveLayer(layer5);
+        assertEquals(Arrays.asList(layer7, layer6, layer5, layer4, layer2, layer1),
+                layerManagerWithActive.getVisibleLayersInZOrder());
+
+    }
+
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/MapViewPaintableTest.java b/test/unit/org/openstreetmap/josm/gui/layer/MapViewPaintableTest.java
new file mode 100644
index 0000000..ed31144
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/layer/MapViewPaintableTest.java
@@ -0,0 +1,31 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.gui.layer.MapViewPaintable.PaintableInvalidationEvent;
+
+/**
+ * Unit tests of {@link MapViewPaintable} class.
+ */
+public class MapViewPaintableTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link MapViewPaintable.PaintableInvalidationEvent#toString}
+     */
+    @Test
+    public void testToString() {
+        assertEquals("LayerInvalidationEvent [layer=null]", new PaintableInvalidationEvent(null).toString());
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
new file mode 100644
index 0000000..97d2f8a
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
@@ -0,0 +1,262 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+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 java.io.File;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.data.Bounds;
+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.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * Unit tests of {@link OsmDataLayer} class.
+ */
+public class OsmDataLayerTest {
+
+    /**
+     * Setup tests
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#setRecentRelation} and {@link OsmDataLayer#getRecentRelations}.
+     */
+    @Test
+    public void testRecentRelation() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            int n = OsmDataLayer.PROPERTY_RECENT_RELATIONS_NUMBER.get();
+            assertTrue(n > 0);
+            for (int i = 0; i < 2*n; i++) {
+                Relation r = new Relation(i, 1);
+                ds.addPrimitive(r);
+                layer.setRecentRelation(r);
+            }
+            assertEquals(n, layer.getRecentRelations().size());
+            for (OsmPrimitive r : ds.allPrimitives()) {
+                if (r instanceof Relation) {
+                    layer.removeRecentRelation((Relation) r);
+                }
+            }
+            assertTrue(layer.getRecentRelations().isEmpty());
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getInfoComponent}.
+     */
+    @Test
+    public void testGetInfoComponent() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.getInfoComponent());
+
+        layer.setUploadDiscouraged(true);
+
+        fillDataSet(ds);
+
+        assertNotNull(layer.getInfoComponent());
+    }
+
+    private void fillDataSet(DataSet ds) {
+        Node n = new Node(1, 2);
+        n.setCoor(LatLon.ZERO);
+        n.setDeleted(true);
+        n.setVisible(false);
+        ds.addPrimitive(n);
+        n = new Node(2, 2);
+        n.setCoor(LatLon.ZERO);
+        ds.addPrimitive(n);
+
+        Way w = new Way(1, 2);
+        w.setDeleted(true);
+        w.setVisible(false);
+        ds.addPrimitive(w);
+        ds.addPrimitive(new Way(2, 2));
+
+        Relation r = new Relation(1, 2);
+        r.setDeleted(true);
+        r.setVisible(false);
+        ds.addPrimitive(r);
+        ds.addPrimitive(new Relation(2, 2));
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#addLayerStateChangeListener}.
+     */
+    @Test
+    public void testLayerStateChangeListenerNull() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        layer.addLayerStateChangeListener(null);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getIcon}.
+     */
+    @Test
+    public void testGetIcon() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.getIcon());
+        layer.setUploadDiscouraged(true);
+        assertNotNull(layer.getIcon());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#paint}.
+     */
+    @Test
+    public void testPaint() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        try {
+            Main.main.addLayer(layer);
+            assertTrue(layer.getMenuEntries().length > 0);
+            layer.paint(TestUtils.newGraphics(), Main.map.mapView, new Bounds(LatLon.ZERO));
+        } finally {
+            Main.main.removeLayer(layer);
+        }
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getToolTipText}.
+     */
+    @Test
+    public void testGetToolTipText() {
+        DataSet ds = new DataSet();
+        assertEquals("0 nodes, 0 ways, 0 relations", new OsmDataLayer(ds, "", null).getToolTipText());
+        fillDataSet(ds);
+        assertEquals("1 node, 1 way, 1 relation", new OsmDataLayer(ds, "", null).getToolTipText());
+        assertEquals("<html>1 node, 1 way, 1 relation<br>data.osm</html>", new OsmDataLayer(ds, "", new File("data.osm")).getToolTipText());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#mergeFrom}.
+     */
+    @Test
+    public void testMergeFrom() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer1 = new OsmDataLayer(ds, "", null);
+        OsmDataLayer layer2 = new OsmDataLayer(new DataSet(), "", null);
+        assertTrue(layer2.data.allPrimitives().isEmpty());
+        assertTrue(layer2.isMergable(layer1));
+        layer2.mergeFrom(layer1);
+        assertEquals(6, layer2.data.allPrimitives().size());
+        layer1.setUploadDiscouraged(true);
+        layer2.mergeFrom(layer1);
+        assertTrue(layer2.isUploadDiscouraged());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#cleanupAfterUpload}.
+     */
+    @Test
+    public void testCleanupAfterUpload() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertEquals(6, layer.data.allPrimitives().size());
+        layer.cleanupAfterUpload(ds.allPrimitives());
+        assertEquals(3, layer.data.allPrimitives().size());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#getMenuEntries}.
+     */
+    @Test
+    public void testGetMenuEntries() {
+        OsmDataLayer layer = new OsmDataLayer(new DataSet(), "", null);
+        ExpertToggleAction.getInstance().actionPerformed(null);
+        assertEquals(13, layer.getMenuEntries().length);
+        ExpertToggleAction.getInstance().actionPerformed(null);
+        assertEquals(16, layer.getMenuEntries().length);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#toGpxData}.
+     */
+    @Test
+    public void testToGpxData() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertNotNull(layer.toGpxData());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#containsPoint}.
+     */
+    @Test
+    public void testContainsPoint() {
+        DataSet ds = new DataSet();
+        fillDataSet(ds);
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertTrue(layer.containsPoint(LatLon.ZERO));
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#isChanged}.
+     */
+    @Test
+    public void testIsChanged() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertTrue(layer.isChanged());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#isModified}.
+     */
+    @Test
+    public void testIsModified() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertFalse(layer.isModified());
+        fillDataSet(ds);
+        assertTrue(layer.isModified());
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#projectionChanged}.
+     */
+    @Test
+    public void testProjectionChanged() {
+        new OsmDataLayer(new DataSet(), "", null).projectionChanged(null, null);
+    }
+
+    /**
+     * Unit test of {@link OsmDataLayer#checkSaveConditions}.
+     */
+    @Test
+    public void testCheckSaveConditions() {
+        DataSet ds = new DataSet();
+        OsmDataLayer layer = new OsmDataLayer(ds, "", null);
+        assertFalse(layer.checkSaveConditions());
+        fillDataSet(ds);
+        assertTrue(layer.checkSaveConditions());
+    }
+}
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 7026128..034e619 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackActionTest.java
@@ -42,7 +42,7 @@ public class DownloadWmsAlongTrackActionTest {
      * @throws Exception if an error occurs
      */
     @Test
-    public void testTmsLayer() throws Exception {
+    public void testTMSLayer() throws Exception {
         // 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 {
diff --git a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy
index 22fa7d7..2370589 100644
--- a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy
+++ b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.groovy
@@ -8,8 +8,8 @@ import org.openstreetmap.josm.JOSMFixture
 import org.openstreetmap.josm.Main
 import org.openstreetmap.josm.data.coor.LatLon
 import org.openstreetmap.josm.data.osm.DataSet
-import org.openstreetmap.josm.data.osm.OsmUtils
 import org.openstreetmap.josm.data.osm.Node
+import org.openstreetmap.josm.data.osm.OsmUtils
 import org.openstreetmap.josm.data.osm.Way
 import org.openstreetmap.josm.gui.mappaint.Environment
 import org.openstreetmap.josm.gui.mappaint.MultiCascade
@@ -33,8 +33,8 @@ class MapCSSParserTest {
 
     @Test
     public void testKothicStylesheets() throws Exception {
-        new MapCSSParser(new URL("http://kothic.googlecode.com/hg/src/styles/default.mapcss").openStream(), "UTF-8")
-        new MapCSSParser(new URL("http://kothic.googlecode.com/hg/src/styles/mapink.mapcss").openStream(), "UTF-8")
+        new MapCSSParser(new URL("https://raw.githubusercontent.com/kothic/kothic/master/src/styles/default.mapcss").openStream(), "UTF-8")
+        new MapCSSParser(new URL("https://raw.githubusercontent.com/kothic/kothic/master/src/styles/mapink.mapcss").openStream(), "UTF-8")
     }
 
     @Test
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 5524368..e6b7272 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
@@ -4,7 +4,6 @@ package org.openstreetmap.josm.gui.preferences.map;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -23,9 +22,10 @@ import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction.AssignmentInstruction;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
-import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
 import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Integration tests of {@link MapPaintPreference} class.
  */
@@ -35,6 +35,7 @@ public class MapPaintPreferenceTestIT {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(10*60);
 
     /**
@@ -47,11 +48,10 @@ public class MapPaintPreferenceTestIT {
 
     /**
      * Test that available map paint styles are valid.
-     * @throws IOException if any I/O error occurs
-     * @throws ParseException if the config file does not match MapCSS syntax
+     * @throws Exception in case of error
      */
     @Test
-    public void testValidityOfAvailableStyles() throws ParseException, IOException {
+    public void testValidityOfAvailableStyles() throws Exception {
         Collection<ExtendedSourceEntry> sources = new MapPaintPreference.MapPaintSourceEditor()
                 .loadAndGetAvailableSources();
         assertFalse(sources.isEmpty());
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 8600317..1324468 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
@@ -21,6 +21,8 @@ import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.xml.sax.SAXException;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Integration tests of {@link TaggingPresetPreference} class.
  */
@@ -30,6 +32,7 @@ public class TaggingPresetPreferenceTestIT {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(10*60);
 
     /**
@@ -42,9 +45,10 @@ public class TaggingPresetPreferenceTestIT {
 
     /**
      * Test that available tagging presets are valid.
+     * @throws Exception in case of error
      */
     @Test
-    public void testValidityOfAvailablePresets() {
+    public void testValidityOfAvailablePresets() throws Exception {
         Collection<ExtendedSourceEntry> sources = new TaggingPresetPreference.TaggingPresetSourceEditor()
                 .loadAndGetAvailableSources();
         assertFalse(sources.isEmpty());
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java
index c74e527..8486b5e 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java
@@ -13,7 +13,6 @@ import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.ParseResult;
-import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
 import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
 
 /**
@@ -31,11 +30,10 @@ public class ValidatorTagCheckerRulesPreferenceTestIT {
 
     /**
      * Test that available tag checker rules are valid.
-     * @throws IOException if any I/O error occurs
-     * @throws ParseException if the config file does not match MapCSS syntax
+     * @throws Exception in case of error
      */
     @Test
-    public void testValidityOfAvailableRules() throws ParseException, IOException {
+    public void testValidityOfAvailableRules() throws Exception {
         Collection<ExtendedSourceEntry> sources = new ValidatorTagCheckerRulesPreference.TagCheckerRulesSourceEditor()
                 .loadAndGetAvailableSources();
         assertFalse(sources.isEmpty());
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 2afe294..9831ffc 100644
--- a/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReaderTest.java
@@ -61,7 +61,7 @@ public class TaggingPresetReaderTest {
         final List<String> keys = Utils.transform(abc.data, new Utils.Function<TaggingPresetItem, String>() {
             @Override
             public String apply(TaggingPresetItem x) {
-                return ((Key) x).key;
+                return x instanceof Key ? ((Key) x).key : null;
             }
         });
         assertEquals("[A1, A2, A3, B1, B2, B3, C1, C2, C3]", keys.toString());
diff --git a/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy b/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
index 336afea..37937ad 100644
--- a/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/ChangesetQueryUrlParserTest.groovy
@@ -11,12 +11,12 @@ class ChangesetQueryUrlParserTest {
     final shouldFail = new GroovyTestCase().&shouldFail
 
     @Test
-    public void test_constructor() {
+    public void testConstructor() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
     }
 
     @Test
-    public void test_parse_basic() {
+    public void testParseBasic() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
 
         // OK
@@ -32,7 +32,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_uid() {
+    public void testUid() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -54,7 +54,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_display_name() {
+    public void testDisplayName() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -64,9 +64,8 @@ class ChangesetQueryUrlParserTest {
         assert q. at userName == "abcd"
     }
 
-
     @Test
-    public void test_open() {
+    public void testOpen() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -87,7 +86,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_closed() {
+    public void testClosed() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -107,9 +106,8 @@ class ChangesetQueryUrlParserTest {
         }
     }
 
-
     @Test
-    public void test_uid_and_display_name() {
+    public void testUidAndDisplayName() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -120,7 +118,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_time() {
+    public void testTime() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -150,7 +148,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_bbox() {
+    public void testBbox() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
@@ -184,7 +182,7 @@ class ChangesetQueryUrlParserTest {
     }
 
     @Test
-    public void test_changeset_ids() {
+    public void testChangesetIds() {
         ChangesetQueryUrlParser parser = new ChangesetQueryUrlParser();
         def ChangesetQuery q
 
diff --git a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
index b2d7bf9..b12bea4 100644
--- a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
+++ b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.groovy
@@ -21,9 +21,9 @@ class DiffResultProcessorTest {
         Node n = new Node(1)
         // these calls should not fail
         //
-        def DiffResultProcessor processor  = new DiffResultProcessor(null)
-        processor  = new DiffResultProcessor([])
-        processor  = new DiffResultProcessor([n])
+        new DiffResultProcessor(null)
+        new DiffResultProcessor([])
+        new DiffResultProcessor([n])
     }
 
     @Test
diff --git a/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java b/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java
index 6a8f7cb..af79c85 100644
--- a/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java
+++ b/test/unit/org/openstreetmap/josm/io/GeoJSONWriterTest.java
@@ -1,6 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io;
 
+import static org.junit.Assert.assertEquals;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
@@ -10,9 +12,9 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.junit.Assert.*;
-
+/**
+ * Unit tests of {@link GeoJSONWriter} class.
+ */
 public class GeoJSONWriterTest {
 
     /**
@@ -23,8 +25,11 @@ public class GeoJSONWriterTest {
         JOSMFixture.createUnitTestFixture().init();
     }
 
+    /**
+     * Unit test
+     */
     @Test
-    public void testPoint() throws Exception {
+    public void testPoint() {
         final Node node = new Node(new LatLon(12.3, 4.56));
         node.put("name", "foo");
         node.put("source", "code");
@@ -32,7 +37,7 @@ public class GeoJSONWriterTest {
         ds.addPrimitive(node);
         final OsmDataLayer layer = new OsmDataLayer(ds, "foo", null);
         final GeoJSONWriter writer = new GeoJSONWriter(layer, ProjectionPreference.wgs84.getProjection());
-        assertThat(writer.write().trim(), is(("" +
+        assertEquals(("" +
                 "{\n" +
                 "    'type':'FeatureCollection',\n" +
                 "    'crs':{\n" +
@@ -58,6 +63,6 @@ public class GeoJSONWriterTest {
                 "            }\n" +
                 "        }\n" +
                 "    ]\n" +
-                "}").replace("'", "\"")));
+                "}").replace("'", "\""), writer.write().trim());
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
index f33f1a7..8375559 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/RemoteControlTest.java
@@ -67,13 +67,16 @@ public class RemoteControlTest {
         // Create a trust manager that does not validate certificate chains
         TrustManager[] trustAllCerts = new TrustManager[] {
             new X509TrustManager() {
+                @Override
                 public X509Certificate[] getAcceptedIssuers() {
-                    return null;
+                    return new X509Certificate[0];
                 }
 
+                @Override
                 public void checkClientTrusted(X509Certificate[] certs, String authType) {
                 }
 
+                @Override
                 public void checkServerTrusted(X509Certificate[] certs, String authType) {
                 }
             }
@@ -140,7 +143,7 @@ public class RemoteControlTest {
                     }
                 }
                 assert responseBody.toString().contains(RequestProcessor.getUsageAsHtml());
-            } catch (IllegalAccessException | InstantiationException e) {
+            } catch (ReflectiveOperationException e) {
                 e.printStackTrace();
                 fail(e.getMessage());
             }
diff --git a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
index 5d51de5..ff23165 100644
--- a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
@@ -3,7 +3,6 @@ package org.openstreetmap.josm.io.session;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
@@ -68,7 +67,7 @@ public class SessionReaderTest {
     public void testReadOsm() throws IOException, IllegalDataException {
         for (String file : new String[]{"osm.jos", "osm.joz"}) {
             List<Layer> layers = testRead(file);
-            assertSame(layers.size(), 1);
+            assertEquals(layers.size(), 1);
             assertTrue(layers.get(0) instanceof OsmDataLayer);
             OsmDataLayer osm = (OsmDataLayer) layers.get(0);
             assertEquals(osm.getName(), "OSM layer name");
@@ -84,7 +83,7 @@ public class SessionReaderTest {
     public void testReadGpx() throws IOException, IllegalDataException {
         for (String file : new String[]{"gpx.jos", "gpx.joz", "nmea.jos"}) {
             List<Layer> layers = testRead(file);
-            assertSame(layers.size(), 1);
+            assertEquals(layers.size(), 1);
             assertTrue(layers.get(0) instanceof GpxLayer);
             GpxLayer gpx = (GpxLayer) layers.get(0);
             assertEquals(gpx.getName(), "GPX layer name");
@@ -99,7 +98,7 @@ public class SessionReaderTest {
     @Test
     public void testReadGpxAndMarker() throws IOException, IllegalDataException {
         List<Layer> layers = testRead("gpx_markers.joz");
-        assertSame(layers.size(), 2);
+        assertEquals(layers.size(), 2);
         GpxLayer gpx = null;
         MarkerLayer marker = null;
         for (Layer layer : layers) {
@@ -123,7 +122,7 @@ public class SessionReaderTest {
     @Test
     public void testReadImage() throws IOException, IllegalDataException {
         final List<Layer> layers = testRead("bing.jos");
-        assertSame(layers.size(), 1);
+        assertEquals(layers.size(), 1);
         assertTrue(layers.get(0) instanceof ImageryLayer);
         final ImageryLayer image = (ImageryLayer) layers.get(0);
         assertEquals("Bing aerial imagery", image.getName());
@@ -144,7 +143,7 @@ public class SessionReaderTest {
             }
         }
         final List<Layer> layers = testRead("notes.joz");
-        assertSame(layers.size(), 1);
+        assertEquals(layers.size(), 1);
         assertTrue(layers.get(0) instanceof NoteLayer);
         final NoteLayer layer = (NoteLayer) layers.get(0);
         assertEquals("Notes", layer.getName());
diff --git a/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java b/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java
index 4c66b2c..30c9aad 100644
--- a/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java
+++ b/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTestIT.java
@@ -19,6 +19,8 @@ import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Integration tests of {@link PluginHandler} class.
  */
@@ -28,6 +30,7 @@ public class PluginHandlerTestIT {
      * Global timeout applied to all test methods.
      */
     @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public Timeout globalTimeout = Timeout.seconds(10*60);
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index b5dcb2d..ae18936 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -85,8 +85,7 @@ public class ExifReaderTest {
      */
     @Test
     public void testReadDirection() {
-        Double direction = ExifReader.readDirection(directionSampleFile);
-        assertEquals(new Double(46.5), direction);
+        assertEquals(Double.valueOf(46.5), ExifReader.readDirection(directionSampleFile));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java b/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java
new file mode 100644
index 0000000..bf47ff5
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/PredicatesTest.java
@@ -0,0 +1,208 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Properties;
+import java.util.regex.Pattern;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+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 {
+    /**
+     * Not needed by this test, but JOSM has so many dependencies :-(
+     */
+    @BeforeClass
+    public static void setUpClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test {@link Predicates#alwaysTrue()}
+     */
+    @Test
+    public void testAlwaysTrue() {
+        Predicate<Object> alwaysTrue = Predicates.alwaysTrue();
+        assertTrue(alwaysTrue.evaluate(new Object()));
+        assertTrue(alwaysTrue.evaluate(Boolean.TRUE));
+    }
+
+    /**
+     * Test {@link Predicates#alwaysFalse()}
+     */
+    @Test
+    public void testAlwaysFalse() {
+        Predicate<Object> alwaysFalse = Predicates.alwaysFalse();
+        assertFalse(alwaysFalse.evaluate(new Object()));
+        assertFalse(alwaysFalse.evaluate(Boolean.TRUE));
+    }
+
+    /**
+     * Test {@link Predicates#not(Predicate)}
+     */
+    @Test
+    public void testNot() {
+        Predicate<Boolean> not = Predicates.not(new Predicate<Boolean>() {
+            @Override
+            public boolean evaluate(Boolean object) {
+                return object;
+            }
+        });
+        assertFalse(not.evaluate(Boolean.TRUE));
+        assertTrue(not.evaluate(Boolean.FALSE));
+    }
+
+    /**
+     * Test {@link Predicates#equalTo(Object)}
+     */
+    @Test
+    public void testEqualTo() {
+        Integer testObject = Integer.valueOf(1);
+        Predicate<Integer> equalTo = Predicates.equalTo(testObject);
+        assertTrue(equalTo.evaluate(testObject));
+        assertTrue(equalTo.evaluate(Integer.valueOf(1)));
+
+        assertFalse(equalTo.evaluate(Integer.valueOf(2)));
+        assertFalse(equalTo.evaluate(null));
+    }
+
+    /**
+     * Test {@link Predicates#isOfClass(Class)}
+     */
+    @Test
+    public void testIsOfClass() {
+        Predicate<Object> isOfClass = Predicates.<Object>isOfClass(Hashtable.class);
+        assertFalse(isOfClass.evaluate(null));
+        assertFalse(isOfClass.evaluate(new Object()));
+        assertFalse(isOfClass.evaluate(new Properties()));
+        assertTrue(isOfClass.evaluate(new Hashtable<>()));
+    }
+
+    /**
+     * Test {@link Predicates#isOfClass(Class)}
+     */
+    @Test
+    public void testIsInstanceOf() {
+        Predicate<Object> isInstanceOf = Predicates.<Object>isInstanceOf(Hashtable.class);
+        assertFalse(isInstanceOf.evaluate(null));
+        assertFalse(isInstanceOf.evaluate(new Object()));
+        assertTrue(isInstanceOf.evaluate(new Properties()));
+        assertTrue(isInstanceOf.evaluate(new Hashtable<>()));
+    }
+
+    /**
+     * Test {@link Predicates#stringMatchesPattern(java.util.regex.Pattern)}
+     */
+    @Test
+    public void testStringMatchesPattern() {
+        Pattern p = Pattern.compile("ab?c");
+        Predicate<String> stringMatchesPattern = Predicates.stringMatchesPattern(p);
+        assertFalse(stringMatchesPattern.evaluate(""));
+        assertFalse(stringMatchesPattern.evaluate("a"));
+        assertFalse(stringMatchesPattern.evaluate("xabcx"));
+        assertTrue(stringMatchesPattern.evaluate("ac"));
+        assertTrue(stringMatchesPattern.evaluate("abc"));
+    }
+
+    /**
+     * Test {@link Predicates#stringContainsPattern(java.util.regex.Pattern)}
+     */
+    @Test
+    public void testStringContainsPattern() {
+        Pattern p = Pattern.compile("ab?c");
+        Predicate<String> stringContainsPattern = Predicates.stringContainsPattern(p);
+        assertFalse(stringContainsPattern.evaluate(""));
+        assertFalse(stringContainsPattern.evaluate("a"));
+        assertTrue(stringContainsPattern.evaluate("xabcx"));
+        assertTrue(stringContainsPattern.evaluate("ac"));
+        assertTrue(stringContainsPattern.evaluate("abc"));
+        assertTrue(stringContainsPattern.evaluate("xx\nabc\nx"));
+    }
+
+    /**
+     * Test {@link Predicates#stringContains(String)}
+     */
+    @Test
+    public void testStringContains() {
+        Predicate<String> stringContains = Predicates.stringContains("abc");
+        assertFalse(stringContains.evaluate(""));
+        assertFalse(stringContains.evaluate("a"));
+        assertTrue(stringContains.evaluate("xabcx"));
+        assertFalse(stringContains.evaluate("ac"));
+        assertTrue(stringContains.evaluate("abc"));
+    }
+
+    /**
+     * Test {@link Predicates#hasTag(String, String...)}
+     */
+    @Test
+    public void testHasTag() {
+        Predicate<OsmPrimitive> hasTag = Predicates.hasTag("key", "value");
+        Node n1 = new Node();
+        assertFalse(hasTag.evaluate(n1));
+        n1.put("Key", "x");
+        assertFalse(hasTag.evaluate(n1));
+        n1.put("key", "x");
+        assertFalse(hasTag.evaluate(n1));
+        n1.put("key", "value");
+        assertTrue(hasTag.evaluate(n1));
+    }
+
+    /**
+     * Test {@link Predicates#hasKey(String)}
+     */
+    @Test
+    public void testHasKey() {
+        Predicate<OsmPrimitive> hasKey = Predicates.hasKey("key");
+        Node n1 = new Node();
+        assertFalse(hasKey.evaluate(n1));
+        n1.put("Key", "x");
+        assertFalse(hasKey.evaluate(n1));
+        n1.put("key", "x");
+        assertTrue(hasKey.evaluate(n1));
+    }
+
+    /**
+     * Test {@link Predicates#inCollection(java.util.Collection)}
+     */
+    @Test
+    public void testInCollection() {
+        List<String> list = Arrays.asList("a", "b", "c");
+        Predicate<String> inCollection = Predicates.inCollection(list);
+        assertTrue(inCollection.evaluate("a"));
+        assertTrue(inCollection.evaluate("c"));
+        assertFalse(inCollection.evaluate("d"));
+        assertFalse(inCollection.evaluate(null));
+
+        List<String> list2 = Arrays.asList("a", "b", "c", null);
+        Predicate<String> inCollection2 = Predicates.inCollection(list2);
+        assertTrue(inCollection2.evaluate("a"));
+        assertTrue(inCollection2.evaluate("c"));
+        assertFalse(inCollection2.evaluate("d"));
+        assertTrue(inCollection2.evaluate(null));
+    }
+
+    /**
+     * Test {@link Predicates#isNull()}
+     */
+    @Test
+    public void testIsNull() {
+        Predicate<Object> isNull = Predicates.isNull();
+        assertTrue(isNull.evaluate(null));
+        assertFalse(isNull.evaluate(Integer.valueOf(2)));
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/WindowGeometryTest.java b/test/unit/org/openstreetmap/josm/tools/WindowGeometryTest.java
new file mode 100644
index 0000000..b0c11b8
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/WindowGeometryTest.java
@@ -0,0 +1,151 @@
+// 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 java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.WindowGeometry.WindowGeometryException;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+import nl.jqno.equalsverifier.Warning;
+
+/**
+ * Unit tests of {@link WindowGeometry} class.
+ */
+public class WindowGeometryTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test of {@link WindowGeometry#centerInWindow} method.
+     */
+    @Test
+    public void testCenterInWindow() {
+        assertNotNull(WindowGeometry.centerInWindow(null, null));
+        assertNotNull(WindowGeometry.centerInWindow(new JPanel(), null));
+    }
+
+    /**
+     * Test of {@link WindowGeometry#centerOnScreen} method.
+     */
+    @Test
+    public void testCenterOnScreen() {
+        Dimension dim = new Dimension(200, 100);
+        assertEquals(new WindowGeometry(new Point(0, 0), dim), WindowGeometry.centerOnScreen(dim));
+        assertEquals(new WindowGeometry(new Point(300, 250), dim), WindowGeometry.centerOnScreen(dim, null));
+    }
+
+    /**
+     * Test of {@link WindowGeometry.WindowGeometryException} class.
+     * @throws WindowGeometryException always
+     */
+    @Test(expected = WindowGeometryException.class)
+    public void testWindowGeometryException1() throws WindowGeometryException {
+        Main.pref.put("test", null);
+        new WindowGeometry("test");
+    }
+
+    /**
+     * Test of {@link WindowGeometry.WindowGeometryException} class.
+     * @throws WindowGeometryException always
+     */
+    @Test(expected = WindowGeometryException.class)
+    public void testWindowGeometryException2() throws WindowGeometryException {
+        Main.pref.put("test", "");
+        new WindowGeometry("test");
+    }
+
+    /**
+     * Test of {@link WindowGeometry.WindowGeometryException} class.
+     * @throws WindowGeometryException always
+     */
+    @Test(expected = WindowGeometryException.class)
+    public void testWindowGeometryException3() throws WindowGeometryException {
+        Main.pref.put("test", "x=not_a_number");
+        new WindowGeometry("test");
+    }
+
+    /**
+     * Test of {@link WindowGeometry.WindowGeometryException} class.
+     * @throws WindowGeometryException always
+     */
+    @Test(expected = WindowGeometryException.class)
+    public void testWindowGeometryException4() throws WindowGeometryException {
+        Main.pref.put("test", "wrong_pattern");
+        new WindowGeometry("test");
+    }
+
+    /**
+     * Test of {@link WindowGeometry.WindowGeometryException} class.
+     * @throws WindowGeometryException never
+     */
+    @Test
+    public void testWindowGeometryException5() throws WindowGeometryException {
+        Main.pref.put("test", "x=15,y=55,width=200,height=100");
+        assertNotNull(new WindowGeometry("test"));
+    }
+
+    /**
+     * Test of {@link WindowGeometry#isBugInMaximumWindowBounds} method.
+     */
+    @Test
+    public void testIsBugInMaximumWindowBounds() {
+        assertFalse(WindowGeometry.isBugInMaximumWindowBounds(new Rectangle(10, 10)));
+        assertTrue(WindowGeometry.isBugInMaximumWindowBounds(new Rectangle(10, 0)));
+        assertTrue(WindowGeometry.isBugInMaximumWindowBounds(new Rectangle(0, 10)));
+    }
+
+    /**
+     * Test of {@link WindowGeometry#getVirtualScreenBounds} method.
+     */
+    @Test
+    public void testGetVirtualScreenBounds() {
+        assertNotNull(WindowGeometry.getVirtualScreenBounds());
+    }
+
+    /**
+     * Test of {@link WindowGeometry#getMaxDimensionOnScreen} method.
+     */
+    @Test
+    public void testGetMaxDimensionOnScreen() {
+        assertNotNull(WindowGeometry.getMaxDimensionOnScreen(new JLabel()));
+    }
+
+    /**
+     * Test of {@link WindowGeometry#toString} method.
+     */
+    @Test
+    public void testToString() {
+        assertEquals("WindowGeometry{topLeft=java.awt.Point[x=0,y=0],extent=java.awt.Dimension[width=0,height=0]}",
+                new WindowGeometry(new Rectangle()).toString());
+    }
+
+    /**
+     * Unit test of methods {@link WindowGeometry#equals} and {@link WindowGeometry#hashCode}.
+     */
+    @Test
+    public void equalsContract() {
+        EqualsVerifier.forClass(WindowGeometry.class).usingGetClass()
+            .suppress(Warning.NONFINAL_FIELDS)
+            .verify();
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
new file mode 100644
index 0000000..ab9cf76
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools.bugreport;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+/**
+ * Tests the bug report class.
+ * @author Michael Zangl
+ * @since 10285
+ */
+public class BugReportTest {
+
+    /**
+     * Test {@link BugReport#getCallingMethod(int)}
+     */
+    @Test
+    public void testGetCallingMethod() {
+        assertEquals("BugReportTest#testGetCallingMethod", BugReport.getCallingMethod(1));
+        assertEquals("BugReportTest#testGetCallingMethod", testGetCallingMethod2());
+    }
+
+    private String testGetCallingMethod2() {
+        return BugReport.getCallingMethod(2);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/ReportedExceptionTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/ReportedExceptionTest.java
new file mode 100644
index 0000000..dd67453
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/ReportedExceptionTest.java
@@ -0,0 +1,112 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools.bugreport;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+/**
+ * Tests the {@link ReportedException} class.
+ * @author Michael Zangl
+ * @since 10285
+ */
+public class ReportedExceptionTest {
+    private static final class CauseOverwriteException extends RuntimeException {
+        private Throwable myCause;
+
+        private CauseOverwriteException(String message) {
+            super(message);
+        }
+
+        @Override
+        public synchronized Throwable getCause() {
+            return myCause;
+        }
+    }
+
+    /**
+     * Tests that {@link ReportedException#put(String, Object)} handles null values
+     */
+    @Test
+    public void testPutDoesHandleNull() {
+        ReportedException e = new ReportedException(new RuntimeException());
+        e.startSection("test");
+        Object[] a = new Object[] {
+                new Object(), null };
+        e.put("testObject", null);
+        e.put("testArray", a);
+        e.put("testList", Arrays.asList(a));
+    }
+
+    /**
+     * Tests that {@link ReportedException#put(String, Object)} handles exceptions during toString fine.
+     */
+    @Test
+    public void testPutDoesNotThrow() {
+        ReportedException e = new ReportedException(new RuntimeException());
+        e.startSection("test");
+        Object o = new Object() {
+            @Override
+            public String toString() {
+                throw new IllegalArgumentException("");
+            }
+        };
+        Object[] a = new Object[] {
+                new Object(), o };
+        e.put("testObject", o);
+        e.put("testArray", a);
+        e.put("testList", Arrays.asList(a));
+    }
+
+    /**
+     * Tests that {@link ReportedException#isSame(ReportedException)} works as expected.
+     */
+    @Test
+    public void testIsSame() {
+        // Do not break this line! All exceptions need to be created in the same line.
+        // CHECKSTYLE.OFF: LineLength
+        // @formatter:off
+        ReportedException[] testExceptions = new ReportedException[] {
+                /* 0 */ genException1(), /* 1, same as 0 */ genException1(), /* 2 */ genException2("x"), /* 3, same as 2 */ genException2("x"), /* 4, has different message than 2 */ genException2("y"), /* 5, has different stack trace than 2 */ genException3("x"), /* 6 */ genException4(true), /* 7, has different cause than 6 */ genException4(false), /* 8, has a cycle and should not crash */ genExceptionCycle() };
+        // @formatter:on
+        // CHECKSTYLE.ON: LineLength
+
+        for (int i = 0; i < testExceptions.length; i++) {
+            for (int j = 0; j < testExceptions.length; j++) {
+                boolean is01 = (i == 0 || i == 1) && (j == 0 || j == 1);
+                boolean is23 = (i == 2 || i == 3) && (j == 2 || j == 3);
+                assertEquals(i + ", " + j, is01 || is23 || i == j, testExceptions[i].isSame(testExceptions[j]));
+            }
+        }
+    }
+
+    private static ReportedException genException1() {
+        RuntimeException e = new RuntimeException();
+        return BugReport.intercept(e);
+    }
+
+    private static ReportedException genException2(String message) {
+        RuntimeException e = new RuntimeException(message);
+        RuntimeException e2 = new RuntimeException(e);
+        return BugReport.intercept(e2);
+    }
+
+    private static ReportedException genException3(String message) {
+        return genException2(message);
+    }
+
+    private static ReportedException genException4(boolean addCause) {
+        RuntimeException e = new RuntimeException("x");
+        RuntimeException e2 = new RuntimeException("x", addCause ? e : null);
+        return BugReport.intercept(e2);
+    }
+
+    private static ReportedException genExceptionCycle() {
+        CauseOverwriteException e = new CauseOverwriteException("x");
+        RuntimeException e2 = new RuntimeException("x", e);
+        e.myCause = e2;
+        return BugReport.intercept(e2);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
index 6384e6f..43f6fff 100644
--- a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
@@ -14,6 +14,8 @@ import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.tools.UncheckedParseException;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 /**
  * Unit tests of {@link DateUtils} class.
  */
@@ -191,6 +193,7 @@ public class DateUtilsTest {
      * Unit test to reach 100% code coverage.
      */
     @Test
+    @SuppressFBWarnings(value = "ISC_INSTANTIATE_STATIC_CLASS")
     public void testCoverage() {
         assertNotNull(new DateUtils());
     }

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